گردش کار توسعه 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 کمک کنید
- ابتدا پاس خود را بنویسید.
پاس جدید را در رجیستری
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
در دسترس باشد.ابزار
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
گردش کار توسعه 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 کمک کنید
- ابتدا پاس خود را بنویسید.
پاس جدید را در رجیستری
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
در دسترس باشد.ابزار
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
گردش کار توسعه 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 کمک کنید
- ابتدا پاس خود را بنویسید.
پاس جدید را در رجیستری
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
در دسترس باشد.ابزار
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
گردش کار توسعه 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 کمک کنید
- ابتدا پاس خود را بنویسید.
پاس جدید را در رجیستری
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
در دسترس باشد.ابزار
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