XLA geliştirme iş akışı genellikle proje yöneticisinin
HLO IR: İzole işlevselliği temsil eder.
hesaplamasına verilen isimdir. XLA birçok komut satırı aracı içerir
(aşağıda açıklanmıştır) ya da HLO'yu kullanacak ve bunu çalıştıracak veya
öğrenmeye devam edeceğiz. Bu tür araçları kullanmak, hızlı bir
HLO hem görselleştirilebilir hem de kullanılabilir olduğundan compile->modify->run
yineleme döngüsü
tekrarlı şekilde değiştirip çalıştırmak genellikle bu tür bir saldırıya
veya davranışını anlamaya ve düzeltmeye yardımcı olur.
XLA ile derlenen bir program için HLO'yu edinmenin en kolay yolu
bunun için genellikle XLA_FLAGS
ortam değişkenini kullanın:
$ XLA_FLAGS=--xla_dump_to=/tmp/myfolder ./myprogram-entry-point
Bu uzantı, optimizasyondan önceki tüm HLO dosyalarını belirtilen klasörde ve birlikte kullanır.
HLO snippet'leri çalıştırılıyor: run_hlo_module
run_hlo_module
aracı, varsayılan olarak optimizasyon öncesi HLO üzerinde çalışır
derleme, çalıştırma ve referans çevirmen ile karşılaştırma paketleri
bazı ipuçları vereceğim. Örneğin, bir giriş dosyasını çalıştırmak için kullanılan normal çağrı
NVIDIA GPU'daki computation.hlo
ve doğruluğu kontrol etmek için:
$ 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.
HLO snippet'lerini SPMD desteğiyle çalıştırma: multihost_hlo_runner
Çok ana makineli HLO çalıştırıcı, oldukça benzer bir araçtır ancak desteklediği SPMD (ana makineler arası iletişim dahil). Görüntüleyin Ayrıntılı bilgi için çok ana makineli HLO Çalıştırıcısı'nı inceleyin.
Çoklu HLO tekrarı
Birden fazla modüllü çağrı hem run_hlo_module
hem de
hlo_runner_main
, genellikle bir dökümdeki tüm modülleri tekrar oynatmak için kullanışlıdır
dizin:
$ hlo_runner_main /dump/*before_optimizations*
HLO derlemesinin devam eden kartları/aşamaları: hlo-opt
Hata ayıklarken veya derleyicinin çalışmalarını anlarken, genellikle bu SDK'nın bir donanımın belirli bir noktasında genişletmeyi sağlamak için belirli bir (kararlı) HLO için ardışık düzen (HLO, optimize edilmiş HLO, TritonIR veya LLVM) giriş.
hlo-opt
birden çok çıkış aşamasını destekler: PTX, optimizasyonlardan sonra HLO,
Optimizasyonlardan önceki LLVM IR veya TritonIR. Desteklenen aşamaların tamamı
platforma bağlıdır (örneğin, PTX NVIDIA'ya özgüdür) ve
--list-stages komutunu kullanır:
$ hlo-opt --platform=CUDA --list-stages
hlo
llvm
ptx
Bir aşama seçtikten sonra, kullanıcı belirli bir belirli bir akış için izin verilen platform:
$ hlo-opt myinput.hlo --platform=CUDA --stage=llvm
Bu da 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 ve Komut satırındaki GPU spesifikasyonunu alabiliriz (ör. erişimi olmayan PTX çıkışı hızlandırıcı:
$ 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
dizesinin serileştirmesi:
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 gerekirse cihazsız derlemede sorunlarla karşılaşabilirsiniz. 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
Autotune dosyası, autotune_results.proto
metninin metin serileştirilmesiyle oluşturulur.
aşağıdaki gibi bir örnek görebilirsiniz:
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
}
}
}
Autosetting veritabanı,
XLA_FLAGS=--xla_gpu_dump_autotune_results_t=<myfile.pbtxt>
.
Tek Derleyici Kartı Çalıştırma
XLA_FLAGS
işaretleri de desteklendiğinden araç,
tek bir kart varsa:
$ hlo-opt --platform=CUDA --stage=hlo --xla-hlo-enable-passes-only=algebraic_simplifer input.hlo