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 与自定义层分配来调整切分策略。
三、气泡:流水线无法避免的空闲时间
气泡指流水线启动和排空阶段,部分阶段无活可干的时间。在朴素流水线中,第一个阶段要先完成前向才能把激活传给第二个阶段,因此存在“填充期”;反向传播结束时又存在“排空期”。这两段时间里,越靠后的阶段空闲越久。
气泡占比的经典估算公式为:
气泡占比 ≈ (P - 1) / (m + P - 1)
其中 P = 流水线阶段数,m = 微批次数量
例如 P=8、m=8 时,气泡占比约为 7/15 ≈ 46.7%;若把 m 提高到 32,则气泡占比降到 7/39 ≈ 17.9%。这说明增加微批次数量是压缩气泡最直接的手段,但代价是显存占用和调度复杂度上升。
四、吞吐量与延迟:效率的两个维度
吞吐量指单位时间内完成的样本数或 token 数,衡量的是“整体产能”;延迟指单个样本从进入流水线到输出结果所需的时间,衡量的是“单件响应速度”。两者常常互相制约:
- 增大微批次数量可提升吞吐量,但单个样本要排队等待,端到端延迟可能上升。
- 减少流水线阶段数可降低通信与气泡,但单卡显存压力增大。
- 1F1B 调度通过让前向与反向交错执行,在相同显存下提升吞吐量并压缩气泡。
下面这张图展示了 4 个流水线阶段、4 个微批次的朴素调度时间线,可以直观看到填充期与排空期形成的气泡区域。
五、五个概念的联动关系与常见误区
这五个概念并非孤立,而是彼此耦合:微批次数量决定气泡大小,气泡大小影响吞吐量,流水线阶段数同时影响气泡和延迟,而延迟又反过来限制微批次能切多细。下表总结了它们之间的主要关系与调优方向。
| 概念 | 定义 | 主要影响 | 调优方向 |
|---|---|---|---|
| 微批次 m | 全局 batch 切分后的小批次 | 气泡占比、显存、通信次数 | 在显存允许下适当增大 |
| 流水线阶段 P | 模型切分后的层块数 | 单卡显存、通信量、气泡 | 均衡各阶段计算时间 |
| 气泡 | 填充期与排空期的空闲 | 吞吐量、GPU 利用率 | 增大 m、采用 1F1B 或交错调度 |
| 吞吐量 | 单位时间完成样本/token 数 | 训练总时长、成本 | 压缩气泡、提高计算密度 |
| 延迟 | 单样本端到端耗时 | 推理响应、在线服务 | 减少 P、控制 m 与排队深度 |
常见误区二:只看吞吐量忽略延迟。在线推理场景中,过深的流水线会让首 token 延迟显著增加,需要根据业务目标选择 P 与 m。
常见误区三:阶段划分只按层数平均。实际应按计算量(FLOPs)和显存占用均衡,否则最慢阶段会成为整条流水线的瓶颈。
六、一个可复盘的调优场景
假设在 8 卡上训练一个 32 层模型,初始配置为 P=8、m=8,观察到 GPU 利用率仅约 55%。按气泡公式估算气泡占比约 46.7%,与观测吻合。调优步骤如下:
- 将
m从 8 提升到 32,气泡占比降至约 17.9%,利用率提升到约 80%。 - 检查各阶段耗时,发现 Stage 7 因包含 LM Head 而偏慢,重新分配层数后各阶段耗时趋于一致。
- 启用 DeepSpeed 的 1F1B 调度,让前向与反向交错执行,进一步压缩气泡并降低激活显存峰值。
- 最终在显存允许范围内确定
m=32、P=8,吞吐量相比初始配置提升约 40%。
这个案例说明:理解微批次、阶段、气泡、吞吐量与延迟之间的定量关系,是进行流水线效率优化的前提。只有先算清气泡占比、找准瓶颈阶段,后续的调度策略调整才有明确方向。