4. DeepSpeed流水线并行架构

DeepSpeed 的流水线并行并不是单一模块,而是一套由引擎、通信组与调度器共同协作的运行时架构。理解这三者的职责边界,是后续调优气泡率、显存占用和吞吐量的前提。本节从组件分层入手,说明它们如何协同完成一次完整的流水线迭代。

一、核心原理:三层职责分离

DeepSpeed 流水线并行的运行时可以抽象为三个层次:引擎层负责模型切分与前后向执行,通信层负责跨 stage 的激活与梯度传递,调度层负责决定每个 micro-batch 在何时进入哪个 stage。三者通过明确的接口解耦,使得调度策略可以独立替换,而不影响模型切分逻辑。

引擎层由 PipelineEngine 承载,它继承自 DeepSpeed 的 DeepSpeedEngine,在初始化阶段完成三件事:按 partition_method 将模型层划分到各 stage、为每个 stage 构建本地 nn.Module 序列、注册与流水线相关的通信句柄。通信层依赖 PyTorch 的 ProcessGroup,DeepSpeed 会为流水线单独创建一个 pipeline 通信组,与数据并行组、张量并行组相互正交。调度层则由 PipelineScheduler 及其子类实现,常见的有 Schedule1F1B、ScheduleGPipe 和 ScheduleInterleaved1F1B。

DeepSpeed 流水线并行运行时架构 引擎层 · PipelineEngine 模型切分 partition_method 本地层序列 nn.Module 列表 前后向执行 forward / backward 梯度规约 reduce-scatter 通信层 · ProcessGroup pipeline 组 stage 间激活传递 data 组 梯度 all-reduce tensor 组 层内切分通信 send / recv 点对点张量 调度层 · PipelineScheduler Schedule1F1B 交替前后向 ScheduleGPipe 全前向再全后向 Interleaved1F1B 虚拟 stage 交错 micro-batch 队列 step 调度 调用通信 驱动执行

二、通信组:正交划分与初始化

DeepSpeed 在初始化时会根据并行配置创建多个正交通信组。流水线组只包含同一数据并行副本内、不同 stage 的 rank;数据并行组只包含同一 stage 内、不同数据副本的 rank。这种正交划分保证了流水线通信与数据并行通信互不干扰,也决定了 send/recv 的 peer 关系。

# 典型 8 卡配置:2 路流水线 × 4 路数据并行
# pipeline_group: [0,4] [1,5] [2,6] [3,7]
# data_group:     [0,1,2,3] [4,5,6,7]
# 每个 rank 同时属于一个 pipeline 组和一个 data 组
deepspeed --num_gpus=8 train.py \
  --deepspeed_config ds_config.json

在 ds_config.json 中,pipeline 字段的 stages 决定切分粒度,partition_method 决定按层还是按参数切分。通信组一旦建立,调度器便可在其上编排 micro-batch 的收发顺序。

三、调度器角色:从 1F1B 到交错调度

调度器的核心任务是决定每个 micro-batch 在 stage 上的执行顺序,以最小化流水线气泡。以 Schedule1F1B 为例,其状态机在预热阶段连续执行多个前向,填满流水线后进入稳定阶段,交替执行一次前向和一次后向,最后进入冷却阶段排空剩余后向。

调度器执行模式气泡特征适用场景
ScheduleGPipe全前向 → 全后向气泡最大,显存峰值高小规模验证、调试
Schedule1F1B预热 → 1F1B 交替 → 冷却气泡适中,显存平稳常规训练首选
ScheduleInterleaved1F1B虚拟 stage 交错 1F1B气泡更小,通信更频繁大模型高吞吐场景

四、案例场景:一次 1F1B 迭代的完整链路

假设 4 个 stage、4 个 micro-batch。rank0 在预热阶段依次将 micro-batch 0~2 的前向激活发送给 rank1;rank1 收到后继续向 rank2 传递。当 rank0 完成第 3 个前向后,进入稳定阶段:每收到一个来自 rank1 的反向梯度,就执行一次本地后向,同时发起下一个 micro-batch 的前向。冷却阶段则只处理后向,直到所有 micro-batch 的梯度回传完毕。

关键观察:1F1B 的显存优势来自“前向激活在对应后向完成后立即释放”。若调度器未能及时配对前后向,激活会持续驻留,导致显存峰值接近 GPipe。

五、误区与复盘

  • 误区一:认为流水线组越大越好。stage 数增加会放大通信次数与气泡比例,需结合 micro_batch 数量权衡。
  • 误区二:忽略通信组正交性。若 pipeline 组与 data 组 rank 重叠错误,会出现梯度规约与激活传递互相阻塞。
  • 误区三:调度器与切分策略不匹配。按参数切分时,1F1B 的配对逻辑需要额外处理参数边界,否则后向无法正确触发。

排查流水线效率时,优先确认三件事:pipeline_group 的 rank 顺序是否与 stage 编号一致;micro_batch 数量是否大于 stage 数;调度器是否与 partition_method 匹配。这三项决定了气泡率的下限。

综上,DeepSpeed 流水线并行的架构可以概括为:引擎层负责“切什么、怎么算”,通信层负责“传给谁、怎么传”,调度层负责“何时算、何时传”。三者通过正交通信组与可替换调度器解耦,使得同一套模型切分可以适配不同的效率优化策略。