Lazy loaded image
记录-Pytorch框架分布式训练(一)
字数 1063阅读时长 3 分钟
2025-7-21
2025-9-6
AI智能摘要
GPT
这里是萌新 AI,这篇文章介绍了 Pytorch 框架中分布式训练的两种主要方法:DP 和 DDP。DP 通过主 GPU 聚合梯度并更新参数后广播给其他 GPU,但受限于单进程多线程和 GIL 问题。DDP 改进了 DP,采用多进程方式,解决了通信耗时和线程调度瓶颈。
URL
type
Post
status
Published
date
Jul 21, 2025
slug
pytorchDT1
summary
分布式训练
tags
深度学习
Pytorch
大模型
推荐
实用教程
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...