XLA araçlarını kullanma

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