Công cụ này cho phép bạn chạy một mô-đun HLO trên một hoặc nhiều GPU. Thao tác này cũng cho phép biên dịch mã nhắm đến nhiều GPU mà không cần chạy mã đó.
Chạy HLO đa GPU (phân mảnh)
Chúng ta có thể xác định những HLO này bằng cách xem chú thích sharding=. Ví dụ: sharding={devices=[1,1,2,1]0,1} có nghĩa là tenxơ được chú thích sẽ được phân mảnh thành 2 GPU (GPU0 và GPU1) dọc theo chiều thứ 3.
Hướng dẫn sau đây giả định rằng thư mục đang hoạt động là kho lưu trữ XLA Git và ./configure.py đã được chạy.
Nếu có đủ GPU, chúng ta có thể phát lại các HLO này như sau:
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- my-hlo.txt
Bạn cũng có thể biên dịch cùng một HLO mà không cần chạy bằng cách thiết lập --run=false:
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- --run=false my-hlo.txt
Trong trường hợp đó, bạn cần có một GPU, trừ phi bạn sử dụng bộ nhớ đệm tự động điều chỉnh.
Khắc phục sự cố
- Các lỗi như
Check failed: result.replicas >= 1 (0 vs. 1):- Chúng ta phải đảm bảo có đủ GPU.
- Bạn phải đặt
CUDA_VISIBLE_DEVICESmột cách chính xác hoặc hoàn toàn không đặt.
- Vấn đề trục trặc:
- Chúng ta có thể muốn sử dụng
--dynamic_mode=off. - Bạn phải thiết lập CUDA và cuDNN đúng cách.
- Chúng ta có thể muốn sử dụng
Ví dụ
Ví dụ về một quy trình, nhiều GPU
Thiết lập và nhận 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.
Tạo trình chạy nhiều máy chủ XLA
cd /opt/xla/
./configure.py --backend CUDA --nccl
bazel build //xla/tools/multihost_hlo_runner:hlo_runner_main
Ví dụ về quy trình đơn: Trước khi phát lại biểu đồ tối ưu hoá
bazel run //xla/tools/multihost_hlo_runner:hlo_runner_main -- \
/tmp/dump/module_0023.pjit__wrapped_step_fn.before_optimizations.txt
Ví dụ về một quy trình: Sau khi phát lại biểu đồ tối ưu hoá
Để phát lại một HLO được tối ưu hoá, bạn phải sử dụng --xla_disable_all_hlo_passes hoặc --run_xla_backend_only. Nếu không, XLA sẽ cố gắng biên dịch lại HLO và điều này không được hỗ trợ. Vì vậy, nó sẽ gây ra nhiều lỗi lạ.
Câu lệnh đầy đủ: 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
Nhiều quy trình, một nút
Khởi chạy vùng chứa
Đồng thời cài đặt một số thư viện còn thiếu. (Xin lưu ý rằng thông tin này có thể nhanh chóng trở nên lỗi thời. Điều chỉnh nếu cần.)
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
Chạy mô hình gốc và kết xuất HLO
Trong ví dụ này, chúng ta sẽ sử dụng mô hình PAXML 8 GPU từ test-pax.sh. (Lưu ý: đây sẽ là cùng một tệp kết xuất như trường hợp một quy trình. Bạn có thể làm cp -r
/tmp/dump /tmp/dump_multi_process nếu đã có. 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
Tệp kết xuất HLO sẽ được lưu vào /tmp/dump_multi_process/. Cụ thể đối với PAX, mô-đun chính sẽ có "pjit__wrapped_step_fn" trong tên. Trong ví dụ này, chúng ta sẽ sử dụng /tmp/dump_multi_process/module_0023.pjit__wrapped_step_fn.before_optimizations.txt.
Chạy trên một nút bằng MPI
Tạo một tập lệnh bash có tên là 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
Giờ đây, bạn có thể thực thi bằng mpirun:
chmod a+x run.sh
mpirun --allow-run-as-root -np 8 run.sh
Chạy trên nhiều nút bằng SLURM
Khi chạy trên nhiều nút bằng SLURM, bạn có thể chuyển tiếp các biến môi trường SLURM đến trình chạy HLO như sau trong công việc 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