分布式训练错误通常分为 5 类:
典型报错
RuntimeError: No devices were found
CUDA error: invalid device ordinal排查步骤
nvidia-smi # 看 GPU 数量
echo $CUDA_VISIBLE_DEVICES✅ 检查:
CUDA_VISIBLE_DEVICES 是否设置正确local_rank 对应正确启动方式
# PyTorch DDP
torchrun --nproc_per_node=4 train.py
# 老版本
python -m torch.distributed.launch --nproc_per_node=4 train.py典型报错
NCCL error: unhandled system error
NCCL WARN ... timeout排查清单
✅ 1. 是否多机?
✅ 2. 设置 NCCL 调试信息
export NCCL_DEBUG=INFO
export NCCL_DEBUG_SUBSYS=ALL✅ 3. 常见原因
✅ 4. 强制使用 Gloo(调试用)
dist.init_process_group(backend="gloo")检查点
dist.get_rank()
dist.get_world_size()✅ 每个 rank 是否:
seed?✅ 正确做法:
sampler = DistributedSampler(
dataset,
num_replicas=world_size,
rank=rank,
shuffle=True
)⚠️ 不要同时设置
DataLoader(shuffle=True, sampler=sampler) # ❌❌ 错误
model = MyModel()✅ 正确
model = MyModel().to(local_rank)
model = DDP(model, device_ids=[local_rank])排查
for name, param in model.named_parameters():
print(rank, name, param.grad)✅ 检查:
detach()find_unused_parameters=TrueDDP(model, find_unused_parameters=True)✅ 推荐:
model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model)否则:
log_file = f"log_rank{rank}.txt"print(rank, "batch size:", len(batch))
print(rank, "loss:", loss.item())✅ 调试顺序:
单卡 → 单机多卡 → 多机| 错误现象 | 可能原因 |
|---|---|
| loss 为 NaN | 学习率、数据、BN |
| 卡住不动 | NCCL / 多机网络 |
| loss 不一致 | sampler / seed |
| 显存爆 | batch size / DDP |
| 多机失败 | 端口 / 防火墙 |
import os
import torch
import torch.distributed as dist
dist.init_process_group("nccl")
rank = dist.get_rank()
print(f"Rank {rank} ready")
# 每个 rank 单独日志你可以直接贴出:
我可以帮你 精确定位错误并给出修改代码。