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