在Python中如何通过PyTorch的DDP实现多机多卡分布式训练?

P粉602998670

P粉602998670

2026-08-04

576人浏览

原创

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

在python中如何通过pytorch的ddp实现多机多卡分布式训练?

为什么 torch.distributed.launch 在多机场景下不推荐用了

PyTorch 1.9+ 已明确弃用 torch.distributed.launch,它无法可靠处理多机间进程同步、网络地址发现和故障恢复。实际跑多机时,你会遇到 ConnectionRefusedErrorRuntimeError: unable to open shared memory object 或 worker 卡在 init_process_group 等问题——根本原因是 launch 脚本没做跨节点的 TCP/NCCL 初始化协调。

正确做法是手动启动每个节点上的训练进程,并显式指定 --master_addr--master_port,由用户控制主节点(rank 0)所在机器的 IP 和端口。

  • 所有节点必须能通过 ssh 无密互通,且时间同步(ntpdatechrony
  • 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 3.14.2

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.reducetorch.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 networkConnectedRank 是否匹配预期
  • 若卡在 init,用 netstat -tuln | grep PORT 确认主节点端口确实在 LISTEN,且防火墙放行(ufw allow PORT

真正麻烦的是异构环境:不同机器 CUDA 版本差一个小版本、NCCL 库路径不一致、甚至 Docker 容器里没挂载 /dev/infiniband——这些问题不会报明显错误,但会导致随机 hang 或 NCCL_TIMEOUT。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1104

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2071

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1185

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8797

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1479

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1550

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

881

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

530

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习