数据并行(Data Parallelism)
数据并行(DP)是分布式训练中最基础的并行策略。每个 DP worker 持有完整的模型副本,处理不同的数据批次,在反向传播结束后通过梯度同步保持模型一致性。DP 在推理场景中不需要梯度同步,各副本独立处理不同请求。
基本原理
DP 将 global batch 切分为 $N$ 份,每个 worker 处理其中一份:
Worker 0: [data_0] → forward → backward → ∇W_0
Worker 1: [data_1] → forward → backward → ∇W_1
...
Worker N-1: [data_{N-1}] → forward → backward → ∇W_{N-1}
↓
AllReduce 同步梯度
∇W = (1/N) Σ ∇W_i
↓
每个 worker 用相同 ∇W 更新参数
每个 worker 的模型权重在更新后保持完全一致,因此无需在前向/反向传播中通信——通信集中在每个 training step 结束时的一次梯度 AllReduce。
通信时机
经典 DP:每个 training step 的反向传播结束后,对全部梯度执行一次 AllReduce:
$\nabla W = \frac{1}{N} \sum_{i=0}^{N-1} \nabla W_i$
ZeRO 优化(见下文):将 AllReduce 拆分为 ReduceScatter + AllGather,分散到反向传播过程中执行。
通信量分析
梯度大小等于模型参数量乘以梯度数据类型的字节数:
$M_{\text{DP}} = |\theta| \times \text{grad\_dtype\_size}$
其中 $|\theta|$ 为模型参数总量(个数),$\text{grad\_dtype\_size}$ 为梯度数据类型字节数(通常 BF16 = 2 或 FP32 = 4)。
典型模型的梯度通信量:
| 模型 | 参数量 | BF16 梯度总量 | FP32 梯度总量 |
|---|---|---|---|
| LLaMA-70B | 70B | 140 GB | 280 GB |
| Qwen-72B | 72B | 144 GB | 288 GB |
| DeepSeek-V3 | 671B | 1.34 TB | 2.68 TB |
这是超大消息,远超其他任何通信原语。
DP 通信特征汇总:
| 特征 | 值 |
|---|---|
| 通信原语 | AllReduce(经典 DP)/ ReduceScatter + AllGather(ZeRO) |
| 消息大小 | 100 GB ~ TB 级别 |
| 通信组大小 | 数十 ~ 数千(跨 rack/pod) |
| 频率 | 每 training step 一次 |
| 延迟敏感性 | 较低(可与反向计算 overlap) |
| 推荐算法 | Ring AllReduce + 分层 + Overlap |
ZeRO 优化
ZeRO(Zero Redundancy Optimizer,Rajbhandari et al., SC 2020)通过切分优化器状态、梯度、参数消除 DP 的显存冗余。
ZeRO Stage 3(梯度通信角度):
将每个 training step 的 AllReduce 拆分为:
- ReduceScatter:每个 worker 只保留 $1/N$ 的梯度分片,通信量与 AllReduce 相同
- AllGather:在需要参数时从各 worker 收集完整参数,按需触发
经典 DP: AllReduce(∇W) — 通信量 M_DP,每步一次
ZeRO-3: ReduceScatter(∇W) + AllGather(W) — 每个层的梯度更新后立刻 scatter
ZeRO 的通信量与经典 DP 相同(总字节数不变),但将大块通信分散成多个小块,便于与反向传播 overlap。
梯度累积与计算-通信重叠
梯度累积
累积 $k$ 个 micro-batch 的梯度后再做一次 AllReduce,将通信频率从每 micro-batch 一次降为每 $k$ 个 micro-batch 一次:
$\nabla W_{\text{accum}} = \sum_{j=0}^{k-1} \nabla W_j, \quad \text{再 AllReduce } \nabla W_{\text{accum}}$
反向传播 Overlap
反向传播从最后一层开始逐层计算梯度,先完成的层的梯度可以立即开始 AllReduce,与后续层的梯度计算并行:
$T_{\text{eff}} = \max(T_{\text{backward}}, T_{\text{allreduce}})$
而非串行的 $T_{\text{backward}} + T_{\text{allreduce}}$。
当 $T_{\text{backward}} \gg T_{\text{allreduce}}$ 时,通信几乎完全被隐藏。大模型(参数量大,反向计算量大)和大 batch 场景(计算量进一步增大)有更好的 overlap 效率。
推理中的 DP
推理场景下 DP 不需要梯度同步——各副本独立处理不同用户的请求,无集合通信。DP 在推理中的作用是负载均衡,而非模型同步,不涉及通信原语开销。
参考文献
- Rajbhandari et al., "ZeRO: Memory Optimizations Toward Training Trillion Parameter Models", SC 2020. https://doi.org/10.1109/SC41405.2020.00024
- Zhao et al., "PyTorch FSDP: Experiences on Scaling Fully Sharded Data Parallel", VLDB 2023. https://arxiv.org/abs/2304.11277