1. 课程导入

欢迎进入《DeepSpeed流水线负载均衡与动态调度》课程。在正式开始拆解源码与调优技巧之前,本章先建立一张“全局地图”:我们要解决什么问题、DeepSpeed 提供了哪些能力、负载均衡与动态调度在整个训练系统中的位置,以及后续 29 章将如何层层展开。学完本章,你应当能够用自己的话解释:为什么流水线并行在模型变大后必然遇到“气泡”和“木桶效应”,以及为什么静态切分往往不够用。

一、学习目标

  • 理解流水线并行(Pipeline Parallelism)的基本执行模型:微批(micro-batch)如何在多个 stage 之间流动。
  • 掌握流水线效率的核心指标:气泡率(bubble ratio)、吞吐(throughput)、设备利用率。
  • 能说清负载不均衡的三种典型来源:层耗时差异、stage 划分不均、通信与计算重叠不足。
  • 了解 DeepSpeed 中与流水线相关的关键能力:Pipe、梯度累积、1F1B 调度、动态微批调度等。
  • 建立后续章节的学习路径:从原理到配置,从排障到复盘。

二、DeepSpeed 流水线并行概述

DeepSpeed 是微软开源的大规模分布式训练优化库,其流水线并行能力通常与 ZeRO、混合精度、梯度累积协同使用。它的核心思想是:把模型按层切分成多个 stage,每个 stage 放在不同 GPU 上,训练数据被切成若干 micro-batch,像工厂流水线一样依次流过各个 stage。

在理想情况下,所有 stage 的计算时间完全相等,且通信被计算掩盖,此时流水线可以接近线性加速。但真实训练中,Transformer 各层耗时并不相同,embedding、attention、MLP、layernorm 的开销差异明显;再加上跨节点通信带宽限制,流水线会出现“前段等后段、后段等前段”的空闲时间,这就是气泡。

流水线并行的本质不是“把模型切开”这么简单,而是“让每个 GPU 在时间轴上尽量不空闲”。负载均衡与动态调度,正是围绕这一目标展开的。

三、负载均衡与动态调度的重要性

假设一个 24 层模型被均匀切到 4 个 stage,每个 stage 6 层。如果第 1 个 stage 因为 embedding 和 attention 组合耗时 120ms,而第 4 个 stage 仅 80ms,那么整条流水线的节拍由最慢 stage 决定,其他 stage 每轮都会等待。这就是典型的“木桶效应”。

更隐蔽的问题来自 micro-batch 数量与调度策略。若 micro-batch 太少,流水线填充和排空阶段占比过高;若 micro-batch 太多,激活内存又会膨胀。DeepSpeed 通过 1F1B(One Forward One Backward)等调度减少激活占用,但若各 stage 计算量不均,1F1B 仍会出现等待。动态调度则尝试根据实际耗时调整 micro-batch 分配或执行顺序,让空闲时间进一步压缩。

流水线并行:4 个 stage 的时间轴对比 橙色 stage 耗时更长,导致后续 stage 出现等待(红色气泡) Stage 1 Stage 2 Stage 3 Stage 4 F0 F1 F2 F3 F0 F1 F2 F3 F0 F1 F2 F3 F0 F1 F2 F3 等待 等待 等待 时间 → 气泡 = 设备空闲 结论:最慢 stage 决定整条流水线节拍;动态调度目标是把红色等待区压缩到最小。

四、核心原理:气泡从哪里来

流水线气泡主要来自三处。第一是填充与排空:流水线启动时,只有第一个 stage 有数据,后续 stage 必须等待;结束时同理。第二是 stage 间计算不均衡:某个 stage 耗时更长,后续 stage 只能空转。第三是通信未重叠:stage 之间需要传递激活值,若通信与计算串行,也会产生等待。

DeepSpeed 的调度策略围绕这些来源设计。例如,通过增加 micro-batch 数量可以摊薄填充排空开销,但会增加内存;通过 1F1B 可以让前向和反向交错,减少激活驻留;通过动态调度,可以根据实际测量结果重新分配 micro-batch 或调整 stage 边界。

五、方法流程:从静态切分到动态调度

  1. 模型切分:按层数或参数量把模型划分为若干 stage,尽量让每段计算量接近。
  2. 微批划分:把 global batch 拆成多个 micro-batch,决定流水线填充深度。
  3. 调度执行:采用 1F1B 或交错式调度,让前向、反向和通信尽量重叠。
  4. 性能观测:采集各 stage 耗时、气泡率、通信占比、显存占用。
  5. 动态调整:根据观测结果调整 stage 边界、micro-batch 分配或调度顺序。

六、案例场景:一个不均衡的 4-stage 训练

某团队训练 32 层 Transformer,使用 4 个 stage,每 stage 8 层。训练日志显示:stage1 每步 95ms,stage2 78ms,stage3 76ms,stage4 112ms。整体吞吐只有理论值的 68%。原因在于 stage4 包含了输出层和 loss 计算,耗时明显偏高。团队尝试把 stage4 的 2 层移到 stage3,并增加 micro-batch 数量,气泡率从 32% 降到 14%。

# 典型 DeepSpeed 流水线配置片段
{
  "train_batch_size": 64,
  "gradient_accumulation_steps": 8,
  "zero_optimization": { "stage": 1 },
  "pipeline": {
    "pipe_parallel_size": 4,
    "micro_batch_size": 8,
    "schedule": "1F1B"
  }
}
调优时先看“最慢 stage 是谁”,再决定是调整切分边界,还是增加 micro-batch,或者改用动态调度。不要一上来就盲目加卡。

七、常见误区与复盘

误区 表现 正确做法
认为均匀切层就等于负载均衡 各 stage 层数相同,但耗时差异大 按实测耗时或 FLOPs 估算切分,而非只看层数
micro-batch 越多越好 显存暴涨,甚至 OOM 在显存允许范围内逐步增加,观察气泡率拐点
忽略通信开销 计算很快,但 stage 间等待明显 检查跨节点带宽,尽量让通信与计算重叠
只调并行度,不看调度策略 加卡后吞吐不升反降 结合 1F1B、动态微批等策略综合调优
流水线并行不是“免费加速”。当 stage 数量增加时,通信次数和气泡风险都会上升。务必用 profiling 数据说话,而不是凭感觉调参。

八、整体课程框架

后续课程将按“原理—配置—调优—排障—复盘”的主线展开。你会先学习流水线并行的执行模型与气泡计算,再进入 DeepSpeed Pipe 的配置项与代码结构;随后通过多个案例掌握 stage 切分、micro-batch 调优、1F1B 与动态调度;最后学习如何定位负载不均衡、通信瓶颈和显存问题,并形成可复用的调优清单。

  • 原理篇:流水线执行模型、气泡率、1F1B、交错调度。
  • 配置篇:DeepSpeed pipeline 配置、并行度组合、显存权衡。
  • 调优篇:stage 切分策略、micro-batch 搜索、动态调度实践。
  • 排障篇:日志分析、profiling、常见错误与修复。
  • 复盘篇:真实训练案例、调优前后对比、经验沉淀。

现在,你已经知道这门课要解决的核心问题:让流水线中的每个 GPU 都尽量忙起来。接下来,我们将从流水线并行的执行模型开始,逐步深入 DeepSpeed 的实现细节。