3. 流水线并行核心概念

流水线并行(Pipeline Parallelism)是把一个大模型按层切分成若干段,分别放到不同 GPU 上,让数据像工厂流水线一样依次流过各段。要真正理解 DeepSpeed 的调度机制,必须先掌握五个基础概念:微批次(Micro-batch)、流水线阶段(Pipeline Stage)、气泡(Bubble)、吞吐量(Throughput)和延迟(Latency)。它们共同决定了流水线效率的上限,也是后续 1F1B、交错式调度等优化手段的出发点。

一、微批次:把大 batch 切成流水线的“货件”

如果一次只送一个完整的大 batch 进入流水线,那么同一时刻只有一个阶段在计算,其余阶段全部空闲,流水线形同虚设。解决办法是把一个全局 batch 再切分成若干个更小的微批次,让它们像流水线上的货件一样连续不断地被送入。

设全局 batch 为 B,微批次数量为 m,则每个微批次的样本数为 B/m。微批次越多,流水线填充得越满,气泡占比越小;但微批次过小会降低单次矩阵乘法的计算效率,并增加通信次数。因此 m 是一个需要权衡的关键超参数。

# DeepSpeed 配置片段:微批次相关参数
train_batch_size: 1024        # 全局 batch
train_micro_batch_size_per_gpu: 8   # 每个微批次的样本数
gradient_accumulation_steps: 4      # 梯度累积步数
# 微批次数量 m = train_batch_size / (micro_batch * dp_size)

二、流水线阶段:模型切分与设备映射

流水线阶段是模型被切分后的一个连续层块,通常放置在一个 GPU(或一组 GPU)上。若模型有 L 层,流水线并行度为 P,则每个阶段大约承载 L/P 层。阶段之间通过点对点通信传递激活值和梯度。

阶段划分需要尽量均衡:如果某个阶段层数过多或包含特别耗时的算子(如大词表输出层),它就会成为整条流水线的瓶颈,其他阶段被迫等待。DeepSpeed 允许通过 partition_method 与自定义层分配来调整切分策略。

阶段划分的目标不是“层数相等”,而是“各阶段计算时间尽量相等”。Embedding 层和 LM Head 层通常计算量较小,可以适当多分几层给它们。

三、气泡:流水线无法避免的空闲时间

气泡指流水线启动和排空阶段,部分阶段无活可干的时间。在朴素流水线中,第一个阶段要先完成前向才能把激活传给第二个阶段,因此存在“填充期”;反向传播结束时又存在“排空期”。这两段时间里,越靠后的阶段空闲越久。

气泡占比的经典估算公式为:

气泡占比 ≈ (P - 1) / (m + P - 1)

其中 P = 流水线阶段数,m = 微批次数量

例如 P=8、m=8 时,气泡占比约为 7/15 ≈ 46.7%;若把 m 提高到 32,则气泡占比降到 7/39 ≈ 17.9%。这说明增加微批次数量是压缩气泡最直接的手段,但代价是显存占用和调度复杂度上升。

四、吞吐量与延迟:效率的两个维度

吞吐量指单位时间内完成的样本数或 数,衡量的是“整体产能”;延迟指单个样本从进入流水线到输出结果所需的时间,衡量的是“单件响应速度”。两者常常互相制约:

  • 增大微批次数量可提升吞吐量,但单个样本要排队等待,端到端延迟可能上升。
  • 减少流水线阶段数可降低通信与气泡,但单卡显存压力增大。
  • 1F1B 调度通过让前向与反向交错执行,在相同显存下提升吞吐量并压缩气泡。

下面这张图展示了 4 个流水线阶段、4 个微批次的朴素调度时间线,可以直观看到填充期与排空期形成的气泡区域。

朴素流水线调度时间线(P=4, m=4) Stage 0 Stage 1 Stage 2 Stage 3 时间 → F1 F2 F3 F4 B1 B2 B3 B4 idle F1 F2 F3 F4 B1 B2 B3 B4 idle idle F1 F2 F3 F4 B1 B2 B3 B4 idle idle idle F1 F2 F3 F4 B1 B2 B3 前向 F 反向 B 气泡 / 空闲

五、五个概念的联动关系与常见误区

这五个概念并非孤立,而是彼此耦合:微批次数量决定气泡大小,气泡大小影响吞吐量,流水线阶段数同时影响气泡和延迟,而延迟又反过来限制微批次能切多细。下表总结了它们之间的主要关系与调优方向。

概念 定义 主要影响 调优方向
微批次 m 全局 batch 切分后的小批次 气泡占比、显存、通信次数 在显存允许下适当增大
流水线阶段 P 模型切分后的层块数 单卡显存、通信量、气泡 均衡各阶段计算时间
气泡 填充期与排空期的空闲 吞吐量、GPU 利用率 增大 m、采用 1F1B 或交错调度
吞吐量 单位时间完成样本/ 数 训练总时长、成本 压缩气泡、提高计算密度
延迟 单样本端到端耗时 推理响应、在线服务 减少 P、控制 m 与排队深度
常见误区一:认为“微批次越多越好”。当微批次过小时,单次 GEMM 规模下降,GPU 计算效率反而降低,通信开销占比上升,吞吐量可能不升反降。
常见误区二:只看吞吐量忽略延迟。在线推理场景中,过深的流水线会让首 延迟显著增加,需要根据业务目标选择 P 与 m。
常见误区三:阶段划分只按层数平均。实际应按计算量(FLOPs)和显存占用均衡,否则最慢阶段会成为整条流水线的瓶颈。

六、一个可复盘的调优场景

假设在 8 卡上训练一个 32 层模型,初始配置为 P=8、m=8,观察到 GPU 利用率仅约 55%。按气泡公式估算气泡占比约 46.7%,与观测吻合。调优步骤如下:

  1. 将 m 从 8 提升到 32,气泡占比降至约 17.9%,利用率提升到约 80%。
  2. 检查各阶段耗时,发现 Stage 7 因包含 LM Head 而偏慢,重新分配层数后各阶段耗时趋于一致。
  3. 启用 DeepSpeed 的 1F1B 调度,让前向与反向交错执行,进一步压缩气泡并降低激活显存峰值。
  4. 最终在显存允许范围内确定 m=32、P=8,吞吐量相比初始配置提升约 40%。

这个案例说明:理解微批次、阶段、气泡、吞吐量与延迟之间的定量关系,是进行流水线效率优化的前提。只有先算清气泡占比、找准瓶颈阶段,后续的调度策略调整才有明确方向。