XLA Tooling

گردش کار توسعه XLA معمولاً حول HLO IR متمرکز است که نشان دهنده محاسبات عملکردی جدا شده به کامپایلر است. XLA با چندین ابزار خط فرمان (که در زیر توضیح داده شده است) ارائه می شود که HLO را مصرف می کنند و یا آن را اجرا می کنند یا یک مرحله کامپایل میانی را ارائه می دهند. استفاده از چنین ابزارهایی برای چرخه تکرار سریع compile->modify->run بسیار ارزشمند است، زیرا HLO هم قابل مشاهده و هم قابل هک است و تغییر و اجرای مکرر آن اغلب سریع‌ترین راه برای درک و اصلاح عملکرد یا رفتار XLA است.

ساده ترین راه برای به دست آوردن HLO برای برنامه ای که با XLA کامپایل می شود، معمولاً استفاده از متغیر محیطی 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 از پیش بهینه‌سازی عمل می‌کند و به‌طور پیش‌فرض مجموعه، اجرا و مقایسه با اجرای مفسر مرجع را جمع‌آوری می‌کند. به عنوان مثال، فراخوانی معمول برای اجرای یک فایل ورودی computation.hlo بر روی یک پردازنده گرافیکی NVIDIA و بررسی صحت آن عبارت است از:

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 ] ماژول های HLO را با پشتیبانی SPMD اجرا کنید

# Note: Binary name is `hlo_runner_main`.
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- [flags] <filename>

Multihost HLO runner یک ابزار بسیار مشابه است، با این نکته که از SPMD پشتیبانی می کند، از جمله ارتباطات متقابل میزبان. برای جزئیات بیشتر به Multi-Host HLO Runner مراجعه کنید.

چندین ماژول HLO را با پشتیبانی SPMD اجرا کنید

مشابه 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-stags قابل مشاهده است:

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

که Dump را در stdout (یا در یک فایل معین اگر -o مشخص شده بود) چاپ می کند.

کامپایل بدون دستگاه برای GPU

کامپایل بدون دستگاه نیازی به دسترسی به GPU ندارد. Deviceless Compilation راهی برای تعیین مشخصات GPU در خط فرمان ( --xla_gpu_target_config_filename ) برای مراحلی که دسترسی به GPU مورد نیاز است، ارائه می‌کند و نیاز به دستگاه GPU را از بین می‌برد.

مثال: خروجی PTX بدون دسترسی به دستگاه gpu:

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"

مشخصات بیشتر 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 Pass

# 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

کاربران می توانند خط لوله سفارشی خود را با تعیین بیش از یک گزینه pass to --passes ایجاد کنند.

hlo-opt --passes=pass1,pass2,pass3 input.hlo

به توسعه پاس جدید HLO کمک کنید

  1. ابتدا پاس خود را بنویسید.
  2. پاس جدید را در رجیستری hlo-opt tool pass ثبت کنید.

    RegisterPass<FooPass>(FooPassInputOptions)
    

    بر اساس نوع پاس، یکی از مکان های زیر را برای ثبت نام انتخاب کنید:
    opt_lib.cc پاس های مستقل از سخت افزار.
    cpu_opt.cc پاس های خاص CPU.
    gpu_opt.cc پاس های خاص GPU.
    compiled_opt.cc برای CPU، GPU، XPU مشترک است.
    فراموش نکنید که وابستگی ساخت را اضافه کنید.

    ثبت گذرنامه را به عنوان بخشی از روابط عمومی ( مثال ) خود وارد کنید تا این مجوز برای همه کاربران 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 با چندین ابزار خط فرمان (که در زیر توضیح داده شده است) ارائه می شود که HLO را مصرف می کنند و یا آن را اجرا می کنند یا یک مرحله کامپایل میانی را ارائه می دهند. استفاده از چنین ابزارهایی برای چرخه تکرار سریع compile->modify->run بسیار ارزشمند است، زیرا HLO هم قابل مشاهده و هم قابل هک است و تغییر و اجرای مکرر آن اغلب سریع‌ترین راه برای درک و اصلاح عملکرد یا رفتار XLA است.

ساده ترین راه برای به دست آوردن HLO برای برنامه ای که با XLA کامپایل می شود، معمولاً استفاده از متغیر محیطی 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 از پیش بهینه‌سازی عمل می‌کند و به‌طور پیش‌فرض مجموعه، اجرا و مقایسه با اجرای مفسر مرجع را جمع‌آوری می‌کند. به عنوان مثال، فراخوانی معمول برای اجرای یک فایل ورودی computation.hlo بر روی یک پردازنده گرافیکی NVIDIA و بررسی صحت آن عبارت است از:

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 ] ماژول های HLO را با پشتیبانی SPMD اجرا کنید

# Note: Binary name is `hlo_runner_main`.
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- [flags] <filename>

Multihost HLO runner یک ابزار بسیار مشابه است، با این نکته که از SPMD پشتیبانی می کند، از جمله ارتباطات متقابل میزبان. برای جزئیات بیشتر به Multi-Host HLO Runner مراجعه کنید.

چندین ماژول HLO را با پشتیبانی SPMD اجرا کنید

مشابه 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-stags قابل مشاهده است:

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

که Dump را در stdout (یا در یک فایل معین اگر -o مشخص شده بود) چاپ می کند.

کامپایل بدون دستگاه برای GPU

کامپایل بدون دستگاه نیازی به دسترسی به GPU ندارد. Deviceless Compilation راهی برای تعیین مشخصات GPU در خط فرمان ( --xla_gpu_target_config_filename ) برای مراحلی که دسترسی به GPU مورد نیاز است، ارائه می‌کند و نیاز به دستگاه GPU را از بین می‌برد.

مثال: خروجی PTX بدون دسترسی به دستگاه gpu:

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"

مشخصات بیشتر 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 Pass

# 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

کاربران می توانند خط لوله سفارشی خود را با تعیین بیش از یک گزینه pass to --passes ایجاد کنند.

hlo-opt --passes=pass1,pass2,pass3 input.hlo

به توسعه پاس جدید HLO کمک کنید

  1. ابتدا پاس خود را بنویسید.
  2. پاس جدید را در رجیستری hlo-opt tool pass ثبت کنید.

    RegisterPass<FooPass>(FooPassInputOptions)
    

    بر اساس نوع پاس، یکی از مکان های زیر را برای ثبت نام انتخاب کنید:
    opt_lib.cc پاس های مستقل از سخت افزار.
    cpu_opt.cc پاس های خاص CPU.
    gpu_opt.cc پاس های خاص GPU.
    compiled_opt.cc برای CPU، GPU، XPU مشترک است.
    فراموش نکنید که وابستگی ساخت را اضافه کنید.

    ثبت گذرنامه را به عنوان بخشی از روابط عمومی ( مثال ) خود وارد کنید تا این مجوز برای همه کاربران 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 با چندین ابزار خط فرمان (که در زیر توضیح داده شده است) ارائه می شود که HLO را مصرف می کنند و یا آن را اجرا می کنند یا یک مرحله کامپایل میانی را ارائه می دهند. استفاده از چنین ابزارهایی برای چرخه تکرار سریع compile->modify->run بسیار ارزشمند است، زیرا HLO هم قابل مشاهده و هم قابل هک است و تغییر و اجرای مکرر آن اغلب سریع‌ترین راه برای درک و اصلاح عملکرد یا رفتار XLA است.

ساده ترین راه برای به دست آوردن HLO برای برنامه ای که با XLA کامپایل می شود، معمولاً استفاده از متغیر محیطی 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 از پیش بهینه‌سازی عمل می‌کند و به‌طور پیش‌فرض مجموعه، اجرا و مقایسه با اجرای مفسر مرجع را جمع‌آوری می‌کند. به عنوان مثال، فراخوانی معمول برای اجرای یک فایل ورودی computation.hlo بر روی یک پردازنده گرافیکی NVIDIA و بررسی صحت آن عبارت است از:

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 ] ماژول های HLO را با پشتیبانی SPMD اجرا کنید

# Note: Binary name is `hlo_runner_main`.
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- [flags] <filename>

Multihost HLO runner یک ابزار بسیار مشابه است، با این نکته که از SPMD پشتیبانی می کند، از جمله ارتباطات متقابل میزبان. برای جزئیات بیشتر به Multi-Host HLO Runner مراجعه کنید.

چندین ماژول HLO را با پشتیبانی SPMD اجرا کنید

شبیه 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-stags قابل مشاهده است:

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

که Dump را در stdout (یا در یک فایل معین اگر -o مشخص شده بود) چاپ می کند.

کامپایل بدون دستگاه برای GPU

کامپایل بدون دستگاه نیازی به دسترسی به GPU ندارد. Deviceless Compilation راهی برای تعیین مشخصات GPU در خط فرمان ( --xla_gpu_target_config_filename ) برای مراحلی که دسترسی به GPU مورد نیاز است، ارائه می‌کند و نیاز به دستگاه GPU را از بین می‌برد.

مثال: خروجی PTX بدون دسترسی به دستگاه gpu:

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"

مشخصات بیشتر 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 Pass

# 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

کاربران می توانند خط لوله سفارشی خود را با تعیین بیش از یک گزینه pass to --passes ایجاد کنند.

hlo-opt --passes=pass1,pass2,pass3 input.hlo

به توسعه پاس جدید HLO کمک کنید

  1. ابتدا پاس خود را بنویسید.
  2. پاس جدید را در رجیستری hlo-opt tool pass ثبت کنید.

    RegisterPass<FooPass>(FooPassInputOptions)
    

    بر اساس نوع پاس، یکی از مکان های زیر را برای ثبت نام انتخاب کنید:
    opt_lib.cc پاس های مستقل از سخت افزار.
    cpu_opt.cc پاس های خاص CPU.
    gpu_opt.cc پاس های خاص GPU.
    compiled_opt.cc برای CPU، GPU، XPU مشترک است.
    فراموش نکنید که وابستگی ساخت را اضافه کنید.

    ثبت گذرنامه را به عنوان بخشی از روابط عمومی ( مثال ) خود وارد کنید تا این مجوز برای همه کاربران 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 با چندین ابزار خط فرمان (که در زیر توضیح داده شده است) ارائه می شود که HLO را مصرف می کنند و یا آن را اجرا می کنند یا یک مرحله کامپایل میانی را ارائه می دهند. استفاده از چنین ابزارهایی برای چرخه تکرار سریع compile->modify->run بسیار ارزشمند است، زیرا HLO هم قابل مشاهده و هم قابل هک است و تغییر و اجرای مکرر آن اغلب سریع‌ترین راه برای درک و اصلاح عملکرد یا رفتار XLA است.

ساده ترین راه برای به دست آوردن HLO برای برنامه ای که با XLA کامپایل می شود، معمولاً استفاده از متغیر محیطی 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 از پیش بهینه‌سازی عمل می‌کند و به‌طور پیش‌فرض مجموعه، اجرا و مقایسه با اجرای مفسر مرجع را جمع‌آوری می‌کند. به عنوان مثال، فراخوانی معمول برای اجرای یک فایل ورودی computation.hlo بر روی یک پردازنده گرافیکی NVIDIA و بررسی صحت آن عبارت است از:

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 ] ماژول های HLO را با پشتیبانی SPMD اجرا کنید

# Note: Binary name is `hlo_runner_main`.
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- [flags] <filename>

Multihost HLO runner یک ابزار بسیار مشابه است، با این نکته که از SPMD پشتیبانی می کند، از جمله ارتباطات متقابل میزبان. برای جزئیات بیشتر به Multi-Host HLO Runner مراجعه کنید.

چندین ماژول HLO را با پشتیبانی SPMD اجرا کنید

مشابه 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-stags قابل مشاهده است:

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

که Dump را در stdout (یا در یک فایل معین اگر -o مشخص شده بود) چاپ می کند.

کامپایل بدون دستگاه برای GPU

کامپایل بدون دستگاه نیازی به دسترسی به GPU ندارد. Deviceless Compilation راهی برای تعیین مشخصات GPU در خط فرمان ( --xla_gpu_target_config_filename ) برای مراحلی که دسترسی به GPU مورد نیاز است، ارائه می‌کند و نیاز به دستگاه GPU را از بین می‌برد.

مثال: خروجی PTX بدون دسترسی به دستگاه gpu:

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"

مشخصات بیشتر 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 Pass

# 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

کاربران می توانند خط لوله سفارشی خود را با تعیین بیش از یک گزینه pass to --passes ایجاد کنند.

hlo-opt --passes=pass1,pass2,pass3 input.hlo

به توسعه پاس جدید HLO کمک کنید

  1. ابتدا پاس خود را بنویسید.
  2. پاس جدید را در رجیستری hlo-opt tool pass ثبت کنید.

    RegisterPass<FooPass>(FooPassInputOptions)
    

    بر اساس نوع پاس، یکی از مکان های زیر را برای ثبت نام انتخاب کنید:
    opt_lib.cc پاس های مستقل از سخت افزار.
    cpu_opt.cc پاس های خاص CPU.
    gpu_opt.cc پاس های خاص GPU.
    compiled_opt.cc برای CPU، GPU، XPU مشترک است.
    فراموش نکنید که وابستگی ساخت را اضافه کنید.

    ثبت گذرنامه را به عنوان بخشی از روابط عمومی ( مثال ) خود وارد کنید تا این مجوز برای همه کاربران 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