เครื่องมือนี้ช่วยให้คุณเรียกใช้โมดูล HLO บน GPU อย่างน้อย 1 ตัวได้ นอกจากนี้ยังช่วยให้ คอมไพล์โค้ดที่กำหนดเป้าหมายไปยัง GPU หลายตัวได้โดยไม่ต้องเรียกใช้
การเรียกใช้ HLO แบบหลาย GPU (แบบ Shard)
เราสามารถระบุ HLO เหล่านี้ได้โดยดูsharding=คำอธิบายประกอบ เช่น
sharding={devices=[1,1,2,1]0,1} หมายความว่าควรแบ่งพาร์ติชันเทนเซอร์ที่ใส่คำอธิบายประกอบเป็น 2 GPU (GPU0 และ GPU1) ตามมิติที่ 3
วิธีการต่อไปนี้จะถือว่าไดเรกทอรีการทำงานคือที่เก็บ Git ของ XLA
และได้เรียกใช้ ./configure.py แล้ว
หากมี GPU เพียงพอ เราจะเล่น HLO เหล่านี้ซ้ำได้ดังนี้
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- my-hlo.txt
นอกจากนี้ คุณยังคอมไพล์ HLO เดียวกันได้โดยไม่ต้องเรียกใช้ด้วยการตั้งค่า
--run=false
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- --run=false my-hlo.txt
ในกรณีดังกล่าว คุณต้องมี GPU เพียงตัวเดียว เว้นแต่จะใช้แคชการปรับอัตโนมัติ
การแก้ปัญหา
- ข้อผิดพลาด เช่น
Check failed: result.replicas >= 1 (0 vs. 1):- เราต้องตรวจสอบว่ามี GPU เพียงพอ
- ต้องตั้งค่า
CUDA_VISIBLE_DEVICESให้ถูกต้องหรือไม่ตั้งค่าเลย
- ข้อขัดข้อง
- เราอาจต้องใช้
--dynamic_mode=off - ควรตั้งค่า CUDA และ cuDNN ให้ถูกต้อง
- เราอาจต้องใช้
ตัวอย่าง
ตัวอย่างกระบวนการเดียวและ GPU หลายตัว
ตั้งค่าและรับ HLO
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
cd /opt/xla/
./configure.py --backend CUDA --nccl
bazel build //xla/tools/multihost_hlo_runner:hlo_runner_main
ตัวอย่างกระบวนการเดียว: ก่อนการเล่นกราฟการเพิ่มประสิทธิภาพซ้ำ
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- \
/tmp/dump/module_0023.pjit__wrapped_step_fn.before_optimizations.txt
ตัวอย่างกระบวนการเดียว: หลังจากการเล่นกราฟการเพิ่มประสิทธิภาพซ้ำ
หากต้องการเล่น HLO ที่เพิ่มประสิทธิภาพซ้ำ คุณต้องใช้ --xla_disable_all_hlo_passes
หรือ --run_xla_backend_only ไม่เช่นนั้น XLA จะพยายามคอมไพล์ HLO อีกครั้งและ
ระบบไม่รองรับการดำเนินการนี้ จึงอาจทำให้เกิดข้อผิดพลาดแปลกๆ มากมาย
คำสั่งแบบเต็ม: 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
หลายกระบวนการ โหนดเดียว
เปิดใช้คอนเทนเนอร์
และติดตั้งไลบรารีที่ขาดหายไป (โปรดทราบว่าข้อมูลนี้อาจล้าสมัยได้เร็วกว่า ปรับตามต้องการ)
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
เรียกใช้โมเดลต้นฉบับและส่งออก HLO
ในตัวอย่างนี้ เราจะใช้โมเดล PAXML แบบ 8 GPU จาก test-pax.sh (หมายเหตุ
การทิ้งข้อมูลนี้จะเหมือนกับกรณีที่มีกระบวนการเดียว คุณจึงทำcp -r
/tmp/dump /tmp/dump_multi_processได้หากมีอยู่แล้ว 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
ระบบจะบันทึกการดัมพ์ HLO ไว้ใน /tmp/dump_multi_process/ สำหรับ PAX โดยเฉพาะ
โมดูลหลักจะมี "pjit__wrapped_step_fn" ในชื่อ ในตัวอย่างนี้
เราจะใช้
/tmp/dump_multi_process/module_0023.pjit__wrapped_step_fn.before_optimizations.txt
เรียกใช้ในโหนดเดียวโดยใช้ MPI
สร้างสคริปต์ Bash ชื่อ 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
ตอนนี้คุณสามารถเรียกใช้โดยใช้ mpirun ได้แล้ว
chmod a+x run.sh
mpirun --allow-run-as-root -np 8 run.sh
เรียกใช้ในหลายโหนดด้วย SLURM
เมื่อเรียกใช้ในหลายโหนดโดยใช้ SLURM คุณสามารถส่งต่อตัวแปรสภาพแวดล้อม SLURM ไปยังโปรแกรมเรียกใช้ HLO ได้ดังนี้ในงาน SLURM
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