Mục lục bài
DDP, FSDP hay DeepSpeed ZeRO?
Lưu ý: Chia càng nhiều thì tiết kiệm VRAM càng nhiều nhưng giao tiếp giữa GPU càng nặng. Trên máy card PCIe không NVLink, ZeRO-3/FSDP full shard có thể chậm rõ rệt — hãy đo trên hệ thống thật.
Các bước thực hiện
Tiến độ chỉ lưu trên trình duyệt này.
Bước 1: Kiểm tra topo và NCCL bằng nccl-tests
Bash Chạy xong không lỗi, cột busbw ổn định giữa các lần chạy. Ghi lại kết quả làm mốc — khi job chậm bất thường, chạy lại để so sánh.
Bước 2: Viết script DDP tối giản
ddp_min.py Bước 3: Chạy bằng torchrun trên một node
Bash torchrun tự đặt
RANK,LOCAL_RANK,WORLD_SIZEcho từng tiến trình. Script Hugging Face Trainer/TRL cũng chạy được bằng torchrun hoặcaccelerate launch.Bước 4: Bật FSDP hoặc DeepSpeed ZeRO cho script Hugging Face
Với script TRL/Trainer (như
train_sft.pyở bài fine-tune), cách đơn giản là dùng DeepSpeed qua file cấu hình. Giá trị"auto"để Trainer tự điền theoSFTConfig.ds_zero3.json Bash Cảnh báo: Tổ hợp QLoRA 4-bit với FSDP/ZeRO-3 có yêu cầu riêng về phiên bản và cấu hình. Làm theo hướng dẫn chính thức của PEFT/Accelerate cho đúng tổ hợp, đừng ghép tuỳ ý.
Bước 5: Chạy nhiều node
Chạy cùng một lệnh trên mọi node, trỏ về một endpoint rendezvous (IP của node đầu). Mở cổng giữa các node trên mạng nội bộ.
Bash - Mọi node dùng cùng image/môi trường, cùng mã nguồn, cùng đường dẫn dữ liệu.
- Đồng bộ thời gian (chrony) để log khớp nhau.
- Với Slurm, dùng
srunbọc lệnh torchrun và lấy địa chỉ node đầu từ biến môi trường của Slurm.
Bước 6: Biến môi trường NCCL để gỡ lỗi
Bash Bước 7: Checkpoint và lưu trữ dữ liệu
- Lưu checkpoint định kỳ (
save_steps) và giới hạn số bản (save_total_limit); tiếp tục bằngtrainer.train(resume_from_checkpoint=True). - FSDP/ZeRO-3 lưu checkpoint dạng chia mảnh — ghi vào lưu trữ dùng chung mọi rank đều thấy, hoặc dùng
torch.distributed.checkpoint. - Chỉ rank 0 ghi log và file tổng hợp để tránh ghi đè.
- Tiền xử lý/tokenize dữ liệu một lần thành shard (Arrow/Parquet), không tokenize lại mỗi lần chạy.
- Dữ liệu trên lưu trữ song song hoặc sao chép sẵn về NVMe cục bộ của từng node; tăng
num_workersDataLoader tới khi GPU không còn chờ dữ liệu. - Sao chép checkpoint quan trọng ra nơi lưu trữ khác (xem bài giám sát & vận hành).
- Lưu checkpoint định kỳ (
Kiểm tra thành công
all_reduce_perfchạy hết không lỗi trên một node và (nếu có) giữa các node.- Log
NCCL_DEBUG=INFOcho thấy dùng NVLink/P2P trong node và IB/RoCE giữa các node như thiết kế. nvidia-smicho thấy mọi GPU cùng được dùng khi job chạy.- Dừng job giữa chừng rồi chạy lại từ checkpoint, loss tiếp tục liền mạch.
Lỗi thường gặp & cách sửa
Job treo ngay lúc khởi tạo, không in lỗi
Nguyên nhân thường gặp: Các node không kết nối được cổng rendezvous, NCCL chọn nhầm card mạng, tường lửa chặn.
Kiểm tra nc -zv 10.0.0.11 29500 từ node khác, đặt NCCL_SOCKET_IFNAME đúng card, bật NCCL_DEBUG=INFO để xem node nào không tham gia.
Watchdog caught collective operation timeout
Nguyên nhân thường gặp: Một rank chết/OOM, các rank chạy khác nhánh code (lệch collective), hoặc mạng lỗi.
Tìm log của rank lỗi đầu tiên (thường OOM hoặc exception), bật TORCH_DISTRIBUTED_DEBUG=DETAIL, đảm bảo mọi rank chạy cùng số bước và cùng điều kiện if/else quanh collective.
Nhiều GPU trong một node nhưng tốc độ không tăng, NCCL không dùng P2P
Nguyên nhân thường gặp: Topo PCIe đi qua CPU, ACS bật trên switch PCIe chặn P2P, hoặc IOMMU cấu hình không phù hợp máy bare-metal.
Xem nvidia-smi topo -m, đọc mục Troubleshooting về ACS/IOMMU trong tài liệu NCCL, cập nhật BIOS theo khuyến nghị của hãng máy chủ.
NET/IB: No device found
Nguyên nhân thường gặp: Chưa cài driver/OFED cho card InfiniBand/RoCE, hoặc container không được gắn thiết bị RDMA.
Bước tiếp theo
Khảo sát, thiết kế mạng RDMA, lưu trữ song song và bàn giao.
Nguồn chính chủ
Lệnh, tên gói và tham số thay đổi theo phiên bản. Trước khi chạy trên máy thật, hãy kiểm tra phiên bản mới nhất tại trang chính chủ:
- PyTorch — torchrun (Elastic Launch)
- PyTorch — FullyShardedDataParallel
- DeepSpeed — ZeRO
- Hugging Face Accelerate
- NCCL — Environment Variables
- NVIDIA nccl-tests — GitHub
Giới hạn của bài
- Bài không đưa số băng thông NCCL "chuẩn" để so sánh — mốc đúng là kết quả đo trên chính cụm của bạn lúc khoẻ.
- Bài không đi sâu tensor/pipeline parallel khi huấn luyện (Megatron-LM, NeMo) và cấu hình Slurm.
Kỹ sư HQG khảo sát, lên cấu hình, lắp đặt và bàn giao hạ tầng AI chạy được thật.