数据并行 (DP)
梯度 AllReduce 怎么同步、ZeRO 怎么拆通信、推理为何免梯度
核心要点:
- DP 的基本机制:完整副本 + 梯度 AllReduce
- 梯度通信量公式与典型模型量级
- ZeRO 拆分 AllReduce 为 ReduceScatter + AllGather 的动机
- 梯度累积 + 反向 overlap 隐藏通信的方式
- 推理为什么不需要梯度 AllReduce
数据并行 (Data Parallelism, DP) 每个 worker 持完整模型副本,处理不同数据,反向后通过 AllReduce 同步梯度。是分布式训练最基础的并行策略,也是通信量最大的 ($|\theta|$ 级别)。
DP 怎么让多副本保持一致?
DP 把 global batch 切成 $N$ 份,每个 worker 处理一份,反向后 AllReduce 合并梯度:
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 更新后权重完全一致,因此前向 / 反向不需要通信,通信集中在 step 末尾的一次梯度 AllReduce。
DP 在何时通信?
经典 DP:每个 training step 反向结束后,全梯度做一次 AllReduce:
$$\begin{equation} \nabla W = \frac{1}{N} \sum_{i=0}^{N-1} \nabla W_i \label{eq:par-dp-grad-avg} \end{equation}$$ZeRO 优化 (见下文):把 AllReduce 拆成 ReduceScatter + AllGather,分散到反向过程中执行。
梯度通信量有多大?
梯度大小 = 模型参数量 × 梯度数据类型字节数:
$$\begin{equation} M_{\text{DP}} = |\theta| \cdot \text{grad\_dtype\_size} \label{eq:par-dp-comm-volume} \end{equation}$$- $|\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 |
@tbl-dp-01 典型大模型的梯度通信量
这是远超其他原语的超大消息。
DP 通信特征:
| 特征 | 值 |
|---|---|
| 通信原语 | AllReduce (经典) / ReduceScatter + AllGather (ZeRO) |
| 消息大小 | 全参数量级 (70B×2B ≈ 140 GB),强依赖模型规模 |
| 通信组大小 | 数十 ~ 数千 (跨 rack / pod) |
| 频率 | 每 training step 一次 |
| 延迟敏感性 | 低 (可与反向计算 overlap) |
| 推荐算法 | Ring AllReduce + 分层 + Overlap |
@tbl-dp-02 DP 通信特征汇总
ZeRO 为什么要把 AllReduce 拆开?
ZeRO 拆分 AllReduce,把大块通信分散成小块,便于与反向计算 overlap[1]。
ZeRO Stage 3 (梯度通信角度):
- ReduceScatter:每个 worker 只保留 $1/N$ 梯度分片,通信量与 AllReduce 相同
- AllGather:需要参数时从各 worker 收集完整参数,按需触发
对比:
经典 DP: AllReduce(∇W) — 通信量 M_DP, 每 step 一次
ZeRO-3: ReduceScatter(∇W) + AllGather(W) — 每层梯度更新后立刻 scatter
ZeRO 通信量与经典 DP 相同,但拆细后可以 overlap,实际墙钟时间下降。
怎么把 DP 通信隐藏掉?
两种手段叠加:梯度累积 + 反向 overlap。
梯度累积:累 $k$ 个 micro-batch 的梯度后再 AllReduce 一次,通信频率降为每 $k$ 次 micro-batch 一次:
$$\begin{equation} \nabla W_{\text{accum}} = \sum_{j=0}^{k-1} \nabla W_j, \quad \text{再 AllReduce } \nabla W_{\text{accum}} \label{eq:par-dp-grad-accum} \end{equation}$$反向 Overlap:反向从最后一层开始逐层计算,先完成的层立刻开始 AllReduce,与后续层计算并行:
$$\begin{equation} T_{\text{eff}} = \max(T_{\text{backward}}, T_{\text{allreduce}}) \label{eq:par-dp-overlap-eff} \end{equation}$$而非串行的 $T_{\text{backward}} + T_{\text{allreduce}}$。
Overlap 效率与场景:$T_{\text{backward}} \gg T_{\text{allreduce}}$ 时通信几乎完全隐藏。大模型 (参数多,反向计算量大) 和大 batch (计算量大) 都有更好的 overlap 效率。
推理中 DP 还需要梯度同步吗?
不需要。推理场景下各副本独立处理不同请求,无集合通信。DP 在推理中的作用是负载均衡,不是模型同步,不产生通信原语开销。
Takeaway
| 知识点 | 核心结论 |
|---|---|
| DP 基本机制 | 完整副本,每 step 末 AllReduce 同步梯度 |
| 梯度通信量 | $\lvert\theta\rvert \times \text{dtype}$,全参数量级 (70B×2B ≈ 140 GB) |
| 通信特征 | 超大消息,跨 rack / pod,低延迟敏感 |
| ZeRO 拆分目的 | AllReduce → ReduceScatter + AllGather,便于 overlap |
| 累积 + Overlap | 降频率 + 隐藏通信,大模型/大 batch 效率高 |
| 推理中的 DP | 各副本独立,不需要通信 |
@tbl-dp-03 DP 核心知识点
参考资料
- Rajbhandari et al., ZeRO: Memory Optimizations Toward Training Trillion Parameter Models, SC 2020. https://doi.org/10.1109/SC41405.2020.00024