概念定义

流水线并行是一种模型并行技术,将深度学习模型的不同层分配到不同的计算设备上,形成计算流水线,通过微批次(micro-batch)机制实现并行处理。

详细解释

流水线并行的核心思想是将模型垂直切分成多个阶段(stage),每个阶段包含若干连续的层,分配到不同的GPU上。训练时,将一个批次数据进一步切分成多个微批次,这些微批次像流水线一样依次通过各个阶段进行处理。 与张量并行需要频繁通信不同,流水线并行只在阶段边界传递激活值,通信开销相对较小。但流水线并行面临的主要挑战是”气泡”(bubble)问题——当某些设备在等待前置阶段的输出时会处于空闲状态。2025年的技术发展通过优化调度策略大幅降低了气泡开销。

工作原理

基本流水线模型

阶段1 (GPU0): [Layer 1-6]   →
阶段2 (GPU1): [Layer 7-12]  →
阶段3 (GPU2): [Layer 13-18] →
阶段4 (GPU3): [Layer 19-24]

主要调度策略

1. GPipe调度

前向传播所有微批次 → 反向传播所有微批次
优点:实现简单
缺点:激活值内存占用大,气泡较多

2. 1F1B调度(PipeDream)

每完成一个前向立即执行对应的反向
优点:内存效率高,可及时释放激活值
缺点:仍有初始填充和最终排空的气泡

3. 交错调度(Interleaved 1F1B)

# 虚拟流水线阶段
virtual_stages = 2  # 每个GPU持有2个非连续阶段
# GPU0: [Layer 1-3, Layer 13-15]
# GPU1: [Layer 4-6, Layer 16-18]
# 减少气泡大小,提高GPU利用率

2025年最新进展

DualPipe(双向流水线)

• 双向调度:PP/2-1 (&+-3)
• 减少空闲时间,平衡内存使用
• 兼容PyTorch 2.0+

HelixPipe(螺旋流水线)

• 注意力并行分区
• 两重FILO微批次调度
• 支持超长序列训练

实际应用

PyTorch原生实现

from torch.distributed.pipelining import pipeline

# 自动划分模型
pipe = pipeline(
    module=model,
    balance=[4, 4, 4, 4],  # 每个阶段的层数
    devices=[0, 1, 2, 3],
    chunks=8,  # 微批次数量
)

# 使用1F1B调度训练
pipe.train()
output = pipe(input_data)

Megatron-LM虚拟流水线

# 启用虚拟流水线阶段
model = MegatronModel(
    pipeline_model_parallel_size=4,
    num_layers_per_virtual_pipeline_stage=3,
    # 总层数需要能被虚拟阶段大小整除
)

气泡率计算

气泡率 = 气泡时间 / 总运行时间
优化目标:气泡率 < 5%

影响因素:
- 微批次数量(越多越好)
- 流水线深度(越浅越好)
- 阶段负载均衡

内存优化技术

  1. 激活重计算:选择性重算部分激活值
  2. 激活卸载:将暂时不用的激活值移到CPU
  3. 混合精度:使用FP16/BF16减少内存占用
  4. 分块MLP:将大型MLP层分块处理

相关概念

延伸阅读