Mit diesem Tool können Sie ein HLO-Modul auf einer oder mehreren GPUs ausführen. Außerdem kann Code für mehrere GPUs kompiliert werden, ohne dass er ausgeführt wird.
Ausführen von HLOs mit mehreren GPUs (sharded)
Diese HLOs erkennen Sie an den sharding=-Anmerkungen. sharding={devices=[1,1,2,1]0,1} bedeutet beispielsweise, dass der annotierte Tensor entlang der dritten Dimension auf zwei GPUs (GPU0 und GPU1) aufgeteilt werden soll.
Bei der folgenden Anleitung wird davon ausgegangen, dass das Arbeitsverzeichnis das XLA-Git-Repository ist und dass ./configure.py ausgeführt wurde.
Wenn wir genügend GPUs haben, können wir diese HLOs so wiedergeben:
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- my-hlo.txt
Es ist auch möglich, denselben HLO zu kompilieren, ohne ihn auszuführen. Dazu müssen Sie --run=false festlegen:
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- --run=false my-hlo.txt
In diesem Fall ist eine einzelne GPU erforderlich, sofern nicht der Cache für automatisches Tuning verwendet wird.
Fehlerbehebung
- Fehler wie
Check failed: result.replicas >= 1 (0 vs. 1):- Wir müssen sicherstellen, dass wir genügend GPUs haben.
CUDA_VISIBLE_DEVICESmuss richtig festgelegt oder gar nicht festgelegt werden.
- Abstürze:
- Möglicherweise möchten wir
--dynamic_mode=offverwenden. - CUDA und cuDNN sollten richtig eingerichtet sein.
- Möglicherweise möchten wir
Beispiele
Beispiel für einen einzelnen Prozess mit mehreren GPUs
HLO einrichten und abrufen
You can use a container with the following instructions:
docker run -it --shm-size=1g --gpus all ghcr.io/nvidia/jax:pax-2024-06-03
cd /opt/xla/
Note, those instructions can be outdated more quickly. Adjust as needed.
# The 8 below is the number of GPUs you have.
# test-pax.sh --help for more details on the parallelization options
(export XLA_FLAGS="--xla_dump_to=/tmp/dump"; test-pax.sh --fsdp 8 --batch-per-gpu 1)
ls -lSh /tmp/dump/*before_optimizations.txt
# The biggest file one is normally the one you care about.
# I picked one, for the rest of the scripts, but the name could change when you change the JAX or XLA version.
XLA-Multihost-Runner erstellen
cd /opt/xla/
./configure.py --backend CUDA --nccl
bazel build //xla/tools/multihost_hlo_runner:hlo_runner_main
Beispiel für einen einzelnen Prozess: Wiedergabe des Graphen vor der Optimierung
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- \
/tmp/dump/module_0023.pjit__wrapped_step_fn.before_optimizations.txt
Beispiel für einen einzelnen Prozess: Wiedergabe des Optimierungsgraphen
Wenn Sie ein optimiertes HLO noch einmal ausführen möchten, müssen Sie entweder --xla_disable_all_hlo_passes oder --run_xla_backend_only verwenden. Andernfalls versucht XLA, das HLO neu zu kompilieren, was nicht unterstützt wird. Daher werden viele seltsame Fehler ausgegeben.
Vollständiger Befehl: bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main --
--run_xla_backend_only
/tmp/dump/module_0023.pjit__wrapped_step_fn.sm_8.0_gpu_after_optimizations.txt
Mehrere Prozesse, ein Knoten
Container starten
Installieren Sie auch einige fehlende Bibliotheken. Hinweis: Diese Informationen können schnell veralten. Passen Sie die Position nach Bedarf an.)
docker run -it --shm-size=1g --gpus all ghcr.io/nvidia/jax:pax-2024-06-03
apt-get update && apt-get install -y openmpi-bin openmpi-common libopenmpi-dev
Originalmodell ausführen und HLO-Datei erstellen
In diesem Beispiel verwenden wir ein PAXML-Modell mit 8 GPUs aus test-pax.sh. Hinweis: Dies ist derselbe Dump wie im Fall mit einem einzelnen Prozess. Wenn Sie cp -r
/tmp/dump /tmp/dump_multi_process bereits haben, können Sie export
XLA_FLAGS="--xla_dump_to=/tmp/dump_multi_process" mpirun --allow-run-as-root -np
8 test-pax.sh --fsdp 8 --batch-per-gpu 1 -o /tmp/checkpoint --multiprocess nutzen.
Der HLO-Dump wird in /tmp/dump_multi_process/ gespeichert. Speziell für PAX enthält das Hauptmodul „pjit__wrapped_step_fn“ im Namen. In diesem Beispiel verwenden wir /tmp/dump_multi_process/module_0023.pjit__wrapped_step_fn.before_optimizations.txt.
Auf einem einzelnen Knoten mit MPI ausführen
Erstellen Sie ein Bash-Script mit dem Namen run.sh:
#!/bin/bash
export CUDA_VISIBLE_DEVICES=${OMPI_COMM_WORLD_LOCAL_RANK}
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- \
--task_id=${OMPI_COMM_WORLD_RANK} \
--num_nodes=${OMPI_COMM_WORLD_SIZE} \
--address=127.0.0.1:12345 \
/tmp/dump_multi_process/module_0023.pjit__wrapped_step_fn.before_optimizations.txt
Jetzt können Sie sie mit „mpirun“ ausführen:
chmod a+x run.sh
mpirun --allow-run-as-root -np 8 run.sh
Mit SLURM auf mehreren Knoten ausführen
Wenn Sie SLURM auf mehreren Knoten ausführen, können Sie die SLURM-Umgebungsvariablen so an den HLO-Runner weiterleiten:
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- \
--task_id=${SLURM_PROCID} \
--num_nodes=${SLURM_NTASKS} \
--address="${SLURM_LAUNCH_NODE_IPADDR}:12345" \
/tmp/dump_multi_process/module_0023.pjit__wrapped_step_fn.before_optimizations.txt