Skip to content

10.4 流水线并行(Pipeline Parallelism)

流水线并行是大模型分布式训练的核心并行策略之一。它将模型按深度方向(层)切分为若干阶段(Stage),每个阶段分配到不同的 GPU 上,数据像工厂流水线一样依次流经各个设备。与张量并行频繁的 All-Reduce 通信不同,流水线并行只需在相邻阶段之间进行点对点传输,对网络带宽的要求更低,因此特别适合**跨节点(inter-node)**部署。

然而,朴素的流水线并行存在致命的效率缺陷:当第一个 GPU 在处理数据时,其余所有 GPU 都在空闲等待——这种设备空转被称为流水线气泡(Pipeline Bubble)。本节将沿着气泡率不断降低的技术演进线索,依次介绍 GPipe、1F1B、1F1B Interleaved、零泡沫流水线并行(Zero-Bubble PP),以及 DeepSeek-V3 所采用的 DualPipe 架构。


10.4.1 朴素流水线与气泡问题

考虑一个有 p 个阶段的流水线。在最朴素的实现中,一个完整的全局 Batch 会依次流经 Stage 0 → Stage 1 → … → Stage p1 完成前向传播,再以 Stage p1 → … → Stage 0 的顺序完成反向传播。在整个过程中,任意时刻只有一个 GPU 在工作,其余 p1 个 GPU 全部空闲,GPU 利用率仅为 1/p

微批次(Micro-batch) 是解决这一问题的基本思路:将全局 Batch 切分为 m 个微批次,Stage 0 处理完第一个微批次后立即将激活值传递给 Stage 1,然后马上开始处理第二个微批次。如此一来,不同的 GPU 可以同时处理不同的微批次,流水线得以"流动"起来。

但即使引入微批次,流水线在**启动阶段(Fill Phase)排空阶段(Drain Phase)**仍然存在不可避免的空闲时间,这就是流水线气泡的根本来源。围绕"如何更高效地调度微批次的前向和反向传播以压缩气泡",学术界和工业界提出了一系列方案。


10.4.2 GPipe

GPipe(Huang et al., 2019)是最早被广泛采用的微批次流水线并行方案。其调度策略非常直观:先完成所有微批次的前向传播,再完成所有微批次的反向传播

p=4 个阶段、m=4 个微批次为例,GPipe 的调度时序如下(F 代表前向,B 代表反向,下标为微批次编号):

时间 ──────────────────────────────────────────────────────────────────►
GPU 0: | F0 | F1 | F2 | F3 |              | B3 | B2 | B1 | B0 |
GPU 1:      | F0 | F1 | F2 | F3 |              | B3 | B2 | B1 | B0 |
GPU 2:           | F0 | F1 | F2 | F3 |              | B3 | B2 | B1 | B0 |
GPU 3:                | F0 | F1 | F2 | F3 | B3 | B2 | B1 | B0 |

                                    前向完成,反向开始

气泡分析。 在上图中可以清晰看到:前向启动阶段和反向排空阶段各有 p1 个时间槽的气泡;更重要的是,前向传播全部完成后、反向传播开始前,中间阶段的 GPU 存在一段完全空闲的等待时间。设每个微批次的前向时间为 tf、反向时间为 tb,则:

  • 有效计算时间m(tf+tb)
  • 气泡时间(p1)(tf+tb)
  • 气泡率(p1)m

mp 时气泡率趋近于零,但这要求极大的全局 Batch Size,这与数据并行等其他策略对 Batch Size 的需求形成资源竞争。

内存问题。 GPipe 需要同时保存所有 m 个微批次的前向激活值(用于反向传播),激活内存占用为 O(m),随微批次数量线性增长。


10.4.3 1F1B 调度

1F1B(One Forward One Backward)调度由 PipeDream(Narayanan et al., 2019)提出,核心思想是:在流水线填满后,交替执行一次前向和一次反向,而不是等所有前向完成再统一做反向。

时间 ──────────────────────────────────────────────────────────────────►
GPU 0: | F0 | F1 | F2 | F3 | B0 | F4 | B1 | F5 | B2 |    | B3 | B4 | B5 |
GPU 1:      | F0 | F1 | F2 | B0 | F3 | B1 | F4 | B2 | F5 | B3 |    | B4 | B5 |
GPU 2:           | F0 | F1 | B0 | F2 | B1 | F3 | B2 | F4 | B3 | F5 | B4 | B5 |
GPU 3:                | F0 | B0 | F1 | B1 | F2 | B2 | F3 | B3 | F4 | B4 | F5 | B5 |

1F1B 的关键优势是内存效率。 在稳态阶段,每个 GPU 在完成一个微批次的前向后就立即进行一个微批次的反向,反向完成后该微批次的激活值即可释放。因此,每个 GPU 同时需要保存的激活值数量不再随 m 增长,而是受限于流水线深度 p——具体来说,Stage k 最多同时持有 pk 个微批次的激活值。

气泡率。 1F1B 的气泡仅出现在启动阶段(前 p1 步填充流水线)和排空阶段(最后 p1 步)。气泡率与 GPipe 相同,仍为:

气泡率=(p1)m

但由于激活内存占用大幅降低,1F1B 允许在相同显存预算下使用更多微批次,间接降低了实际气泡率。


10.4.4 1F1B Interleaved(交错式流水线)

1F1B Interleaved(Narayanan et al., 2021, Megatron-LM v2)在 1F1B 的基础上引入了一个巧妙的改进:让每个 GPU 不只负责一个连续的阶段,而是负责模型中多个不连续的层块(虚拟阶段)

假设模型共有 L 层,p 个 GPU,每个 GPU 负责 v 个虚拟阶段(每个虚拟阶段包含 L/(pv) 层)。例如在 p=4,v=2 的设置下,GPU 0 负责 Stage 0 和 Stage 4,GPU 1 负责 Stage 1 和 Stage 5,以此类推。由于每个虚拟阶段的计算量缩小为原来的 1/v,对应的时间槽也缩短为 1/v,使得流水线的启动和排空阶段所浪费的绝对时间大幅减少。

气泡率降低为:

气泡率=(p1)mv

代价。 虚拟阶段的引入使得通信次数增加了 v 倍——GPU 之间不再只有相邻通信,非相邻的 GPU 之间也可能需要传递激活值,增加了通信复杂性。此外,实现上需要更精细的调度逻辑。


10.4.5 气泡率对比

下表汇总了上述调度策略的核心指标(p 为阶段数,m 为微批次数,v 为虚拟阶段数):

调度策略气泡率峰值激活内存通信模式实现复杂度
GPipe(p1)/mO(m)(保存全部微批次激活)相邻点对点
1F1B(p1)/mO(p)(仅保存流水线深度个激活)相邻点对点
1F1B Interleaved(p1)/(mv)O(p)可能涉及非相邻通信,v 倍通信量
Zero-Bubble理论趋近 0O(p)相邻点对点很高

表 10-1:流水线并行调度策略对比。


10.4.6 零泡沫流水线并行(Zero-Bubble PP)

前述方案中,气泡始终无法完全消除。Qi et al.(2024)提出的零泡沫流水线并行(Zero-Bubble Pipeline Parallelism)对此给出了一个关键洞察:反向传播可以被分解为两个独立的部分

具体而言,对于流水线中的一个阶段,其反向传播包含两类梯度计算:

  1. 输入梯度(B):计算当前阶段输入的梯度 L/X,该梯度需要传回上一个阶段,存在跨阶段的串行依赖。
  2. 权重梯度(W):计算当前阶段参数的梯度 L/W,该梯度仅用于本阶段的参数更新,不依赖任何其他阶段的计算结果

传统方案将 B 和 W 捆绑在一起执行。零泡沫方案的核心思路是将二者解耦:优先执行有跨阶段依赖的 B(保证流水线不被阻塞),将无依赖的 W 调度到气泡时段执行,从而用有效计算"填满"气泡。

传统 1F1B(B 和 W 绑定):
GPU 0: | F0 | F1 | F2 | F3 | BW0 | BW1 | BW2 | BW3 |  idle  |
GPU 1:      | F0 | F1 | F2 | BW0 | F3  | BW1 | BW2 | BW3 |  idle  |
         (BW = B + W 绑定执行,气泡不可避免)

Zero-Bubble(B 和 W 解耦):
GPU 0: | F0 | F1 | F2 | F3 | B0 | B1 | B2 | B3 | W0 | W1 | W2 | W3 |
GPU 1:      | F0 | F1 | F2 | B0 | F3 | B1 | B2 | B3 | W0 | W1 | W2 | W3 |
         (W 被调度到原本空闲的时段,气泡被填充)

ZB-H1 与 ZB-H2。 论文提出了两个方案层次:

  • ZB-H1:在启动阶段的气泡中插入 W 计算。理论气泡率可以降到接近零,但存在少量因调度约束导致的残余气泡。
  • ZB-H2:通过更激进的调度(允许 W 的计算提前于某些 F),并引入优化器状态的修正(因为 W 的执行时机改变意味着部分微批次的权重梯度是基于"旧"参数计算的),理论上可以实现严格的零气泡

自动搜索调度。 与手工设计调度方案不同,零泡沫方案通过 ILP(整数线性规划)自动搜索最优调度策略,给定阶段数 p、微批次数 m 以及 tf,tb,tw 的耗时约束,求解器自动生成最优的时间表。

代价与限制。

  • 实现复杂度显著提高:需要修改自动微分系统以支持 B/W 的独立调度。
  • ZB-H2 引入了参数版本不一致问题,需要额外的修正机制(类似于学习率预热或梯度补偿)来保证收敛性。
  • 在通信带宽成为瓶颈时,气泡可能无法被完全填满。

10.4.7 DualPipe 架构(DeepSeek-V3)

DeepSeek-V3 的训练系统面临一个特殊挑战:作为 MoE(混合专家)模型,其前向和反向传播中包含大量的全对全通信(All-to-All)——用于在专家并行中分发和收集 Token。这些通信开销在传统流水线方案中会与计算串行执行,严重降低效率。

DualPipe 的核心设计目标是:在流水线并行的框架下,将计算与通信完全重叠,同时最小化气泡

双向流水线。 DualPipe 的第一个创新是采用双向调度:将微批次分为两组,一组从流水线的前端(Stage 0)向后端流动,另一组从后端(Stage p1)向前端流动。两组微批次在流水线中相向而行,在中间阶段交汇。

单向流水线(传统):
GPU 0:  → F → F → F → ...
GPU 1:       → F → F → F → ...
GPU 2:            → F → F → F → ...
GPU 3:                 → F → F → F → ...

双向流水线(DualPipe):
GPU 0:  → F → F →  ←  B ← B        (前半程处理正向微批次,后半程处理反向微批次)
GPU 1:       → F → ← B → F ← B     (两个方向的微批次交错执行)
GPU 2:       ← B → ← F → B ← F
GPU 3:  ← B ← B →  →  F → F        (从后端发起的微批次先到达这里)

计算-通信重叠。 DualPipe 的第二个创新是对每个微批次的计算进行细粒度分解。它将一个 Transformer 层的前向/反向过程拆分为:

  • Attention 部分:计算密集,几乎不涉及跨设备通信。
  • MoE 部分:涉及 All-to-All 通信(分发 Token 到对应专家 → 专家计算 → 收集结果)。

DualPipe 将 Attention 的计算与 MoE 的通信在时间上重叠:当 GPU 在执行一个微批次的 Attention 计算时,同时在后台进行另一个微批次的 All-to-All 通信。两个方向的微批次恰好提供了这种交错执行的机会——正向微批次的计算可以与反向微批次的通信重叠,反之亦然。

气泡分析。 由于双向调度使流水线的有效填充速度翻倍,DualPipe 的气泡比传统单向方案进一步减半。当微批次数量足够多时,计算与通信的重叠几乎消除了通信开销对吞吐量的影响。

对硬件拓扑的要求。 DualPipe 假设流水线的两端 GPU 能够同时启动微批次的注入,这对网络拓扑和通信调度提出了额外要求。在 DeepSeek-V3 的实际部署中,每个节点内部使用 NVLink 进行高带宽的张量并行和专家并行通信,节点之间使用 InfiniBand 进行流水线并行的点对点传输,DualPipe 的双向调度很好地契合了这种层次化的网络架构。


10.4.8 小结

流水线并行的技术演进可以概括为一条清晰的主线:不断压缩流水线气泡,同时控制内存开销和实现复杂度

  • GPipe 最先提出微批次流水线方案,调度简单但激活内存开销大,气泡率为 (p1)/m
  • 1F1B 通过交替执行前向和反向将激活内存从 O(m) 降至 O(p),气泡率不变但实际效率更高。
  • 1F1B Interleaved 引入虚拟阶段,将气泡率进一步降至 (p1)/(mv),代价是通信量增加。
  • Zero-Bubble PP 通过解耦输入梯度和权重梯度的计算,将无依赖的权重梯度调度到气泡时段,理论上实现零气泡。
  • DualPipe 面向 MoE 架构设计,通过双向调度和计算-通信重叠,在大规模混合专家模型训练中同时最小化气泡和通信开销。

从工程实践的角度看,流水线并行通常被部署在**节点间(inter-node)**维度——因为它只需要相邻阶段之间的点对点通信,对带宽的需求远低于张量并行。在现代大模型训练的 3D/4D 并行框架中,流水线并行与张量并行(节点内)和数据并行(跨副本)协同工作,共同支撑起千亿乃至万亿参数模型的高效训练。