首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >简述数据并行 - DP, DDP, FSDP的数据分片、梯度同步和参数更新过程

简述数据并行 - DP, DDP, FSDP的数据分片、梯度同步和参数更新过程

作者头像
AI老马
发布2026-01-13 14:50:14
发布2026-01-13 14:50:14
3640
举报
文章被收录于专栏:AI前沿技术AI前沿技术
1,数据切片到GPU设备

数据并行需要在每个计算设备上都有一份模型拷贝,整个的数据被分片到不同的计算设备计算梯度,为了保持参数的一致性,需要在更新参数前进行梯度参数的通信,进行梯度平均,然后获得一致性的参数更新。

怎样对训练数据进行分片,每个设备能获得不同的batch数据,最后完成整个数据的迭代。

训练设备 testbed:2个主机 (node),每个主机上有3张GPU计算设备,共6张卡。

名词解释:

  • • Host:可以理解为一台主机,每个主机有自己的IP地址,用于通信。
  • • Local Rank:每个主机上,对不同GPU设备的编。
  • • Global Rank:全局的GPU设备编号,Global Rank = Host * num GPUs per host + Local Rank。
  • • Worldsize:总的GPU个数。num Hosts * num GPUs per host

数据分配代码:

代码语言:javascript
复制
indices = indices[self.rank:self.total_size:self.num_replicas]
"""
self.rank 即 Global Rank,
self.total_size,总的数据量。
Self.num_replicas,即worldsize。
"""

在每个host上运行启动命令,建立DDP组,等待每个GPU设备测试通信正常后,即可开始训练。

2,DDP参数更新过程

分布式训练需要同步每个GPU设备上的梯度,获得一致的参数更新。具体步骤如下:

  • • 加载数据到内存,并为每个设备分配不同的数据片。
  • • 数据加载到GPU的内存中。
  • • 每个GPU设备开始独立的进行前向计算,获得损失。
  • • 反向传播计算梯度。并且需要进行梯度的 all-reduce 通信,使得每个GPU设备获得平均梯度。
  • • 更新参数,所有的GPU设备上的模型副本获得一致性的参数更新。

在第四步时进行梯度的all-reduce 操作,将所有GPU设备上的梯度进行求和取平均。使用ring-all-reduce算法,通信量为两倍的参数量。

更详细的通信量计算可以参考/[2]/[3]

总结:DDP通过分布式多进程设计、去中心化梯度同步、计算与通信重叠等优化,显著解决了 DP的冗余拷贝、线程开销、主GPU瓶颈等问题,尤其适合大规模分布式训练场景。

3,DDP更进一步!FSDP

FSDP (Fully Sharded Data Parallelism) 是一种分布式训练技术,通过分片(Sharding) 模型参数、梯度和优化器状态,将大型模型的训练负载分散到多个GPU或计算节点上,从而解决传统数据并行方法(如DDP) 在训练超大模型时的内存瓶颈问题。

其核心思想源自 ZeRO (Zero Redundancy Optimizer) 优化器 (如DeepSpeed 的ZeRO-3阶段),通过消除内存冗余实现内存高效利用。

4,总结

DP-DDP-FSDP, 是pytorch的官方实现,兼容性较好,推荐使用DDP。

特性

DP

DDP

FSDP

目标

单机多卡数据并行加速

多级多卡分布式训练,消除中心节点瓶颈

超大规模训练,通过分片解决显存不足问题

并行维度

纯数据并行

纯数据并行

数据并行+模型参数并行

内存占用

冗余存储:每个GPU保存完整的模型、梯度、优化器状态

冗余存储:每个GPU保存完整的模型、梯度、优化器状态

无冗余存储:模型参数、梯度、优化器状态分片,显存降低至 1/N

通信机制

主GPU聚合梯度,单进程多线程

多进程all-reduce同步梯度,使用 NCCL/GLOO后端

分片参数动态拉取 + All-Gather/Reduce-Scatter。通信开销较高,但支持计算与通信重叠

模型同步

每次前向传递前同步,主GPU将模型参数广播到其他GPU,确保副本一致。

初始同步,进程启动时广播一次模型参数,后续通过梯度同步自动保持一致,无需重复同步。

动态分片同步,初始时分片参数广播到各GPU,前向/反向传播中按需拉取其他分片参数,通过梯度同步保持一致。

数据分发

主GPU分发,数据从主机内存复制到主GPU,在分割为子批次分发到其他的GPU中。

进程独立加载,每个GPU进程直接从主机内存加载完整数据,按本地batch size切分,无主机分发。

与DDP相同,数据直接加载到各GPU内存中。

参数更新

主GPU更新后,将参数广播到其他GPU。

各GPU独立更新,所有GPU给予同步后的梯度独立更新本地完整模型参数。

分片独立更新。各GPU仅更新本地分片对应的参数,无需全局同步。

GPU利用率

不均衡,主GPU负载远高于其他GPU。

均衡,计算与通信重叠,各GPU负载均匀,利用率接近100%

接近均衡。分片参数引入额外开销,但计算与通信流水线化实现较高利用率。略低于DDP

参考:

代码语言:javascript
复制
[1] blog: Distributed data parallel training using Pytorch on AWS _ Telesens 
[2] https://tech.preferred.jp/en/blog/technologies-behind-distributed-deep-learning-allreduce/
[3] https://andrew.gibiansky.com/blog/machine-learning/baidu-al1reduce/
[4] https://medium.com/@davechirav/distributed-training-demystified-a-beginners-guide-to-ddp-fsdp-4c7f12973108
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI老马啊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1,数据切片到GPU设备
  • 2,DDP参数更新过程
  • 3,DDP更进一步!FSDP
  • 4,总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档