Python中PyTorch实现分布式训练挂起_检查网络带宽与IO瓶颈
训练卡在 torch.distributed.init_process_group 是因 NCCL 网络通信失败,主因是网卡选择错误或 MASTER_ADDR/PORT 不通;应指定 NCCL_SOCKET_IFNAME、NCCL_BACKEND=tcp,显式使用 tcp:// 初始化,并检查连通性。训练进程卡在 torch.distributed.init_process_group 不往下走这是最典型的“挂起”现象,不是报错,而是所有 rank 停在初始化阶段,CPU 占用低、无日志输出。根本原因通常是网络通信没通——不是防火墙挡了端口,就是 NCCL 尝试用错误的网卡(比如选了虚拟机内网或 Docker bridge 网卡,而非真实物理网卡)。实操建议:立即学习“Python免费学习笔记(深入)”;先手动指定 NCCL 使用的网卡:export NCCL_SOCKET_IFNAME=ens3f0(把 ens3f0 换成 ip a 里显示的、能跨节点 ping 通的物理网卡名)加环境变量强制 NCCL 走 TCP(绕过 IB/RoCE):export NCCL_BACKEND=tcp,再试一次,看是否还卡检查 MASTER_ADDR 和 MASTER_PORT 是否被所有节点正确解析:在每个节点上执行 ping -c 1 $MASTER_ADDR 和 nc -zv $MASTER_ADDR $MASTER_PORT别依赖默认的 init_method='env://',显式传参更可控:torch.distributed.init_process_group(backend='nccl', init_method='tcp://$MASTER_ADDR:$MASTER_PORT', rank=$RANK, world_size=$WORLD_SIZE)ncclTimeout 错误或 GPU 显存暴涨后挂住NCCL 在集合通信(如 allreduce)时等不到某个 rank 的数据,超时后可能静默卡死,或触发重试导致显存持续增长。常见于 IO 瓶颈:数据加载慢 → 某个 rank 的 forward 拖后腿 → 其他 rank 在 backward 阶段等它 → NCCL 同步阻塞。实操建议:立即学习“Python免费学习笔记(深入)”;用 nvidia-smi dmon -s u -d 1 观察各 GPU 的 util%,如果某卡长期 把 DataLoader 的 num_workers 设为 0 先跑通,排除子进程初始化问题;再逐步加到 min(8, os.cpu_count()),避免 fork 太多进程压垮 IO确认磁盘类型:NVMe SSD 可以开 pin_memory=True + non_blocking=True;如果是 SATA 盘或网络文件系统(NFS/Ceph),关掉 pin_memory,否则内存拷贝反而成瓶颈加 torch.utils.data.DataLoader(..., timeout=60),让卡死的 worker 主动抛异常,别默默等使用 torch.nn.parallel.DistributedDataParallel 后 loss 不降或梯度为 NaNDDP 本身不改模型逻辑,但会自动做梯度同步。如果 loss 异常,往往不是 DDP 的锅,而是同步前的计算出了问题——比如某个 rank 上的 batch 数据损坏、label 越界、或者用了未同步的随机数种子。 Mokker AI AI产品图添加背景
