数据并行简单易用,是大模型训练基础方式。DDP在每个GPU上拷贝一份模型状态,大量的显存被冗余状态占用。FSDP借鉴零冗余优化器的思想对模型状态进行分片后,由不同的GPU负责维护,使用数据并行训练超大规模的模型成为可能。
1)数据并行中,训练设备配置和数据分发机制介绍。 2)反向计算梯度后怎样进行梯度同步,使计算和通信耗时重叠。 3)FSDP在数据并行基础上,分片模型状态优化内存占用。
每个计算的设备都有整个模型的副本,根据整个数据集的一个子集进行前向计算。假设训练样本为D,使用N个加速卡进行计算,每个计算设备会分配到 个样本,并使用这些样本分批计算梯度 ,并将梯度进行广播,所有计算设备聚合到其他N-1个梯度后,使用平均梯度 进行模型参数更新。在实际模型训练中一般采用分布式数据并行 DDP (Distributed Data Parallel)。
假设训练设备有:2个主机 (node),每个主机上有3张GPU计算设备,共6张卡。名词解释:
数据分配代码:
indices = indices[self.rank:self.total_size:self.num_replicas]
"""
self.rank 即 Global Rank,
self.total_size,总的数据量。
self.num_replicas,即worldsize。
"""在每个host上运行启动命令,建立DDP组,等待每个GPU设备测试通信正常后,即可开始训练。

图1,数据并行设备介绍
2.1,DDP参数更新过程
分布式训练需要同步每个GPU设备上的梯度,获得一致的参数更新。具体步骤如下:

图2,分布式数据并行训练过程。
在第四步时进行梯度的all-reduce 操作,将所有GPU设备上的梯度进行求和取平均。使用ring-all-reduce算法,通信量为两倍的参数量。

图3,集合通信all-reduce操作示意图
梯度依赖关系:反向传播的梯度计算,天然具有层间独立性(如第L层梯度不依赖第L-1层),使得流水线设计可行。
目标:通过梯度流水线化,将梯度全归约的通信时间隐藏在计算梯度的时间内,减少整体训练耗时。理想情况下,通信时间被完全覆盖,训练速度仅由计算时间决定。
小结:DDP通过分布式多进程设计、去中心化梯度同步、计算与通信重叠等优化,显著解决了数据并行的冗余拷贝、线程开销、主GPU瓶颈等问题,适合大规模分布式训练场景。
DDP数据并行中每个GPU设备都拷贝了一份模型状态副本,冗余的拷贝使得显存开销巨大。FSDP (Fully Sharded Data Parallelism) 是一种分布式训练技术,通过分片(Sharding) 模型参数、梯度和优化器状态,将大型模型的训练负载分散到多个GPU或计算节点上,从而解决传统数据并行在训练超大模型时的内存瓶颈问题。
其核心思想源自 ZeRO (Zero Redundancy Optimizer) 优化器,通过分片模型状态,消除内存冗余实现内存高效利用。

图4,数据并行中FSDP训练流程。
特性 | DDP | FSDP |
|---|---|---|
目标 | 多级多卡分布式训练,消除中心节点瓶颈 | 超大规模训练,通过分片解决显存不足问题 |
并行维度 | 纯数据并行 | 数据并行+模型参数并行 |
内存占用 | 冗余存储:每个GPU保存完整的模型、梯度、优化器状态 | 无冗余存储:模型参数、梯度、优化器状态分片,显存降低至 1/N |
通信机制 | 多进程all-reduce同步梯度,使用 NCCL/GLOO后端 | 分片参数动态拉取 + All-Gather/Reduce-Scatter。通信开销较高,但支持计算与通信重叠 |
模型同步 | 初始同步,进程启动时广播一次模型参数,后续通过梯度同步自动保持一致,无需重复同步。 | 动态分片同步,初始时分片参数广播到各GPU,前向/反向传播中按需拉取其他分片参数,通过梯度同步保持一致。 |
数据分发 | 进程独立加载,每个GPU进程直接从主机内存加载完整数据,按本地batch size切分,无主机分发。 | 与DDP相同,数据直接加载到各GPU内存中。 |
参数更新 | 各GPU独立更新,所有GPU给予同步后的梯度独立更新本地完整模型参数。 | 分片独立更新。各GPU仅更新本地分片对应的参数,无需全局同步。 |
GPU利用率 | 均衡,计算与通信重叠,各GPU负载均匀,利用率接近100% | 接近均衡。分片参数引入额外开销,但计算与通信流水线化实现较高利用率。略低于DDP |
参考: [1] blog: Distributed data parallel training using Pytorch on AWS Telesens