Lazy loaded image
记录-Pytorch框架分布式训练(一)
字数 1063阅读时长 3 分钟
2025-7-21
2025-9-6
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操作。
notion image
DP代码:
DP局限性:
  • 梯度Reduce操作和参数Broadcast操作耗费时间。可不可以只在一种数据上进行通信原语操作?
  • DP的单进程多线层思想,即主GPU为进程,其他GPU为线程。那么Python进行线程调度时会受到GIL(GIL:简单理解为线程锁,即让线程串行执行。>>可能理解的不对<<)影响。可不可以只建立进程,而不是线程呢?

📝 DDP

DDP是对DP的改进,解决了DP的局限性。DDP的思想与DP相似,也是将模型复制到每个GPU中,每个GPU训练sub-batch数量的样本。
DDP与DP的不同点有两个:
  1. DDP将每个GPU作为一个进程,那么在进行Python操作(Reduce或者Broadcast)时,不会受到GIL的影响。
  1. DDP不再执行模型参数Broadcast操作。那么每个GPU上的模型如何更新参数呢?只能是每个GPU自行执行参数更新,即optimizers.step()。从这里可以倒推出:每个GPU模型的梯度是一样的。如何让每个GPU上的梯度一样呢?每个GPU汇合了其他所有GPU的的梯度,即执行All Reduce操作(通信原语:Reduce + Broadcast)
如下图(引用《动手学深度学习》):其中,蓝色线指的是ALL Reduce操作,绿色线指的是optimizers.step()操作。
notion image
DDP代码:
gitee中的代码只需要关注torchrun运行方法即可。

🤗 总结归纳

DP和DDP都是数据并行的实现方法。在数据并行方法中,推荐使用DDP方法。Pytorch除了数据并行,还有Tensor并行、模型并行、流水线并行和FSDP方法。Tensor并行、模型并行和流水线并行将在Pytorch框架分布式训练(二)记录,FSDP方法将在Pytorch框架分布式训练(三)记录。

📎 参考文章

 
💡
以上便是Pytorch数据并行学习记录分享,欢迎您在底部评论区留言,一起交流~
 
上一篇
书籍-《许三观卖血记》
下一篇
记录-Pytorch框架分布式训练(二)

评论
Loading...