استخدام أدوات XLA

عادةً ما يتمحور سير عمل تطوير 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