عادةً ما يتمحور سير عمل تطوير XLA حول
الأشعة تحت الحمراء HLO، التي تمثل وظائف معزولة
العملية الحسابية المعطاة للمحول البرمجي. يتوفر XLA مع أدوات سطر أوامر متعددة
(الموضّحة أدناه) التي تستهلك HLO وإمّا تشغّلها أو توفّر
مرحلة التجميع المتوسطة. يُعد استخدام هذه الأدوات أمرًا لا يقدر بثمن
دورة التكرار compile->modify->run
، حيث يمكن تمثيل HLO
قابل للاختراق، وتغييرها وتشغيلها بشكل متكرر، غالبًا ما تكون أسرع طريقة
فهم أداء وظائف XLA أو سلوكها وإصلاحها.
وتتمثل أسهل طريقة للحصول على HLO في برنامج يتم تجميعه باستخدام XLA
عادةً ما يتم استخدام متغير البيئة XLA_FLAGS
:
$ XLA_FLAGS=--xla_dump_to=/tmp/myfolder ./myprogram-entry-point
الذي يخزن جميع ملفات HLO قبل التحسين في المجلد المحدد، إلى جانب مع العديد من الأدوات المفيدة الأخرى.
جارٍ تشغيل مقتطفات HLO: run_hlo_module
تعمل أداة run_hlo_module
على مستوى الصفحة الرئيسية قبل التحسين، وبشكل تلقائي
تجميع الحِزم وتشغيلها ومقارنتها مع أداة الترجمة الفورية
التنفيذ. على سبيل المثال، الاستدعاء المعتاد لتشغيل ملف الإدخال
computation.hlo
على وحدة معالجة الرسومات NVIDIA وللتحقق من صحّتها:
$ run_hlo_module --platform=CUDA --reference_platform=Interpreter computation.hlo
كما هو الحال مع جميع الأدوات، يمكن استخدام --help
للحصول على قائمة كاملة بالخيارات.
تشغيل مقتطفات HLO مع دعم SPMD: multihost_hlo_runner
هي أداة مشابهة جدًا للمضيفات المتعددة (HLO)، ولكن يُرجى الانتباه إليها SPMD، بما في ذلك الاتصال عبر المضيف. عرض أداة تشغيل HLO متعدد المضيفات للحصول على التفاصيل.
إعادة تشغيل فيديوهات HLO متعددة
يتوفّر الاستدعاء باستخدام وحدات متعددة لكل من 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
).
الاستخدام بدون أجهزة
لا حاجة إلى الوصول إلى وحدة معالجة الرسومات في معظم عملية التحويل، ومن خلال تحديد مواصفات وحدة معالجة الرسومات في سطر الأوامر الذي يمكننا الحصول عليه، على سبيل المثال مخرج PTX بدون الوصول إلى مسرِّعة أعمال:
$ hlo-opt --platform=CUDA --stage=llvm --xla_gpu_target_config_filename=(pwd)/tools/data/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"
وقد تحدث مشاكل في الفيديوهات المجمّعة بدون أجهزة إذا كانت هناك حاجة إلى التوليف التلقائي. لحسن الحظ، يمكننا أيضًا تقديمها في سطر الأوامر:
$ 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