训练卡在 torch.distributed.init_process_group 是因 NCCL 网络通信失败主因是网卡选择错误或 MASTER_ADDR/PORT 不通应指定 NCCL_SOCKET_IFNAME、NCCL_BACKENDtcp显式使用 tcp:// 初始化并检查连通性。训练进程卡在 torch.distributed.init_process_group 不往下走这是最典型的“挂起”现象不是报错而是所有 rank 停在初始化阶段CPU 占用低、无日志输出。根本原因通常是网络通信没通——不是防火墙挡了端口就是 NCCL 尝试用错误的网卡比如选了虚拟机内网或 Docker bridge 网卡而非真实物理网卡。实操建议立即学习“Python免费学习笔记深入”先手动指定 NCCL 使用的网卡export NCCL_SOCKET_IFNAMEens3f0把 ens3f0 换成 ip a 里显示的、能跨节点 ping 通的物理网卡名加环境变量强制 NCCL 走 TCP绕过 IB/RoCEexport NCCL_BACKENDtcp再试一次看是否还卡检查 MASTER_ADDR 和 MASTER_PORT 是否被所有节点正确解析在每个节点上执行 ping -c 1 $MASTER_ADDR 和 nc -zv $MASTER_ADDR $MASTER_PORT别依赖默认的 init_methodenv://显式传参更可控torch.distributed.init_process_group(backendnccl, init_methodtcp://$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_memoryTrue non_blockingTrue如果是 SATA 盘或网络文件系统NFS/Ceph关掉 pin_memory否则内存拷贝反而成瓶颈加 torch.utils.data.DataLoader(..., timeout60)让卡死的 worker 主动抛异常别默默等使用 torch.nn.parallel.DistributedDataParallel 后 loss 不降或梯度为 NaNDDP 本身不改模型逻辑但会自动做梯度同步。如果 loss 异常往往不是 DDP 的锅而是同步前的计算出了问题——比如某个 rank 上的 batch 数据损坏、label 越界、或者用了未同步的随机数种子。 Mokker AI AI产品图添加背景