跳到主要内容

数据并行 (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-70B70B140 GB280 GB
Qwen-72B72B144 GB288 GB
DeepSeek-V3671B1.34 TB2.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 核心知识点

参考资料

  1. Rajbhandari et al., ZeRO: Memory Optimizations Toward Training Trillion Parameter Models, SC 2020. https://doi.org/10.1109/SC41405.2020.00024