Utiliser les outils XLA

Le workflow de développement XLA est généralement centré sur HLO IR, qui représente les fonctions isolées le calcul fourni au compilateur. XLA intègre plusieurs outils de ligne de commande (décrit ci-dessous) qui utilisent un HLO et l'exécutent, ou fournissent un est une étape de compilation intermédiaire. L'utilisation de ces outils est inestimable le cycle d'itération de compile->modify->run, l'objectif HLO étant à la fois lisible et hackable, et le modifier et l'exécuter de manière itérative est souvent le moyen le plus rapide et corriger les performances ou le comportement d'un XLA.

Le moyen le plus simple d'obtenir le HLO d'un programme en cours de compilation avec XLA est utilisez généralement la variable d'environnement XLA_FLAGS:

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

qui stocke tous les fichiers HLO avant optimisation dans le dossier spécifié, ainsi que avec de nombreux autres artefacts utiles.

Extraits HLO en cours d'exécution: run_hlo_module

L'outil run_hlo_module fonctionne sur les HLO de pré-optimisation et, par défaut, regroupe la compilation, l'exécution et la comparaison avec l'interpréteur de référence la mise en œuvre. Par exemple, l'appel habituel pour exécuter un fichier d'entrée Pour vérifier qu'il est correct, computation.hlo sur un GPU NVIDIA:

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

Comme avec tous les outils, vous pouvez utiliser --help pour obtenir la liste complète des options.

Exécution d'extraits HLO compatibles avec SPMD: multihost_hlo_runner

L'exécuteur HLO multi-hôte est un outil très similaire, mais il prend en charge SPMD, y compris la communication entre hôtes. Voir Exécuteur HLO multi-hôtes pour en savoir plus.

Rediffusion multi-HLO

L'appel avec plusieurs modules est compatible avec run_hlo_module et hlo_runner_main, qui est souvent pratique pour relire tous les modules d'un vidage répertoire:

$ hlo_runner_main /dump/*before_optimizations*

Passes/étapes en cours d'exécution de la compilation HLO: hlo-opt

Lors du débogage ou de la compréhension du fonctionnement du compilateur, il est souvent utile pour obtenir l'expansion d'un matériel particulier à un moment donné (HLO, HLO optimisé, TritonIR ou LLVM) pour un HLO donné (stable) saisie.

hlo-opt accepte plusieurs étapes de sortie: PTX, HLO après optimisation, LLVM IR avant optimisations, ou TritonIR. L'ensemble exact des étapes acceptées dépend de la plate-forme (le PTX est spécifique à NVIDIA, par exemple). Vous pouvez le voir en utilisant la commande --list-stages:

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

Après avoir sélectionné une étape, l'utilisateur peut écrire le résultat de la conversion pour un une plate-forme donnée à un flux donné:

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

qui imprimerait le vidage sur stdout (ou dans un fichier donné si -o était spécifié).

Utilisation sans appareil

L'accès à un GPU n'est pas nécessaire pour la majeure partie de la compilation. En spécifiant un la spécification GPU sur la ligne de commande. Par exemple, Sortie PTX sans accès accélérateur:

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

Les spécifications des GPU courants sont fournies avec le compilateur, et le fichier fourni est sérialisation de chaînes de 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"

La compilation sans appareil peut rencontrer des problèmes si un réglage automatique est requis. Heureusement, nous pouvons également les fournir via la ligne de commande:

$ 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

Le fichier d'autoréglage est une sérialisation de texte de autotune_results.proto, avec exemple:

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

La base de données de réglage automatique peut être sérialisée XLA_FLAGS=--xla_gpu_dump_autotune_results_t=<myfile.pbtxt>

Exécuter une carte de compilateur unique

Les options de XLA_FLAGS sont également compatibles. L'outil peut donc être utilisé pour tester en une seule passe:

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