torch.distributed.launch 已被弃用,因其无法可靠处理多机进程同步、地址发现与故障恢复,易引发 connectionrefusederror 或 init_process_group 卡死;推荐改用 torchrun 并显式配置 --nnodes、--node_rank 及 nccl 环境变量。

为什么 torch.distributed.launch 在多机场景下不推荐用了
PyTorch 1.9+ 已明确弃用 torch.distributed.launch,它无法可靠处理多机间进程同步、网络地址发现和故障恢复。实际跑多机时,你会遇到 ConnectionRefusedError、RuntimeError: unable to open shared memory object 或 worker 卡在 init_process_group 等问题——根本原因是 launch 脚本没做跨节点的 TCP/NCCL 初始化协调。
正确做法是手动启动每个节点上的训练进程,并显式指定 --master_addr 和 --master_port,由用户控制主节点(rank 0)所在机器的 IP 和端口。
- 所有节点必须能通过
ssh无密互通,且时间同步(ntpdate或chrony) - NCCL 环境变量需提前设置,例如:
export NCCL_SOCKET_IFNAME=ib0(RDMA)或eth0(以太网) - 确保每台机器的
MASTER_ADDR指向同一主节点 IP,MASTER_PORT相同且未被占用 - 各节点启动命令中,
--nproc_per_node只作用于本地卡数,--nnodes和--node_rank才决定全局拓扑
怎么写一个兼容单机/多机的 DDP 初始化函数
别依赖 os.environ 自动读取 rank/world_size——多机环境下这些变量不会自动注入,必须显式传入或从命令行解析。推荐用 argparse 统一管理,再调用 torch.distributed.init_process_group。
关键点:backend 必须选 nccl(GPU 训练),timeout 建议设为 timedelta(seconds=1800) 避免因网络抖动误判失败;init_method='env://' 表示从环境变量读配置,但你要确保它们已被正确设置。
-
rank:全局唯一序号,主节点为 0,其他节点按顺序递增 -
world_size= 总卡数 =node_count × gpus_per_node - 每个进程必须绑定唯一 GPU:
torch.cuda.set_device(local_rank),其中local_rank是本机内卡序号(0~7) - 务必在模型包装前调用
init_process_group,否则DistributedDataParallel会报Default process group is not initialized
如何避免 DistributedDataParallel 的常见内存与梯度错误
DDP 不是“套一层就完事”。模型输出、loss 计算、metric 收集都得适配分布式语义,否则会出 silent bug:比如 loss 值比单卡小 N 倍,或 accuracy 在不同卡上结果不一致。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
最常踩的坑是忘记用 torch.nn.parallel.DistributedDataParallel 包装模型,而直接用了 DataParallel——后者只支持单机多卡,多机下会 crash 或 hang 住。
- 模型参数初始化必须在
init_process_group之后、DDP 包装之前完成,否则不同卡加载的初始权重可能不一致 - loss 必须用
reduction='mean'(默认),且不能在 backward 前做.item()或.cpu()——这会破坏梯度计算图 - 验证阶段要用
torch.distributed.reduce或torch.distributed.all_gather汇总各卡结果,不能只看 rank 0 的 batch 结果 - 保存 checkpoint 时,只让
rank == 0执行torch.save,否则多卡重复写会损坏文件
多机训练时怎么查错和调试最有效
别一上来就跑 full batch。先用最小配置验证通信通路:两台机器各起 1 卡,运行一个只做 all_reduce 的 dummy script。
核心检查项:
- 执行
python -c "import torch; print(torch.distributed.is_available())",确认每台机器都编译了 NCCL 支持 - 运行
nccl-tests(如all_reduce_perf -b 8 -e 1G -f 2),验证 RDMA/IB 或 TCP 吞吐是否正常 - 查看
NCCL_DEBUG=INFO日志,重点搜Using network、Connected、Rank是否匹配预期 - 若卡在 init,用
netstat -tuln | grep PORT确认主节点端口确实在 LISTEN,且防火墙放行(ufw allow PORT)
真正麻烦的是异构环境:不同机器 CUDA 版本差一个小版本、NCCL 库路径不一致、甚至 Docker 容器里没挂载 /dev/infiniband——这些问题不会报明显错误,但会导致随机 hang 或 NCCL_TIMEOUT。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










