XLA টুলিং ব্যবহার করে

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

XLA এর সাথে কম্পাইল করা প্রোগ্রামের জন্য HLO পাওয়ার সবচেয়ে সহজ উপায় হল সাধারণত XLA_FLAGS এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করা:

$ XLA_FLAGS=--xla_dump_to=/tmp/myfolder ./myprogram-entry-point

যা নির্দিষ্ট ফোল্ডারে অপ্টিমাইজেশানের আগে সমস্ত HLO ফাইল সঞ্চয় করে, অন্যান্য অনেক দরকারী শিল্পকর্মের সাথে।

চলমান HLO স্নিপেট: run_hlo_module

টুল run_hlo_module প্রাক-অপ্টিমাইজেশান HLO, এবং ডিফল্টভাবে বান্ডেল সংকলন, চলমান এবং রেফারেন্স ইন্টারপ্রেটার বাস্তবায়নের সাথে কাজ করে। উদাহরণস্বরূপ, একটি NVIDIA GPU-তে একটি ইনপুট ফাইল computation.hlo চালানোর জন্য এবং এটির সঠিকতা পরীক্ষা করার জন্য সাধারণ আহ্বান হল:

$ run_hlo_module --platform=CUDA --reference_platform=Interpreter computation.hlo

সমস্ত সরঞ্জামের মতো, --help বিকল্পগুলির সম্পূর্ণ তালিকা পেতে ব্যবহার করা যেতে পারে।

SPMD সমর্থন সহ HLO স্নিপেট চালানো: multihost_hlo_runner

মাল্টিহোস্ট এইচএলও রানার একটি খুব অনুরূপ সরঞ্জাম, সতর্কতা সহ যে এটি ক্রস হোস্ট যোগাযোগ সহ SPMD সমর্থন করে। বিস্তারিত জানার জন্য মাল্টি-হোস্ট এইচএলও রানার দেখুন।

মাল্টি-এইচএলও রিপ্লে

একাধিক মডিউল সহ আমন্ত্রণ run_hlo_module এবং hlo_runner_main উভয়ের জন্যই সমর্থিত, যা প্রায়ই একটি ডাম্প ডিরেক্টরিতে সমস্ত মডিউল পুনরায় চালানোর জন্য সুবিধাজনক:

$ hlo_runner_main /dump/*before_optimizations*

HLO সংকলনের চলমান পাস/পর্যায়: hlo-opt

কম্পাইলারের কাজগুলি ডিবাগ করার সময় বা বোঝার সময়, প্রদত্ত (স্থিতিশীল) এইচএলও ইনপুটের জন্য পাইপলাইনের একটি নির্দিষ্ট বিন্দুতে (সেটি HLO, অপ্টিমাইজ করা HLO, TritonIR ​​বা LLVM) একটি নির্দিষ্ট হার্ডওয়্যারের জন্য সম্প্রসারণ পেতে প্রায়শই দরকারী। .

hlo-opt একাধিক আউটপুট পর্যায় সমর্থন করে: PTX হোক, HLO আফটার অপ্টিমাইজেশন, LLVM IR অপ্টিমাইজেশনের আগে, অথবা TritonIR। সমর্থিত পর্যায়গুলির সঠিক সেটটি প্ল্যাটফর্মের উপর নির্ভর করে (যেমন PTX NVIDIA-নির্দিষ্ট), এবং --list-stages কমান্ড ব্যবহার করে দেখা যেতে পারে:

$ hlo-opt --platform=CUDA --list-stages
hlo
llvm
ptx

একটি পর্যায় নির্বাচন করার পরে, ব্যবহারকারী একটি প্রদত্ত প্ল্যাটফর্মের জন্য একটি প্রদত্ত স্ট্রিমে রূপান্তরের ফলাফল লিখতে পারেন:

$ hlo-opt myinput.hlo --platform=CUDA --stage=llvm

যা stdout এ ডাম্প প্রিন্ট করবে (অথবা একটি প্রদত্ত ফাইলে যদি -o নির্দিষ্ট করা থাকে)।

ডিভাইসহীন ব্যবহার

বেশিরভাগ কম্পাইলেশনের জন্য একটি GPU-তে অ্যাক্সেসের প্রয়োজন হয় না, এবং কমান্ড লাইনে একটি GPU স্পেক উল্লেখ করে আমরা যেমন একটি অ্যাক্সিলারেটরের অ্যাক্সেস ছাড়াই PTX আউটপুট পেতে পারি:

$ hlo-opt  --platform=CUDA --stage=llvm  --xla_gpu_target_config_filename=(pwd)/tools/data/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"

অটোটিউনিং প্রয়োজন হলে ডিভাইসবিহীন সংকলন সমস্যায় পড়তে পারে। ভাগ্যক্রমে, আমরা কমান্ড লাইনে সেগুলিও সরবরাহ করতে পারি:

$ 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_t=<myfile.pbtxt> ব্যবহার করে সিরিয়াল করা যেতে পারে

একটি একক কম্পাইলার পাস চলমান

XLA_FLAGS থেকে ফ্ল্যাগগুলিও সমর্থিত, তাই টুলটি একটি একক পাস চালানোর পরীক্ষা করতে ব্যবহার করা যেতে পারে:

$ hlo-opt --platform=CUDA --stage=hlo --xla-hlo-enable-passes-only=algebraic_simplifer input.hlo