XLA ডেভেলপমেন্ট ওয়ার্কফ্লো সাধারণত HLO IR-এর উপর কেন্দ্রীভূত হয়, যা কম্পাইলারকে প্রদত্ত বিচ্ছিন্ন কার্যকরী গণনার প্রতিনিধিত্ব করে। XLA-তে একাধিক কমান্ড লাইন টুল (নীচে বর্ণিত) থাকে যা HLO ব্যবহার করে এবং হয় এটি চালায়, অথবা একটি মধ্যবর্তী সংকলন পর্যায় প্রদান করে। দ্রুত compile->modify->run পুনরাবৃত্তি চক্রের জন্য এই ধরনের টুল ব্যবহার অমূল্য, কারণ HLO দৃশ্যমান এবং হ্যাকযোগ্য উভয়ই, এবং পুনরাবৃত্তিমূলকভাবে এটি পরিবর্তন করা এবং চালানো প্রায়শই XLA কর্মক্ষমতা বা আচরণ বোঝার এবং ঠিক করার দ্রুততম উপায়।
XLA দিয়ে কম্পাইল করা প্রোগ্রামের জন্য HLO পাওয়ার সবচেয়ে সহজ উপায় হল সাধারণত XLA_FLAGS এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করা:
$ XLA_FLAGS=--xla_dump_to=/tmp/myfolder ./myprogram-entry-point
যা নির্দিষ্ট ফোল্ডারে সমস্ত পূর্ব-অপ্টিমাইজেশন HLO ফাইল সংরক্ষণ করে, সাথে আরও অনেক দরকারী জিনিসপত্রও।
[ run_hlo_module ] HLO মডিউল চালান
bazel run //xla/tools:run_hlo_module -- [flags] <filename>
run_hlo_module টুলটি প্রি-অপ্টিমাইজেশন HLO-তে কাজ করে এবং ডিফল্টভাবে রেফারেন্স ইন্টারপ্রেটার বাস্তবায়নের সাথে সংকলন, রানিং এবং তুলনা একত্রিত করে। উদাহরণস্বরূপ, একটি NVIDIA GPU-তে একটি ইনপুট ফাইল computation.hlo চালানোর জন্য এবং এটির সঠিকতা পরীক্ষা করার জন্য সাধারণ আহ্বান হল:
run_hlo_module --platform=CUDA --reference_platform=Interpreter computation.hlo
একাধিক HLO মডিউল চালান
run_hlo_module এর জন্য একাধিক HLO মডিউল সহ ইনভোকেশন সমর্থিত। একটি ডিরেক্টরি থেকে সমস্ত hlo মডিউল চালানোর জন্য:
bazel run //xla/tools:run_hlo_module -- [flags] /dump/*before_optimizations*
[ multihost_hlo_runner ] SPMD সাপোর্ট সহ HLO মডিউল চালান
# Note: Binary name is `hlo_runner_main`.
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- [flags] <filename>
মাল্টিহোস্ট এইচএলও রানারও একই রকম একটি টুল, তবে সতর্কতা হিসেবে বলা হচ্ছে এটি ক্রস হোস্ট কমিউনিকেশন সহ SPMD সমর্থন করে। বিস্তারিত জানার জন্য মাল্টি-হোস্ট এইচএলও রানার দেখুন।
SPMD সাপোর্ট সহ একাধিক HLO মডিউল চালান
run_hlo_module এর মতো, multihost_hlo_runner একাধিক মডিউল সহ ইনভোকেশন সমর্থন করে।
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- [flags] /dump/*before_optimizations*
[ hlo-opt ] HLO মডিউল কম্পাইল করুন
bazel run //xla/tools:hlo-opt -- --platform=[gpu|cpu|...] [more flags] <filename>
ডিবাগিং বা কম্পাইলারের কার্যকারিতা বোঝার সময়, পাইপলাইনের একটি নির্দিষ্ট বিন্দুতে (সেটি HLO, অপ্টিমাইজড HLO, TritonIR বা LLVM হোক) একটি নির্দিষ্ট HLO বা StableHLO ইনপুটের জন্য একটি নির্দিষ্ট হার্ডওয়্যারের জন্য এক্সপেনশন পাওয়া প্রায়শই কার্যকর।
hlo-opt একাধিক আউটপুট স্টেজ সাপোর্ট করে: PTX, অপ্টিমাইজেশনের পরে HLO, অপ্টিমাইজেশনের আগে LLVM IR, অথবা TritonIR। সমর্থিত স্টেজের সঠিক সেট প্ল্যাটফর্মের উপর নির্ভর করে (যেমন PTX NVIDIA-নির্দিষ্ট), এবং --list-stages কমান্ড ব্যবহার করে দেখা যেতে পারে:
hlo-opt --platform=CUDA --list-stages
buffer-assignment
hlo
hlo-backend
html
llvm
llvm-after-optimizations
llvm-before-optimizations
ptx
একটি পর্যায় নির্বাচন করার পর, ব্যবহারকারী একটি নির্দিষ্ট প্ল্যাটফর্মের জন্য একটি নির্দিষ্ট প্রবাহে রূপান্তরের ফলাফল লিখতে পারেন:
hlo-opt --platform=cpu --stage=hlo input.hlo
যা ডাম্পটিকে stdout-এ (অথবা -o নির্দিষ্ট করা থাকলে একটি প্রদত্ত ফাইলে) প্রিন্ট করবে।
GPU-এর জন্য ডিভাইসলেস সংকলন
ডিভাইসলেস কম্পাইলেশনের জন্য GPU অ্যাক্সেসের প্রয়োজন হয় না। ডিভাইসলেস কম্পাইলেশন কমান্ড লাইনে ( --xla_gpu_target_config_filename ) GPU স্পেক নির্দিষ্ট করার একটি উপায় প্রদান করে যেখানে GPU অ্যাক্সেস প্রয়োজন, GPU ডিভাইসের প্রয়োজনীয়তা দূর করে।
উদাহরণ: জিপিইউ ডিভাইসে অ্যাক্সেস ছাড়াই পিটিএক্স আউটপুট:
hlo-opt --platform=CUDA --stage=llvm --xla_gpu_target_config_filename=/xla/tools/hlo_opt/gpu_specs/a100_pcie_80.txtpb input.hlo
জনপ্রিয় GPU-এর স্পেসিফিকেশন কম্পাইলারের সাথে পাঠানো হয়, এবং প্রদত্ত ফাইলটি device_description.proto এর স্ট্রিং সিরিয়ালাইজেশন:
gpu_device_info {
cuda_compute_capability {
major: 8
minor: 0
}
threads_per_block_limit: 1024
threads_per_warp: 32
shared_memory_per_block: 127152
shared_memory_per_core: 65536
threads_per_core_limit: 2048
core_count: 6192
fpus_per_core: 64
block_dim_limit_x: 2147483647
block_dim_limit_y: 65535
block_dim_limit_z: 65535
memory_bandwidth: 2039000000000
l2_cache_size: 4194304
clock_rate_ghz: 1.1105
device_memory_size: 79050250240
}
platform_name: "CUDA"
আরও GPU স্পেসিফিকেশন /xla/tools/hlo_opt/gpu_specs এ পাওয়া যাবে।
অটোটিউনিং
কখনও কখনও সংকলনের উপর ভিত্তি করে অটোটিউনিং জড়িত থাকতে পারে --stage । ডিভাইসবিহীন সংকলনটি কাজ করার জন্য, ব্যবহারকারীর হয় প্রয়োজন
--xla_gpu_autotune_level=0 দিয়ে অটোটিউনিং অক্ষম করুন
অথবা
--xla_gpu_load_autotune_results_from=<filename> ( --xla_gpu_dump_autotune_results_to=<filename> দিয়ে প্রাপ্ত) দিয়ে একটি পূর্ব-বিদ্যমান অটোটিউনিং ফলাফল লোড করুন ।
hlo-opt --platform=CUDA --stage=llvm --xla_gpu_target_config_filename=gpu_specs/a100_pcie_80.txtpb --xla_gpu_load_autotune_results_from=results.textpb input.hlo
autotune ফাইলটি autotune_results.proto এর টেক্সট সিরিয়ালাইজেশন, যার উদাহরণ দেখতে এরকম:
version: 3
results {
device: "CUDA: 8.0, Cores: 108, GPU clock: 1.41 GHz, Memory bandwidth: 1555 GB/s, L2 cache: 40 MB"
hlo: "{\n tmp_0 = f16[1,16,17,3]{3,2,1,0} parameter(0)\n tmp_1 = f16[16,51]{1,0} bitcast(f16[1,16,17,3]{3,2,1,0} tmp_0)\n tmp_2 = s8[16,17,3]{2,1,0} parameter(1)\n tmp_3 = s8[51,16]{0,1} bitcast(s8[16,17,3]{2,1,0} tmp_2)\n tmp_4 = f16[51,16]{0,1} convert(s8[51,16]{0,1} tmp_3)\n tmp_5 = f16[16,16]{1,0} dot(f16[16,51]{1,0} tmp_1, f16[51,16]{0,1} tmp_4), lhs_contracting_dims={1}, rhs_contracting_dims={0}\n ROOT tmp_6 = f16[1,16,16]{2,1,0} bitcast(f16[16,16]{1,0} tmp_5)\n}"
result {
run_time {
nanos: 31744
}
triton {
block_m: 32
block_n: 32
block_k: 32
split_k: 1
num_stages: 1
num_warps: 4
}
}
}
অটোটিউনিং ডাটাবেসটি XLA_FLAGS=--xla_gpu_dump_autotune_results_to=<myfile.pbtxt> ব্যবহার করে সিরিয়ালাইজ করা যেতে পারে।
[ hlo-opt ] HLO পাস ডেভেলপমেন্ট এবং ডিবাগিং
# If you are working with hardware independent passes from the
# `xla/hlo/transforms/` directory, prefer light-weight version
# of the `hlo-opt` tool with fewer dependencies:
bazel run //xla/hlo/tools:hlo-opt -- [flags] <filename>
# Otherwise, for hardware independent and CPU, GPU passes use
# the same binary from "Compile HLO Modules" section above:
bazel run //xla/tools:hlo-opt -- [flags] <filename>
hlo-opt টুলটি প্রদত্ত প্ল্যাটফর্ম সংকলন পর্যায়ের উপর নির্ভর না করেই একজন ব্যক্তির পাস সম্পাদনের অনুমতি দেয়। এই আইসোলেশনটি দ্রুত ইনপুট hlo মডিউলে পাস চালানো এবং ব্যর্থতার মূল কারণ চিহ্নিত করতে সহায়তা করে।
hlo-opt --passes=schedule-aware-collective-cse input.hlo
hlo-opt টুলটি DebugOptions XLA_FLAGS সমর্থন করে।
hlo-opt --passes=schedule-aware-collective-cse
--xla_gpu_experimental_collective_cse_distance_threshold=20 input.hlo
পাস নেম স্ট্রিং পেতে --list-passes বিকল্পটি ব্যবহার করুন।
hlo-opt --list-passes
ব্যবহারকারীরা একাধিক পাস টু --passes বিকল্প নির্দিষ্ট করে তাদের নিজস্ব কাস্টম পাইপলাইন তৈরি করতে পারেন।
hlo-opt --passes=pass1,pass2,pass3 input.hlo
নতুন এইচএলও পাস ডেভেলপমেন্টে সহায়তা করুন
- প্রথমে, আপনার পাস লিখুন।
নতুন পাসটি
hlo-optটুল পাস রেজিস্ট্রিতে নিবন্ধন করুন।RegisterPass<FooPass>(FooPassInputOptions)পাসের ধরণের উপর ভিত্তি করে, নিবন্ধনের জন্য নিম্নলিখিত স্থানগুলির মধ্যে একটি বেছে নিন:
opt_lib.ccহার্ডওয়্যার-স্বাধীন পাস।
cpu_opt.ccCPU নির্দিষ্ট পাস।
gpu_opt.ccGPU নির্দিষ্ট পাস।
compiled_opt.ccCPU, GPU, XPU-তে সাধারণ পাস।
বিল্ড নির্ভরতা যোগ করতে ভুলবেন না।আপনার PR ( উদাহরণস্বরূপ ) এর অংশ হিসেবে পাস নিবন্ধন অন্তর্ভুক্ত করুন যাতে পাসটি সমস্ত
hlo-optব্যবহারকারীদের জন্য ব্যবহারের জন্য উপলব্ধ থাকে।hlo-optটুলটি পুনর্নির্মাণ করুন,--list-passesবিকল্প ব্যবহার করে সফল পাস নিবন্ধন যাচাই করুন এবং তারপর পাস চালানোর জন্য--passesবিকল্পটি ব্যবহার করুন।$ hlo-opt --passes=foo-pass input.hloলেখার ইউনিট পরীক্ষায় পাস করার জন্য? আরও বিস্তারিত জানার জন্য https://openxla.org/xla/test_hlo_passes দেখুন।
পাস রানটাইম পরিমাপ
বড় মডেলের ক্ষেত্রে, সম্পূর্ণ সংকলন রান করতে কয়েক মিনিট সময় লাগতে পারে, যার ফলে সূক্ষ্ম পারফরম্যান্স রিগ্রেশন সনাক্ত করা কঠিন হয়ে পড়ে। বিপরীতে, hlo-opt ব্যবহার করে পৃথক পাস রানগুলি সুনির্দিষ্ট পারফরম্যান্স পরিমাপ এবং নতুন কোড পরিবর্তনের কারণে কার্যকরী সময়ের সামান্য বৃদ্ধিও সহজে সনাক্ত করার অনুমতি দেয়।
time hlo-opt --passes=reduce-window-rewriter,scatter_simplifier
--xla_reduce_window_rewrite_base_length=128 input.hlo
[ hlo-opt ] HLO মডিউল ফর্ম্যাট রূপান্তর করুন
# Use the light weight version of the `hlo-opt` tool.
bazel run //xla/hlo/tools:hlo-opt -- [flags] <filename>
HLO Text -> HLO Proto রূপান্তর করুন
hlo-opt --emit-proto input.hlo
HLO Proto বা HLO Proto Binary -> HLO Text রূপান্তর করুন
hlo-opt input.pbtxt or input.pb
[ ptx-opt ] কম্পাইলার LLVM মডিউল PTX-এ নেমে গেছে
টুলটি LLVMIR অপ্টিমাইজেশন পাইপলাইন চালাবে এবং তারপর CompileToPtx কল করবে।
bazel run //xla/hlo/tools/ptx-opt -- --arch=9.0 <filename>
টুলটি প্রতিটি পথের পরে LLVMIR ডাম্প করতে পারে।
bazel run //xla/hlo/tools/ptx-opt -- --arch=9.0 --xla_dump_to=<path> --xla_gpu_dump_llvmir <filename>