یک HLO dump یک نمایش متنی از ماژول های HLO در مراحل مختلف محاسبات است. برای اشکالزدایی مفید است و اغلب لازم است آن را در گزارشهای باگ بگنجانید. این معمولاً یک فایل متنی قابل خواندن توسط انسان است که دستورالعمل های HLO و ویژگی های آنها را فهرست می کند. گاهی اوقات، ماژول های HLO به صورت زیر ریخته می شوند:
- HloProto: فایلهای بافر پروتکل، که قالبی ساختارمندتر و قابل خواندن توسط ماشین هستند.
- HloSnapshot : ماژول HLO به اضافه ورودی های آن. برای پخش مجدد HLO ها، گاهی اوقات به ورودی های واقعی به جای داده های تصادفی نیاز به یک محاسبات معین دارید.
شما می توانید از پرچم های XLA برای مشخص کردن و دریافت dump استفاده کنید. در بیشتر موارد، می توانید آن را با یک متغیر محیطی تنظیم کنید. JAX همچنین یک روش برنامه ریزی شده برای چاپ HLO dump ارائه می دهد.
اجرای محلی
استفاده از متغیرهای محیطی
میتوانید متغیر محیطی XLA_FLAGS
را با پرچمهای لازم برای دریافت dumps تنظیم کنید. این برای JAX، TensorFlow و PyTorch/XLA کار می کند.
برای تخلیه ماژول های HLO و سایر اطلاعات اشکال زدایی به یک دایرکتوری خاص، برنامه خود را با پرچم --xla_dump_to
اجرا کنید:
XLA_FLAGS="--xla_dump_to=DIRECTORY_PATH"
به عنوان مثال، می توانید از /tmp
یا /tmp/xladump
به عنوان مسیر استفاده کنید.
بهطور پیشفرض، این ماژولهای HLO را به عنوان متن، در ابتدا و انتهای خط لوله بهینهسازی تخلیه میکند.
همچنین می توانید به صراحت فرمت را مشخص کنید:
- ارسال متن
XLA_FLAGS="--xla_dump_hlo_as_text --xla_dump_to=DIRECTORY_PATH"
- پروتوهای HLO
XLA_FLAGS="--xla_dump_hlo_as_proto --xla_dump_to=DIRECTORY_PATH"
- عکس های فوری HLO
XLA_FLAGS="--xla_dump_hlo_snapshots --xla_dump_to=DIRECTORY_PATH"
- رندر نمودار با سرور graphviz (فقط برای نمودارهای کوچک خوب کار می کند)
XLA_FLAGS="--xla_dump_hlo_as_url --xla_dump_to=DIRECTORY_PATH"
- ارائه نمودار به فایل HTML (فقط برای نمودارهای کوچک به خوبی کار می کند)
XLA_FLAGS="--xla_dump_hlo_as_html --xla_dump_to=DIRECTORY_PATH"
برای نمودارهای بزرگتر، می توانید از interactive_graphviz
برای تجسم بخشی از نمودار استفاده کنید.
گذرهای میانی خاص را تخلیه کنید
علاوه بر HLOهای استاندارد از پیش بهینه شده / نهایی بهینه شده، همچنین می توانید وضعیت HLO ها را پس از عبور کامپایلر خاص تخلیه کنید.
XLA_FLAGS="--xla_dump_hlo_pass_re=regex --xla_dump_to=DIRECTORY_PATH"
ماژول های HLO برای پاس هایی که نام آنها با عبارت منظم (regex) مطابقت دارد، ریخته می شود. به عنوان مثال، می توانید HLO های حاصل از پاس های مربوط به پارتیشن بندی SPMD را با موارد زیر مشاهده کنید:
XLA_FLAGS="--xla_dump_to=DIRECTORY_PATH --xla_dump_hlo_pass_re=spmd|propagation"
برای پاک کردن نتیجه پس از هر پاس XLA (این باعث ایجاد تعداد زیادی فایل می شود)، می توانید تنظیم کنید:
XLA_FLAGS="--xla_dump_to=DIRECTORY_PATH --xla_dump_hlo_pass_re=.*"
گزینه های خاص JAX
به صورت برنامه نویسی در JAX
بهجای ارسال پرچمها یا متغیرهای محیطی، میتوانید با استفاده از APIهای lower
JAX و compile
HLO را به صورت برنامهنویسی حذف کنید.
به صورت محلی HLO اصلی پایینآمده بهینهنشده را با:
jax.jit(f).lower(*args).as_text('hlo')
برای ریختن به فایل ها در طول پاس های کامپایل HLO، مشخص کنید:
compilation_args = {
'xla_dump_to': DIRECTORY_PATH,
'xla_dump_hlo_pass_re': 'spmd|propagation', # or some other pass filter
...
}
jax.jit(f).lower(*args).compile(compilation_args)
jaxprs را تخلیه کنید
jaxpr
s نمایندگی میانی JAX برای ردیابی برنامه است. برای حذف این، متغیرهای محیطی را تنظیم کنید:
JAX_DUMP_IR_TO="DIRECTORY_PATH" JAX_DUMP_IR_MODES=jaxpr
در مستندات JAX درباره صادرات و سریالسازی محاسبات مرحلهای: اشکالزدایی بیشتر بیاموزید.
گوگل کولب
متغیرهای محیطی
در اولین سلول اجرا شده نوت بوک (چون متغیرهای محیطی و پرچمهای خط فرمان معمولاً فقط یک بار پردازش میشوند، به عنوان مثال، در زمان وارد کردن ماژول یا زمان اولیهسازی باطن XLA)، XLA_FLAGS
که در بالا توضیح داده شد با os.environ
اضافه کنید، برای مثال:
import os
os.environ['XLA_FLAGS'] = "--xla_dump_to=DIRECTORY_PATH"
این محاسبات را به DIRECTORY_PATH
، برای مثال /tmp
، منتقل میکند. در Colab، برای مشاهده و دسترسی به این فهرست، به مرورگر "Files" در نوار کناری سمت چپ بروید.
می توانید از تمام پرچم های ذکر شده در قسمت Local Execution استفاده کنید.
گزینه های مخصوص JAX
مشابه اجرای محلی؛ برای درون نگری زنده و تعاملی می توانید مستقیماً HLO از پیش بهینه سازی شده محاسباتی را چاپ کنید:
def f(x):
return jax.numpy.sin(jax.numpy.cos(x))
c = jax.jit(f).lower(3.).compiler_ir('hlo')
print(c.as_hlo_text())
همچنین می توانید مستقیماً HLO بهینه سازی شده محاسباتی را چاپ کنید:
def optimized_HLO(f, *args, platform=None):
print(jax.jit(f).lower(*args).compile().as_text())
def f(x):
return jax.numpy.sin(jax.numpy.cos(x))
optimized_HLO(f, 1.0)
تخلیه همه / محاسبات کوچک
اگر می خواهید همه چیز را در یک dump مشاهده کنید، از جمله تمام کامپایل های کوچک، متغیر محیطی JAX را تنظیم کنید:
JAX_COMPILER_DETAILED_LOGGING_MIN_OPS=0
موزاییک
Mosaic یک کامپایلر برای باطن TPU Pallas و باطن GPU آزمایشی Pallas است. برای حذف محاسبات موزاییک، پرچم زیر را تنظیم کنید:
--xla_mosaic_dump_to=/tmp/mosaic_dumps
یا، آرگومان های اولیه TPU را به عنوان یک متغیر محیطی تنظیم کنید:
export LIBTPU_INIT_ARGS="--xla_mosaic_dump_to=/tmp/mosaic_dumps"
برای کسب اطلاعات بیشتر ، مستندات JAX در مورد Pallas and Mosaic را بررسی کنید.
بیشتر با HLO Dumps
پیدا کردن محاسبات مناسب
معمولاً بسیاری از محاسبات حذف می شوند. فایلهای ریختهشده به صراحت با «نام محاسباتی» JAX، Tensorflow، یا PyTorch/XLA نامگذاری میشوند که در گزارشها فراخوانی میشوند و شناسایی فایلهای HLO مربوطه را آسان میکنند. به عنوان مثال:
1624325116260738.module_0065.pmap__unnamed_wrapped_function_.186875.before_optimizations.txt
در غیر این صورت، می توانید از ripgrep
برای تشخیص سریع اینکه کدام ماژول دارای نمادها یا محاسبات خاص است استفاده کنید.
نکته: 3 فایل مورد علاقه قبل/پس از/تخصیص بافر را در گزارش های اشکال خود قرار دهید.
تبدیل HLO
ابزاری به نام hlo-opt
که می تواند بین فرمت های HLOProto و متن ترجمه کند. در مواردی که یک فرمت دارید، اما برای اشکال زدایی به دیگری نیاز دارید، مفید است.
استفاده از آن را بیاموزید: اسناد XLA Tooling: hlo-opt .
پخش مجدد
میتوانید محاسبات تخلیهشده را روی یک باطن خاص XLA با دادههای جعلی یا عکسهای فوری ورودی اجرا کنید. این یک راه راحت برای بازتولید، تکرار، و اشکال زدایی مسائل در XLA است.
دستورات زیر از داده های جعلی استفاده می کنند. اگر عکسهای فوری HLO را ذخیره کردهاید، میتوانید آنها را به جای آن ارسال کنید و از دادههای عکس فوری استفاده میشود. برای اینکه همچنان از دادههای جعلی هنگام اجرای عکس فوری استفاده کنید، پرچم --force_fake_data
ارسال کنید.
پشتیبانی CPU:
bazel run -c opt //xla/hlo/tools:run_hlo_module -- --platform=cpu
/tmp/xladump/module_4561.before_optimizations.txt
باطن GPU:
bazel run -c opt //xla/hlo/tools:run_hlo_module -- --platform=CUDA
/tmp/xladump/module_4561.before_optimizations.txt