এক্সএলএ টুলিং

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 বা StableHLO ইনপুটের জন্য, পাইপলাইনের একটি নির্দিষ্ট পর্যায়ে (সেটি HLO, অপটিমাইজড HLO, TritonIR ​​বা LLVM যাই হোক না কেন) কোনো বিশেষ হার্ডওয়্যারের এক্সপ্যানশনটি পাওয়া প্রায়শই দরকারি হয়।

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 নির্দিষ্ট করা থাকলে কোনো নির্দিষ্ট ফাইলে)।

জিপিইউ-এর জন্য ডিভাইসবিহীন কম্পাইলেশন

ডিভাইসলেস কম্পাইলেশনের জন্য জিপিইউ-তে অ্যাক্সেসের প্রয়োজন হয় না। ডিভাইসলেস কম্পাইলেশন এমন পর্যায়গুলির জন্য কমান্ড লাইনে ( --xla_gpu_target_config_filename ) জিপিইউ স্পেক নির্দিষ্ট করার একটি উপায় প্রদান করে যেখানে জিপিইউ-তে অ্যাক্সেসের প্রয়োজন হয়, যার ফলে জিপিইউ ডিভাইসের প্রয়োজনীয়তা দূর হয়।

উদাহরণ: জিপিইউ ডিভাইসে অ্যাক্সেস ছাড়া পিটিএক্স আউটপুট:

hlo-opt  --platform=CUDA --stage=llvm  --xla_gpu_target_config_filename=/xla/tools/hlo_opt/gpu_specs/a100_pcie_80.txtpb input.hlo

জনপ্রিয় জিপিইউ-গুলোর স্পেসিফিকেশন কম্পাইলারের সাথেই দেওয়া থাকে, এবং প্রদত্ত ফাইলটি হলো 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"

জিপিইউ-এর আরও স্পেসিফিকেশন /xla/tools/hlo_opt/gpu_specs এ পাওয়া যাবে।

অটোটিউনিং

কখনও কখনও কম্পাইলেশন --stage এর উপর ভিত্তি করে কম্পাইলেশনে অটোটিউনিং অন্তর্ভুক্ত থাকতে পারে। ডিভাইসবিহীন কম্পাইলেশন কাজ করার জন্য, ব্যবহারকারীকে হয়...
--xla_gpu_autotune_level=0 দিয়ে অটোটিউনিং নিষ্ক্রিয় করুন
অথবা
--xla_gpu_dump_autotune_results_to=<filename> --xla_gpu_load_autotune_results_from=<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

নতুন এইচএলও পাস উন্নয়নে সহায়তা করুন

  1. প্রথমে আপনার পাসটি লিখুন।
  2. নতুন পাসটি hlo-opt টুল পাস রেজিস্ট্রি-তে নিবন্ধন করুন।

    RegisterPass<FooPass>(FooPassInputOptions)
    

    পাসের প্রকারভেদের উপর ভিত্তি করে নিবন্ধনের জন্য নিম্নলিখিত স্থানগুলির মধ্যে একটি বেছে নিন:
    opt_lib.cc হার্ডওয়্যার-নিরপেক্ষ পাস।
    cpu_opt.cc সিপিইউ-এর জন্য নির্দিষ্ট পাসসমূহ।
    gpu_opt.cc জিপিইউ-এর জন্য নির্দিষ্ট পাসসমূহ।
    compiled_opt.cc সিপিইউ, জিপিইউ, এক্সপিইউ-এর জন্য সাধারণ পাসসমূহ।
    বিল্ড ডিপেন্ডেন্সি যোগ করতে ভুলবেন না।

    আপনার PR-এর অংশ হিসেবে পাস রেজিস্ট্রেশন অন্তর্ভুক্ত করুন ( উদাহরণ ), যাতে পাসটি সকল hlo-opt ব্যবহারকারীর জন্য ব্যবহারযোগ্য হয়।

  3. hlo-opt টুলটি পুনরায় তৈরি করুন, --list-passes অপশন ব্যবহার করে সফল পাস রেজিস্ট্রেশন যাচাই করুন এবং তারপরে পাসটি চালানোর জন্য --passes অপশনটি ব্যবহার করুন।

    $ hlo-opt --passes=foo-pass input.hlo
    
  4. পাসের জন্য ইউনিট টেস্ট লিখতে চান? আরও বিস্তারিত জানতে 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>

[ isolate_hlo ] সমস্যাযুক্ত HLO নির্দেশাবলী আলাদা করুন

যদি আপনার কাছে একটি বড় HLO ডাম্প থাকে এবং সন্দেহ হয় যে HLO মডিউলের মধ্যে কোনো নির্দিষ্ট নির্দেশনা বা অংশ ক্র্যাশটির কারণ, তাহলে আপনি isolate_hlo টুলটি ব্যবহার করতে পারেন।

এই টুলটি একটি একক HLO নির্দেশনা (এবং এর প্রয়োজনীয় কনটেক্সট) একটি নতুন, ছোট HLO মডিউলে নিষ্কাশন করে। এটি একটি ন্যূনতম, কম্পাইলার-স্তরের রিপ্রডিউসার তৈরির জন্য অত্যন্ত সহায়ক।

  • ডকুমেন্টেশন ও উৎস: isolate_hlo টুলটি OpenXLA রিপোজিটরিতে পাওয়া যায়। XLA সোর্স কোডের xla/tools ডিরেক্টরিটি দেখুন।
  • ব্যবহারবিধি: XLA সোর্স ট্রি থেকে টুলটি তৈরি করুন। এটি সাধারণত একটি ইনপুট HLO মডিউল ফাইল (টেক্সট বা প্রোটো), নিষ্কাশনযোগ্য নির্দেশনার নাম এবং আউটপুট ফাইলের পাথ গ্রহণ করে।

    # Example usage after building XLA:
    # ./build/tools/isolate_hlo --input=module.hlo --instruction_name=fusion.123 \
    #   --output=isolated_fusion.123.hlo --input_format=txt --output_format=long_txt
    

    নির্দিষ্ট ফ্ল্যাগ এবং ফরম্যাট অপশনগুলোর জন্য টুলটির হেল্প মেসেজ ( --help ) দেখুন।