XLA araçlarını kullanma

XLA geliştirme iş akışı genellikle derleyiciye verilen izole işlevsel hesaplamayı temsil eden HLO IR'yi temel alır. XLA, HLO'yu kullanan ve çalıştıran ya da ara derleme aşaması sağlayan birden fazla komut satırı aracıyla (aşağıda açıklanmıştır) birlikte gelir. HLO hem görselleştirilebilir hem de saldırıya açık olduğundan ve XLA performansını veya davranışını anlamak ve düzeltmek için genellikle en hızlı yol iteratif olarak değiştirmek ve çalıştırmak olduğundan bu tür araçları kullanmak hızlı bir compile->modify->run iterasyon döngüsü için çok değerlidir.

XLA ile derlenen bir programın HLO'sunu elde etmenin en kolay yolu genellikle XLA_FLAGS ortam değişkenini kullanmaktır:

$ XLA_FLAGS=--xla_dump_to=/tmp/myfolder ./myprogram-entry-point

Bu komut, diğer birçok yararlı yapıyla birlikte optimizasyondan önceki tüm HLO dosyalarını belirtilen klasörde depolar.

HLO snippet'lerini çalıştırma: run_hlo_module

run_hlo_module aracı, optimizasyon öncesi HLO üzerinde çalışır ve varsayılan olarak derlemeyi, çalıştırmayı ve referans yorumlayıcı uygulamasıyla karşılaştırmayı bir araya getirir. Örneğin, bir giriş dosyasınıcomputation.hlo NVIDIA GPU'da çalıştırmak ve doğruluğunu kontrol etmek için kullanılan genel çağrı şudur:

$ run_hlo_module --platform=CUDA --reference_platform=Interpreter computation.hlo

Tüm araçlarda olduğu gibi, seçeneklerin tam listesini almak için --help kullanılabilir.

SPMD desteğiyle HLO snippet'lerini çalıştırma: multihost_hlo_runner

Çok ana makineli HLO çalıştırıcı, ana makineler arası iletişim de dahil olmak üzere SPMD'yi desteklemesi dışında çok benzer bir araçtır. Ayrıntılar için Çok Ana Makineli HLO Runner başlıklı makaleyi inceleyin.

Çoklu HLO tekrarı

Hem run_hlo_module hem de hlo_runner_main için birden fazla modülle çağrı desteklenir. Bu, genellikle bir dökümü dizinindeki tüm modülleri yeniden oynatmak için kullanışlıdır:

$ hlo_runner_main /dump/*before_optimizations*

HLO derlemesinin geçişlerini/aşamalarını çalıştırma: hlo-opt

Derleyicinin çalışma şeklini anlamak veya hata ayıklama yaparken belirli bir (Sabit) HLO girişi için ardışık düzendeki belirli bir noktada (HLO, optimize edilmiş HLO, TritonIR veya LLVM) belirli bir donanımın genişletmesini almak genellikle yararlıdır.

hlo-opt birden fazla çıkış aşamasını destekler: PTX, optimizasyonlardan sonra HLO, optimizasyonlardan önce LLVM IR veya TritonIR. Desteklenen aşamaların tam listesi platforma bağlıdır (ör. PTX NVIDIA'ya özgüdür) ve --list-stages komutu kullanılarak görülebilir:

$ hlo-opt --platform=CUDA --list-stages
hlo
llvm
ptx

Kullanıcı, bir aşama seçtikten sonra belirli bir platform için dönüşümün sonucunu belirli bir akışa yazabilir:

$ hlo-opt myinput.hlo --platform=CUDA --stage=llvm

Bu komut, dökümü stdout'a (veya -o belirtilmişse belirli bir dosyaya) yazdırır.

Cihazsız Kullanım

Derlemenin çoğu için GPU'ya erişim gerekmez. Komut satırında bir GPU özelliği belirterek hızlandırıcıya erişmeden PTX çıkışı elde edebiliriz:

$ hlo-opt  --platform=CUDA --stage=llvm  --xla_gpu_target_config_filename=(pwd)/tools/data/gpu_specs/a100_pcie_80.txtpb input.hlo

Popüler GPU'ların özellikleri derleyiciyle birlikte gönderilir ve sağlanan dosya, device_description.proto dize dizilimidir:

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"

Otomatik ayarlama gerekiyorsa cihazsız derlemede sorunlar yaşanabilir. Neyse ki bunları komut satırında da sağlayabiliriz:

$ 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

Otomatik ayar dosyası, autotune_results.proto değerinin metin olarak serileştirilmesidir. Örnek şu şekildedir:

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
    }
  }
}

Otomatik ayarlama veritabanı, XLA_FLAGS=--xla_gpu_dump_autotune_results_t=<myfile.pbtxt> kullanılarak serileştirilebilir.

Tek Derleyici Geçişi Çalıştırma

XLA_FLAGS kaynaklı işaretler de desteklenir. Bu nedenle, araç tek geçiş çalıştırmayı test etmek için kullanılabilir:

$ hlo-opt --platform=CUDA --stage=hlo --passes=algebraic_simplifer input.hlo