Pipeline Parallelism, PP,是把模型层切分到不同 GPU 或 GPU 组上,让不同设备负责不同层段。它解决的是模型深度和总参数量太大,单个 GPU 或单个 tensor-parallel group 无法容纳完整模型的问题。

与 Tensor Parallel 切分单层内部矩阵不同,pipeline parallel 切分的是层序列;与 Data Parallel 不同,每个 pipeline stage 只保存模型的一部分层。

Layer Partition

设模型有 层,pipeline parallel size 为 。最简单做法是每个 stage 放约 层:

Stage 0: layers 0 ... k
Stage 1: layers k+1 ... m
Stage 2: layers m+1 ... n
...

forward 时 activation 从前一 stage 传到后一 stage;backward 时 gradient 从后一 stage 传回前一 stage。

如果层计算量不均匀,需要手动或自动 balance。embedding、LM head、MoE layers、长上下文 attention 都可能造成 stage 不均衡。

Micro-batch 与 Pipeline Bubble

如果整个 batch 一次性通过 pipeline,后面的 stage 会在开始时空闲,前面的 stage 会在结束时空闲。这些空闲称为 pipeline bubble。

为提高利用率,通常把 global batch 切成多个 micro-batches,让不同 micro-batch 同时处在不同 stage:

time →
Stage 0: mb1 F  mb2 F  mb3 F  ...
Stage 1:        mb1 F  mb2 F  ...
Stage 2:               mb1 F  ...

micro-batch 数越多,bubble 占比通常越低,但 activation buffering、调度复杂度和优化约束增加。

GPipe 与 1F1B

常见调度策略:

  • GPipe-style:先完成所有 micro-batch forward,再做 backward。实现直观,但需要保存较多 activation。
  • 1F1B:warmup 后每个 stage 交替做 one forward / one backward,减少 activation peak。
  • Interleaved 1F1B:把每个设备上的层再切成 virtual pipeline stages,提高负载均衡并减少 bubble。

1F1B 是大模型训练中常见策略,因为它在显存和吞吐之间更平衡。

DualPipe 与 MoE 通信重叠

DeepSeek-V3 在 16-way Pipeline Parallelism 和 64-way Expert Parallelism 上使用 DualPipe,目标是把 cross-node expert parallelism 的 all-to-all 通信隐藏在 forward / backward 计算中。

一个 forward / backward chunk 会被拆成 attention、all-to-all dispatch、MLP、all-to-all combine,以及 backward for input、backward for weights 和 PP communication。DualPipe 重新安排一对 forward / backward chunks,并采用 bidirectional pipeline,同时从 pipeline 两端输入 micro-batches,使计算、expert dispatch / combine 和相邻 stage 通信尽量重叠。

它的意义不只是减少 pipeline bubble。MoE 中 token 会被动态发送到远端 experts,如果 dispatch 与 MLP 串行执行,sparse computation 的收益会被网络延迟抵消。DualPipe 配合 node-limited routing、定制 all-to-all kernels、IB / NVLink 分层转发和独立 communication stream,可以把通信从显式等待变成计算期间的后台工作。

相应的取舍是:

  • 比 1F1B 需要更多 activation buffering;
  • 需要保存两份 model parameters;
  • 调度与 debug 复杂度更高;
  • 需要根据 communication / computation ratio 手工配置资源;
  • 性能高度依赖网络拓扑和 kernel 实现。

因此,DualPipe 适合超大规模、通信占比较高的 MoE 训练,不应被理解为所有 pipeline training 的默认替代方案。

GPipe 的同步更新语义

GPipe 的关键设计是:把一个 mini-batch 切成多个 micro-batches,先让它们流水通过所有 stages,再累积所有 micro-batch 的梯度,最后统一执行一次 optimizer update。

固定参数 W
  -> mb_1 forward / backward
  -> mb_2 forward / backward
  -> ...
  -> 累积梯度
  -> 一次更新得到 W'

因此,同一个 mini-batch 内的 micro-batch 使用同一组参数。它与异步 pipeline 的主要差异在于不会因为 stage 更新时序不同而产生 weight staleness,但代价是需要等待整个 mini-batch 的梯度完成。

GPipe 还结合 rematerialization:forward 阶段主要保存 pipeline partition 边界的 activation,backward 阶段重新计算 cell 内部的 forward,以降低 activation memory。论文实验中,当 micro-batch 数量达到 partition 数量的约 4 倍时,pipeline bubble 通常已经较小。

GPipe 的通信只发生在相邻 stage 边界,主要传递 activation 和 activation gradient;它不负责切分单个 layer 内部的矩阵。后者属于 Tensor Parallel,也是 Megatron-LM 的主要方向。

通信

PP 的通信主要是相邻 stage 之间传 activation 和 activation gradient。通信量与 micro-batch size、sequence length、hidden size 相关:

相比 TP 的层内高频 collective,PP 通信更局部,但会引入 pipeline latency 和调度复杂度。

与 Gradient Accumulation

Pipeline training 通常需要 gradient accumulation。多个 micro-batches 通过 pipeline 后,累积梯度,再做一次 optimizer step。

global batch size 仍然满足:

其中 是每个 micro-batch 的 token 或 sample 数。PP 配置会影响可用 micro-batch 数,从而影响 global batch 和优化 recipe。

适用场景

PP 适合:

  • 模型层数多或总参数量很大;
  • TP 后仍无法放下完整模型;
  • 大规模预训练;
  • GPU 数足够多,可以组合 TP/PP/DP;
  • 愿意接受更复杂的调度和 checkpoint。

对中小模型或后训练,FSDP/ZeRO 往往更简单;PP 的复杂度不一定值得。

在包含 TP/PP/DP/CP 的训练栈中,pipeline stage 只保存模型的一部分层。checkpoint、dataloader 和日志都需要记录 pipeline rank。否则恢复训练或导出完整权重时,容易出现层顺序错位、stage 缺失或 optimizer state 对不上参数的问题。

常见失败模式

  • pipeline bubble 大:micro-batch 太少,GPU 利用率低。
  • stage imbalance:某些 stage 计算更慢,拖累整体吞吐。
  • activation memory 高:调度不当保存过多 micro-batch activation。
  • 跨节点 stage 通信慢:相邻 stage 放在低带宽链路上。
  • debug 困难:错误可能只在特定 stage 或 micro-batch 出现。
  • checkpoint 复杂:模型按 stage 分片保存和恢复。

相关概念