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

XLA ডেভেলপমেন্ট ওয়ার্কফ্লো সাধারণত HLO IR এর চারপাশে কেন্দ্রীভূত হয়, যা কম্পাইলারকে দেওয়া বিচ্ছিন্ন কার্যকরী গণনার প্রতিনিধিত্ব করে। XLA একাধিক কমান্ড লাইন টুলের সাথে আসে (নীচে বর্ণিত) যা এইচএলও ব্যবহার করে এবং হয় এটি চালায়, অথবা একটি মধ্যবর্তী সংকলন পর্যায় প্রদান করে। এই ধরনের টুল ব্যবহার করা একটি দ্রুত compile->modify->run পুনরাবৃত্তি চক্রের জন্য অমূল্য, কারণ এইচএলও দৃশ্যমান এবং হ্যাকযোগ্য উভয়ই, এবং এটিকে বারবার পরিবর্তন করা এবং চালানো প্রায়শই একটি 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 মডিউল চালান

একাধিক HLO মডিউল সহ আহ্বান run_hlo_module জন্য সমর্থিত। একটি ডিরেক্টরি থেকে সমস্ত 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 নির্দিষ্ট করা থাকে)।

GPU-এর জন্য ডিভাইসহীন সংকলন

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

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

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_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 পাস উন্নয়নে সহায়তা করুন

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

    RegisterPass<FooPass>(FooPassInputOptions)
    

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

    আপনার 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
,

XLA ডেভেলপমেন্ট ওয়ার্কফ্লো সাধারণত HLO IR এর চারপাশে কেন্দ্রীভূত হয়, যা কম্পাইলারকে দেওয়া বিচ্ছিন্ন কার্যকরী গণনার প্রতিনিধিত্ব করে। XLA একাধিক কমান্ড লাইন টুলের সাথে আসে (নীচে বর্ণিত) যা এইচএলও ব্যবহার করে এবং হয় এটি চালায়, অথবা একটি মধ্যবর্তী সংকলন পর্যায় প্রদান করে। এই ধরনের টুল ব্যবহার করা একটি দ্রুত compile->modify->run পুনরাবৃত্তি চক্রের জন্য অমূল্য, কারণ এইচএলও দৃশ্যমান এবং হ্যাকযোগ্য উভয়ই, এবং এটিকে বারবার পরিবর্তন করা এবং চালানো প্রায়শই একটি 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 মডিউল চালান

একাধিক HLO মডিউল সহ আহ্বান run_hlo_module জন্য সমর্থিত। একটি ডিরেক্টরি থেকে সমস্ত 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 নির্দিষ্ট করা থাকে)।

GPU-এর জন্য ডিভাইসহীন সংকলন

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

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

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_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 পাস উন্নয়নে সহায়তা করুন

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

    RegisterPass<FooPass>(FooPassInputOptions)
    

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

    আপনার 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
,

XLA ডেভেলপমেন্ট ওয়ার্কফ্লো সাধারণত HLO IR এর চারপাশে কেন্দ্রীভূত হয়, যা কম্পাইলারকে দেওয়া বিচ্ছিন্ন কার্যকরী গণনার প্রতিনিধিত্ব করে। XLA একাধিক কমান্ড লাইন টুলের সাথে আসে (নীচে বর্ণিত) যা এইচএলও ব্যবহার করে এবং হয় এটি চালায়, অথবা একটি মধ্যবর্তী সংকলন পর্যায় প্রদান করে। এই ধরনের টুল ব্যবহার করা একটি দ্রুত compile->modify->run পুনরাবৃত্তি চক্রের জন্য অমূল্য, কারণ এইচএলও দৃশ্যমান এবং হ্যাকযোগ্য উভয়ই, এবং এটিকে বারবার পরিবর্তন করা এবং চালানো প্রায়শই একটি 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 মডিউল চালান

একাধিক HLO মডিউল সহ আহ্বান run_hlo_module জন্য সমর্থিত। একটি ডিরেক্টরি থেকে সমস্ত 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 নির্দিষ্ট করা থাকে)।

GPU-এর জন্য ডিভাইসহীন সংকলন

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

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

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_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 পাস উন্নয়নে সহায়তা করুন

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

    RegisterPass<FooPass>(FooPassInputOptions)
    

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

    আপনার 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
,

XLA ডেভেলপমেন্ট ওয়ার্কফ্লো সাধারণত HLO IR এর চারপাশে কেন্দ্রীভূত হয়, যা কম্পাইলারকে দেওয়া বিচ্ছিন্ন কার্যকরী গণনার প্রতিনিধিত্ব করে। XLA একাধিক কমান্ড লাইন টুলের সাথে আসে (নীচে বর্ণিত) যা এইচএলও ব্যবহার করে এবং হয় এটি চালায়, অথবা একটি মধ্যবর্তী সংকলন পর্যায় প্রদান করে। এই ধরনের টুল ব্যবহার করা একটি দ্রুত compile->modify->run পুনরাবৃত্তি চক্রের জন্য অমূল্য, কারণ এইচএলও দৃশ্যমান এবং হ্যাকযোগ্য উভয়ই, এবং এটিকে বারবার পরিবর্তন করা এবং চালানো প্রায়শই একটি 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 মডিউল চালান

একাধিক HLO মডিউল সহ আহ্বান run_hlo_module জন্য সমর্থিত। একটি ডিরেক্টরি থেকে সমস্ত 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 নির্দিষ্ট করা থাকে)।

GPU-এর জন্য ডিভাইসহীন সংকলন

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

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

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_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 পাস উন্নয়নে সহায়তা করুন

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

    RegisterPass<FooPass>(FooPassInputOptions)
    

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

    আপনার 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