AI智能摘要
GPT
这里是萌新AI,这篇文章介绍了 PyTorch 框架中两种分布式训练方法:DP 和 DDP。DP 是早期的数据并行方法,它通过主 GPU 汇总梯度、更新参数再广播来实现同步,但存在通信开销大和受 Python GIL 限制的问题。DDP 作为改进版本,旨在解决这些局限性,采用更高效的进程级并行来提升训练性能。
URL
type
status
date
slug
summary
tags
category
icon
password
此篇博客主要记录Pytorch框架分布式训练的主要思想。其中,主要介绍DP和DDP方法。像Tensor并行、模型并行和流水线并行不在此篇博客记录。
📝 DP
DP是Pytorch框架实现的第一个分布式数据并行方法。在每个GPU中保存一个模型,每个GPU训练sub-batch数量的样本。
那么,这里很容易产生一个疑问:模型权重如何更新呢?模型训练分为前向传播和反向传播。前向传播主要用于预测和计算损失值。反向传播分为梯度回传和参数更新。梯度回传的Pytorch代码是loss.backward()。参数更新的Pytorch代码是optimizers.step()。请注意:模型权重更新发生在optimizers.step()步骤,那么梯度回传并不会即刻改变模型的权重。
基于上述理解,DP的思想:每一块GPU都可以执行前向传播和反向传播中的梯度回传(loss.backward())。这个时候每个GPU不进行权重更新。DP算法执行Reduce操作(通信原语:将其他GPU的梯度汇合到主GPU),并求取均值。主GPU执行optimizers.step(),更新主GPU模型的参数。然后,主GPU执行Broadcast操作(通信原语:将主GPU的模型参数广播到其他GPU中)。
这便是DP方法的思想,伙伴们可以结合李沐大神《动手学深度学习》的参数服务器中的内容一起理解。如下图(引用《动手学深度学习》):其中,蓝色线指的是Reduce操作,绿色线指的是Broadcast操作。

DP代码:
DP局限性:
- 梯度Reduce操作和参数Broadcast操作耗费时间。可不可以只在一种数据上进行通信原语操作?
- DP的单进程多线层思想,即主GPU为进程,其他GPU为线程。那么Python进行线程调度时会受到GIL(GIL:简单理解为线程锁,即让线程串行执行。>>可能理解的不对<<)影响。可不可以只建立进程,而不是线程呢?
📝 DDP
DDP是对DP的改进,解决了DP的局限性。DDP的思想与DP相似,也是将模型复制到每个GPU中,每个GPU训练sub-batch数量的样本。
DDP与DP的不同点有两个:
- DDP将每个GPU作为一个进程,那么在进行Python操作(Reduce或者Broadcast)时,不会受到GIL的影响。
- DDP不再执行模型参数Broadcast操作。那么每个GPU上的模型如何更新参数呢?只能是每个GPU自行执行参数更新,即optimizers.step()。从这里可以倒推出:每个GPU模型的梯度是一样的。如何让每个GPU上的梯度一样呢?每个GPU汇合了其他所有GPU的的梯度,即执行All Reduce操作(通信原语:Reduce + Broadcast)。
如下图(引用《动手学深度学习》):其中,蓝色线指的是ALL Reduce操作,绿色线指的是optimizers.step()操作。

DDP代码:
gitee中的代码只需要关注torchrun运行方法即可。
🤗 总结归纳
DP和DDP都是数据并行的实现方法。在数据并行方法中,推荐使用DDP方法。Pytorch除了数据并行,还有Tensor并行、模型并行、流水线并行和FSDP方法。Tensor并行、模型并行和流水线并行将在Pytorch框架分布式训练(二)记录,FSDP方法将在Pytorch框架分布式训练(三)记录。
📎 参考文章
以上便是Pytorch数据并行学习记录分享,欢迎您在底部评论区留言,一起交流~
- 作者:不爱吃香菜的萌新
- 链接:https://hexo.levsongsw.com//deeplearn/pytorchDT1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。



![[pytorch distributed] 01 nn.DataParallel 数据并行初步_哔哩哔哩_bilibili](https://www.notion.so/image/https%3A%2F%2Fi2.hdslb.com%2Fbfs%2Farchive%2F92ef5011da5f7ff1158fe181af1880af2104d570.jpg%40100w_100h_1c.png%4057w_57h_1c.png?table=block&id=23702083-7c21-8000-901c-fa3b8864d956&t=23702083-7c21-8000-901c-fa3b8864d956)
![[pytorch distributed] 01 nn.DataParallel 数据并行初步_哔哩哔哩_bilibili](https://www.notion.so/image/https%3A%2F%2Fi2.hdslb.com%2Fbfs%2Farchive%2F92ef5011da5f7ff1158fe181af1880af2104d570.jpg%40100w_100h_1c.png?table=block&id=23702083-7c21-8000-901c-fa3b8864d956&t=23702083-7c21-8000-901c-fa3b8864d956)




