分布式训练排障:从挂起、NCCL 报错、OOM 到 straggler 的定位顺序
分布式训练失败通常不是单一原因:进程组没建起来、NCCL 选错网卡、共享内存不足、某个 rank OOM、数据读取卡住、checkpoint 写爆磁盘,都会表现成“训练挂了”或“loss 不动”。排障顺序应该是:先确认单机能跑,再扩到 2 卡,最后上多机;先排除环境/网络,再怀疑算法。
常见症状:启动即报 NCCL error、训练几分钟后 hang、某个 rank OOM、GPU 利用率周期性掉零、loss 突然 NaN、checkpoint 保存失败。每一类都有对应的日志和工具,不要一上来就改 batch size 或重启。
# 单机 8 卡最小复现
torchrun --standalone --nproc_per_node=8 train.py
# 打开分布式与 NCCL 调试日志
NCCL_DEBUG=INFO NCCL_DEBUG_SUBSYS=ALL \
TORCH_DISTRIBUTED_DEBUG=DETAIL \
torchrun --standalone --nproc_per_node=8 train.py
# 先验证多卡通信本身
./build/all_reduce_perf -b 8 -e 1G -f 2 -g 8
# 卡住时抓取进程栈(Python)
py-spy dump --pid <PID>
# 查看 GPU、进程和共享内存
nvidia-smi
df -h /dev/shm
ipcs -m
ulimit -a
# 查看内核 OOM/网络错误
dmesg -T | tail -50
journalctl -k --since '30 min ago' | grep -i -E 'oom|nvrm|xid|ib|mlx'
多机时先确认所有节点能互相解析、时间同步、MTU 一致、IB/RoCE 网卡可见,再检查 MASTER_ADDR/PORT 和防火墙。
NCCL_DEBUG=INFO 开太晚:启动阶段就失败时,日志要在进程启动前设置;容器里还要确认环境变量透传。/dev/shm,容器里常只有 64MB;增大 --shm-size 或减少 workers。NCCL_SOCKET_IFNAME、NCCL_IB_HCA 指定,并看 nvidia-smi topo -m。nsys 看时间线,检查 ECC、降频、数据读取和 NUMA。timeout,不要盲目无限等待。--ipc=host、共享内存、IB 设备、网络模式要满足 NCCL 要求;K8s 里检查 device plugin 和 CNI。合上页面,先回答,再展开对照。
NCCL_DEBUG=INFO 主要能帮助定位什么?/dev/shm?/dev/shm,容器默认可能只有 64MB,容易导致卡住或 Bus error;要增大共享内存或减少 workers。
小程序版
微信扫码,随时查命令