想象你是一家中餐厅的主厨,后厨有四位师傅排成一条流水线:第一位洗菜切菜,第二位颠勺炒菜,第三位装盘摆盘,第四位传菜上桌。每来一桌客人,四位师傅就按顺序忙一轮,做完这一桌再做下一桌。 问题来了:第一位师傅在给A桌切菜时,后面三位只能干等着;等A桌传到第二位师傅手里,第一位师傅才能开始切B桌……整个后厨大部分时间都有人在“等菜”,灶台空转。这种空转,在分布式训练里叫“气泡”。 如果换一种玩法:把每桌菜拆成四道小菜,第一位师傅切完A桌第一道小菜,第二位师傅立刻开始炒A桌这道小菜,同时第一位师傅转身去切B桌的第一道小菜——所有人都忙起来,灶台几乎没有空转的时刻。这就是Interleaved交叉流水线的智慧:把任务切得更细,再交错着做。 本文就用这个“后厨做菜”的比喻,带你从零理解Interleaved交叉流水线的原理、配置和实战调参。你会明白什么是虚拟阶段、什么是交叉调度、通信开销怎么控制、如何与其他并行方式配合,以及工程落地时的关键注意事项。

岗位关联

对AI从业者而言,Interleaved是流水线并行中降低气泡率的核心利器。掌握它的配置与调参逻辑,意味着你能在同等GPU资源下训练更大模型、缩短训练时间,这是大模型训练工程师的必备技能。

目录
  1. 可视化演示
  2. 气泡成因分析
  3. 虚拟阶段切分
  4. 交叉调度策略
  5. 通信开销控制
  6. 并行方式配合
  7. 工程实战配置
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

通过动态时序图展示交叉流水线调度的虚拟阶段分配、V值对气泡率的影响,以及TP/DP/PP三维并行拓扑结构,直观理解大模型训练并行策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

交叉调度时序 每个设备处理V个虚拟阶段的micro-batch 交叉调度减少流水线气泡 气泡率=(P-1)/(V·M+P-1)

气泡成因分析

回到后厨。四位师傅排成流水线,第一道工序没做完,第二位师傅就只能擦灶台。这里的本质是:每桌菜必须按顺序经过四道工序,谁也不能跳过自己前面的步骤。模型训练里的“前向传播”就是这样——第1层的输出才能喂给第2层,第2层的输出喂给第3层,层层递进、天然串行。

在流水线并行中,我们把模型按层切成几段,每个GPU负责一段。但训练是一个接一个的小批量(microbatch)轮流来的。当第一个小批量刚进入第1段时,第2、3、4段都是空的;当第一个小批量终于走到最后一段时,第1段又开始空转等待新的小批量排队。这些空转时段就是气泡(bubble)。

气泡率可以用一个简单的公式刻画。假设流水线有 \(p\) 个阶段(对应 \(p\) 个设备),一次训练要跑 \(m\) 个小批量:

想象四位师傅带四桌客人:第一位师傅切菜时三位等着,最后一位师傅上菜时前面三位又等着——只有中间一小段时间大家同时忙碌。设备越多、单批数据切得越少,空等的比例就越吓人。

BPP=p−1p+m−1\displaystyle B_{PP} = \frac{p-1}{p+m-1}
这个公式告诉我们:气泡占总时间的比例,只跟阶段数和微批数量有关。后厨师傅越多、每桌只点一道菜,配合起来空等的时间比例就越大。
  1. 阶段数 p流水线上一共有几个处理环节(设备数),在公式里决定队列长度。
    pp
  2. 微批数 m把一批训练数据切成多少个小份依次送入流水线,它决定了流水线能“装满”多少车货。
    mm
  3. 分子 p-1第一个微批走完所有阶段之前,后面的设备全部空等,这段“空转预热”的长度。
    p−1p-1
  4. 分母 p+m-1从第一个微批开始到最后一个微批完成的总时间步数,相当于整个做菜周期的长度。
    p+m−1p+m-1
  5. 气泡占比空转时间除以总时间,就是设备利用率损失。
    p−1p+m−1\frac{p-1}{p+m-1}

虚拟阶段切分

既然气泡来自“任务太大块、串行太僵硬”,那能不能把每道工序再切细一点?在Interleaved方案里,我们给每个设备多分几份更小的任务,这些更小的任务叫做虚拟阶段(virtual stage)。

虚拟阶段怎么切呢?把每个完整的模型阶段再切成若干层组,然后让每个设备轮流领好几组。比如原本一个设备负责第1~4层,现在切成两块:设备0负责第1~2层和第9~10层,设备1负责第3~4层和第11~12层……这样每个设备手里有 \(v\) 份“小任务”。虚拟阶段总数变成了 \(V = p \times v\)。

气泡率公式也随之改写。用设备数 \(p\)、每个设备的虚拟阶段数 \(v\)、微批数 \(m\) 表示:

把四道大菜各切成两盘,四位师傅手里各有两盘小菜,配合起来就能交叉着做。虚拟阶段数 \(v\) 就像“切菜刀工”的精细度——切得越细,空等越少,但切太多也会累(后面讲通信开销)。

BILV=p−1p−1+m⋅v\displaystyle B_{ILV} = \frac{p-1}{p-1+m \cdot v}
Interleaved的气泡率与“微批数×虚拟阶段数”成反比。虚拟阶段越多,气泡被摊得越薄、越碎,设备空转的比例就越低。
  1. 虚拟阶段 v每个设备手里的任务份数,相当于把一道大菜切成几盘小菜。
    vv
  2. 虚拟阶段总数 V全部设备的任务份数总和,\(V = p \times v\)。
    V=p⋅vV = p \cdot v
  3. 新分母 p-1+m·v流水线总长度被“切细”后拉长了,分母变大,气泡占比自然变小。
    p−1+m⋅vp-1+m \cdot v
  4. 极端情形当 \(m \cdot v\) 远大于 \(p\) 时,气泡率趋近于零。
    lim⁡m⋅v→∞BILV=0\lim_{m \cdot v \to \infty} B_{ILV} = 0

交叉调度策略

有了虚拟阶段,怎么安排执行顺序?这就是交叉调度:让不同微批的任务在各设备间轮转交织,像交叉编织一样把空闲缝隙填满。

还是后厨的例子。四位师傅、每桌四道小菜。师傅A先做A桌第1道小菜,做完立刻做B桌第1道小菜,再做C桌、D桌;与此同时师傅B已经拿到了A桌第2道小菜开始炒……每一轮师傅们都在做“不同桌、同一顺序”的小菜,而不是“同一桌、全部顺序”。这样整个流水线的节奏变成了多桌并行推进,任何一位师傅做完手头小菜,下一道小菜已经摆在台面上。

在训练中,这一步对应调度器对微批的切分与轮转。设备 \(d\) 负责的虚拟阶段编号为 \(d, d+p, d+2p, \dots\),每个微批按固定步长在这些虚拟阶段间流动。稳态时每个时间步所有设备都有活干:

交叉调度本质上是“用任务交错换取时间连续”。它不需要改变硬件,只需要调度器更聪明地安排顺序,就能让原本闲置的算力跑起来。

Ssteady=v⋅mv⋅m+p−1\displaystyle S_{steady} = \frac{v \cdot m}{v \cdot m + p - 1}
这个比值衡量“满负荷运转”的时间占比。虚拟阶段越多、微批越多,交叉调度填满气泡的效果就越好。
  1. 稳态标志所有设备每个时刻都有任务可做,没有人在等。
    SsteadyS_{steady}
  2. 有效工时 v·m每个虚拟阶段上的微批任务总数,等于虚拟阶段数乘以微批数。
    v⋅mv \cdot m
  3. 总周期 v·m+p-1从第一个任务启动到最后一个任务完成的总时间步。
    v⋅m+p−1v \cdot m + p - 1
  4. 设备利用率有效工时除以总周期,越接近1说明气泡越少。
    v⋅mv⋅m+p−1\frac{v \cdot m}{v \cdot m + p - 1}

通信开销控制

切细和交错不是免费的。后厨里每做完一盘小菜,就要端给下一位师傅——切得越细,端盘子的次数就越多。在分布式训练里,“端盘子”就是GPU之间的张量通信,它同样消耗时间。

原本每个微批在阶段间只需传输一次张量;切成虚拟阶段后,每个微批要跨越 \(V-1\) 次设备边界,通信次数变成了原来的 \(v\) 倍。好的一面是,单次传输的数据量变小了(因为每段模型层数变少),通信总量基本不变;坏的一面是,通信的启动开销和同步等待会累积。

好消息是,通信可以和计算重叠。GPU在等待下一段张量到达时,可以先算本地已有的其他微批任务。类比后厨:传菜的小工把菜端走的同时,师傅已经在炒下一道小菜,并不需要干等。通信隐藏的效果可以这样理解:

通信开销是Interleaved的“隐藏税”。配置时不能只盯着气泡率,还要看集群的通信带宽和拓扑,否则切得过细会让“端盘子”变成新的瓶颈。

Tstep=max⁡(Tcompute,Tcomm)\displaystyle T_{step} = \max(T_{compute}, T_{comm})
当通信时间小于等于计算时间时,通信被完全隐藏,单个时间步的耗时只看计算。这也是为什么高速互联(如NVLink、RDMA)对Interleaved如此重要的原因。
  1. 计算时间 T_compute一个虚拟阶段上做一次前向或反向传播的耗时。
    TcomputeT_{compute}
  2. 通信时间 T_comm把中间激活传给下一个设备所需的时间。
    TcommT_{comm}
  3. 取最大值通信和计算重叠执行时,单步耗时由较慢的一方决定。
    max⁡(Tcompute,Tcomm)\max(T_{compute}, T_{comm})

并行方式配合

Interleaved不是孤立存在的,真实的分布式训练通常同时使用数据并行(DP)、张量并行(TP)和流水线并行(PP)。它们像后厨的三种优化手段:DP是“多开几个灶台同时做同样的菜”,TP是“一道菜多位师傅合作炒”,PP是“按工序排流水线”。

三种并行方式的维度互不冲突,可以叠加使用。数据并行复制模型的多个副本,每个副本吃不同的数据;张量并行把某一层的计算拆到多卡上合作完成;流水线并行把不同层分配到不同设备串联。三者组合起来就是经典的3D并行:

实际部署时,通常把张量并行放在同一台机器内(走NVLink高速互联),把流水线并行放在机器之间,数据并行维度放在最外层。Interleaved则在PP内部生效,让每一段流水线都更加饱满。

NGPU=NDP×NTP×NPP\displaystyle N_{GPU} = N_{DP} \times N_{TP} \times N_{PP}
总GPU数等于三个并行维度大小的乘积。Interleaved属于PP维度的增强——它不改变 \(N_{PP}\),只是把PP内部的任务切得更细。
  1. 数据并行度 N_DP同时训练多少个数据副本,对应开几个“同样的灶台”。
    NDPN_{DP}
  2. 张量并行度 N_TP单个模型层被拆到几张卡上合作计算。
    NTPN_{TP}
  3. 流水线并行度 N_PP模型按层切成了几段。
    NPPN_{PP}
  4. 总卡数三个维度相乘,得到整个训练集群的GPU数量。
    NGPUN_{GPU}

工程实战配置

理论说完了,真正落地时怎么调参?这是Interleaved最考验经验的地方。核心旋钮有三个:虚拟阶段数 \(v\)、微批数 \(m\)、通信带宽。

虚拟阶段数不是越大越好。每台设备分到的虚拟阶段数必须能被设备数整除(即 \(V\) 是 \(p\) 的整数倍),且一般从 \(v=2\) 起步。增大 \(v\) 能降气泡,但通信次数线性增加、调度复杂度变大、显存占用也可能上升。工程上的常见做法是先固定 \(v=2\) 跑通,再逐步增大观察端到端吞吐。

微批数 \(m\) 与气泡率直接相关:\(m\) 越大,流水线越“饱满”。但每个微批都需要保存中间激活用于反向传播,显存会随 \(m\) 增长。所以 \(m\) 的上限由显存决定,通常做法是先用小 \(m\) 跑通,再在显存允许范围内尽量调大。气泡率对两个参数的敏感性可以统一写成:

实战调参就像调后厨的排班表:先保证每盘菜的量(显存)装得下,再尽量多分几桌(增大 \(m\)),最后微调切菜刀工(\(v\)),找到气泡和通信之间的最佳平衡点。记住一个朴素原则——任何调参都要用端到端吞吐来验证,不能只看某一项指标。

Ttrain≈Bm×(p−1p−1+m⋅v+1)×tstep\displaystyle T_{train} \approx \frac{B}{m} \times \left( \frac{p-1}{p-1+m \cdot v} + 1 \right) \times t_{step}
这是一个简化的训练总时间模型:总批大小除以微批数得到微批趟数,每趟的有效耗时包含气泡损失和实际计算。调参的目标就是让总时间最小。
  1. 总批大小 B所有数据副本加起来一个epoch要处理的样本数。
    BB
  2. 微批趟数总批大小除以微批大小,表示要沿流水线跑多少轮。
    Bm\frac{B}{m}
  3. 气泡损失因子每一轮里气泡带来的额外时间占比。
    p−1p−1+m⋅v\frac{p-1}{p-1+m \cdot v}
  4. 单步耗时 t_step一个微批在一个虚拟阶段上的实际执行时间(含通信)。
    tstept_{step}

AI 应用场景

大模型预训练提速

阶段:模型训练 → 分布式并行配置

解决的问题:训练千亿参数模型时,多个GPU按流水线并行排列,传统方案在warmup和drain阶段有大量GPU空转。NVIDIA Megatron-LM在训练GPT-3这类模型时,通过开启interleaved流水线(相当于把每段模型再切成多个virtual chunk),将GPU利用率从原本的不足60%提升到接近90%,训练周期从几个月缩短到几周。

具体案例:某团队用512张A100训练175B模型,采用PP=8、TP=8、DP=8的3D并行,并在PP维度开启virtual pipeline stage=2。对比实验显示,开启Interleaved后单卡吞吐提升约35%,显存峰值仅增加8%,端到端训练时间从21天降到16天。

长文本LLM微调

阶段:模型微调 → 并行策略选择

解决的问题:长文本微调时序列长度大、显存紧张,限制了微批大小;微批小又导致流水线气泡率升高。Interleaved通过虚拟阶段切分,用较少的微批数也能实现较低的气泡率,让小团队在有限GPU上也能高效微调大模型。

具体案例:某创业团队在8张A800上微调70B模型,序列长度4096。受显存限制只能放2个微批,传统PP气泡率高达约70%,改用Interleaved(v=2)后气泡率降到约50%,同时配合梯度检查点,训练速度提升近2倍。

训练成本优化

阶段:算力调度 → 资源利用率优化

解决的问题:云上GPU按小时计费,气泡意味着白花钱。Interleaved在不动硬件的前提下提升利用率,相当于变相降低了单位训练成本。调度平台可以把它作为“性价比模式”提供给训练任务。

具体案例:某智算中心在调度平台中预设了多种并行模板,其中“interleaved推荐配置”会根据GPU数量和显存自动计算虚拟阶段数。用户选择该模板后,平均账单降低28%,排队等待时间也因单任务时长缩短而减少。

Python 演示

python42 行
def build_schedule(p, m, v=1):    """生成调度表并统计气泡率。    v=1 表示传统流水线,v>1 表示 Interleaved。    返回: (busy_slots, total_slots, bubble_rate)    """    V = p * v    total_time = m + V - 1    busy = 0    for t in range(total_time):        for d in range(p):            has_task = False            for s in range(m):                # 设备 d 持有虚拟阶段 d, d+p, d+2p, ...                for vk in range(d, V, p):                    if s + vk == t:                        has_task = True                        break                if has_task:                    break            if has_task:                busy += 1    total = total_time * p    return busy, total, 1 - busy / total  def main():    p, m = 4, 4    print("=== 传统流水线 (v=1) ===")    busy1, total1, bubble1 = build_schedule(p, m, v=1)    print(f"忙碌格点: {busy1}/{total1}, 气泡率: {bubble1:.2%}")     print("=== Interleaved (v=2) ===")    busy2, total2, bubble2 = build_schedule(p, m, v=2)    print(f"忙碌格点: {busy2}/{total2}, 气泡率: {bubble2:.2%}")     print("=== Interleaved (v=4) ===")    busy4, total4, bubble4 = build_schedule(p, m, v=4)    print(f"忙碌格点: {busy4}/{total4}, 气泡率: {bubble4:.2%}")  if __name__ == "__main__":    main()
目的:用暴力枚举模拟4设备4微批下,传统流水线与不同虚拟阶段数的Interleaved调度表,并统计气泡率。运行后你会直观看到v=1时气泡约43%,v=2降到约27%,v=4继续降到约15%。
  1. total_time = m + V - 1计算整个调度周期的总时间步数,这是流水线的“总工期”。
  2. for d in range(p)遍历每个设备,统计每个设备在所有时间步是否有活干。
  3. for vk in range(d, V, p)设备d负责的虚拟阶段编号按步长p分布,这是Interleaved交叉分配的数学表达。
  4. busy += 1只要任一虚拟阶段在该时刻有微批在执行,就记一个“忙碌格点”。
  5. 1 - busy / total忙碌格点占比的补数就是气泡率,设备空闲的比例一目了然。

常见误区

误区既然虚拟阶段越多气泡越少,那直接把v设成8、16不就行了吗?省得反复调参。

正解虚拟阶段数增加会线性放大设备间的通信次数,同时每个虚拟阶段的计算粒度变细,通信隐藏的效果变差。v=4比v=2的气泡率低,但实际端到端吞吐可能反而下降。正确做法是从v=2起步,用真实训练吞吐做A/B对比,找到拐点。

为何常见:初学者容易被气泡率公式的单调性迷惑,只看到分子变小,忽略了通信开销这个隐藏成本。

误区交叉调度做得足够好,所有GPU就能百分之百跑满,气泡归零。

正解气泡率只是趋近于零,无法真正为零。微批数m受显存限制,虚拟阶段数v受通信限制,两个参数都有物理上限。即便在理想模拟中,warmup和drain阶段仍然存在少量空档。工程目标是把气泡压到可接受范围,而不是追求绝对零。

为何常见:看到官方宣传的“利用率提升到95%”就误以为气泡消失,忽略了剩余5%正是模型效应和设备同步的损耗。

误区随便设个V值,让调度器自动分配不就行了?比如4台设备分6个虚拟阶段。

正解Interleaved要求虚拟阶段总数V必须是设备数p的整数倍,否则不同设备分到的虚拟阶段数不均等,负载失衡会导致快的设备等慢的设备,气泡不减反增。配置框架(如Megatron)时,num_virtual_plus_model_stages这个参数必须显式保证整除关系。

为何常见:虚拟阶段是“逻辑概念”,容易让人误以为它像线程一样可以任意分配,忽略了它最终要落到物理设备上。

误区DP、TP、PP各管各的,Interleaved只是PP的开关,打开就行,不需要管其他维度。

正解三者共享显存和带宽资源。TP会增加通信量,挤压Interleaved的通信预算;DP的梯度同步也会占用带宽;流水线段的显存分配还要给激活值留空间。实际配置时,通常先定DP和TP,再调PP和v,最后用显存余量反推m。

为何常见:教程常把三种并行分开讲,让人误以为它们像插件一样独立工作,忽略了真实系统中资源共享才是常态。

面试题

Q1. 流水线并行中的“气泡”指的是什么?

单选题 · easy

  • A.显存不足导致的报错
  • B.设备空闲等待的时间段← 正确答案
  • C.通信链路的数据丢失
  • D.梯度爆炸的数值现象

答案:B。气泡是流水线并行中设备无任务可做的空转时间。就像后厨里师傅们干等上一位师傅完工,它不是报错、不是丢数据,而是调度产生的空闲期。

Q2. Interleaved交叉流水线的核心思想是什么?

单选题 · easy

  • A.把流水线阶段切细并交叉执行← 正确答案
  • B.让一个设备独享全部模型层
  • C.用更多数据填充显存空间
  • D.把模型参数复制给每个设备

答案:A。Interleaved的本质是把每个阶段切成多个虚拟阶段,让微批任务交错流动填满空隙。它不复制参数,也不改数据分配,而是改变任务的组织方式。

Q3. 虚拟阶段总数V与设备数P之间必须满足什么关系?

单选题 · easy

  • A.V必须是P的整数倍← 正确答案
  • B.V必须严格小于P
  • C.V必须等于微批数量
  • D.V没有任何限制条件

答案:A。V必须是P的整数倍,才能保证每个设备分到数量相同的虚拟阶段,负载均衡是交叉调度有效的前提。否则会出现有的设备任务多、有的设备闲着的失衡局面。

Q4. 4个设备、4个微批的传统流水线,气泡率约为多少?

单选题 · mid

  • A.约25%
  • B.约33%
  • C.约43%← 正确答案
  • D.约50%

答案:C。套用公式(p-1)/(p+m-1),(4-1)/(4+4-1)=3/7≈42.8%。四位师傅带四桌客人,大约四成时间有人空等。

Q5. Interleaved相比传统流水线,主要增加了哪方面开销?

单选题 · mid

  • A.模型参数总量变大
  • B.层间通信次数变多← 正确答案
  • C.激活值内存更小
  • D.优化器状态增多

答案:B。虚拟阶段切细后,每个微批跨越的设备边界变多,通信次数按v倍增长。参数总量和优化器状态不变,激活内存反而可能更大。

Q6. 增大微批数m对气泡率有什么影响?

单选题 · mid

  • A.气泡占比持续下降← 正确答案
  • B.气泡占比持续上升
  • C.气泡率保持不变
  • D.通信开销必然下降

答案:A。m在公式分母中,增大m会让气泡率下降。流水线里微批越多越“饱满”,但m受显存约束,不能无限增大。

Q7. 关于Interleaved工程调优,下列说法正确的是?

单选题 · hard

  • A.虚拟阶段数越大越好
  • B.微批数应尽量填满显存余量← 正确答案
  • C.通信带宽不影响调参效果
  • D.气泡率可以降低到绝对零

答案:B。微批数受显存限制,在显存允许范围内尽量调大是正确的。虚拟阶段过大通信开销上升,通信带宽直接影响v的可选范围,气泡率只能趋近零而非绝对零。

Q8. 在3D并行架构中,各维度的职责是什么?

多选题 · mid

  • A.PP负责切分模型的层← 正确答案
  • B.TP负责切分单层内部计算← 正确答案
  • C.DP负责复制模型多份副本← 正确答案
  • D.PP负责切分词表的大小

答案:ABC。PP把模型按层分段,TP把单层计算拆到多卡,DP复制模型并分配不同数据。词表大小由模型结构决定,不是PP的职责。

Q9. 为什么虚拟阶段数过多会抵消收益?

多选题 · hard

  • A.设备间通信次数随之增多← 正确答案
  • B.调度控制逻辑更加复杂← 正确答案
  • C.单段计算时间也变得更短
  • D.模型参数总量因此变大

答案:AB。虚拟阶段增多意味着每次前向/反向都要多跨几次设备边界,通信次数增加;同时调度器需要管理更多细碎任务,复杂度上升。参数总量不变,单段计算时间变短本身不是抵消原因,而是伴随现象。

Q10. 某集群用P=8、m=8、v=2的Interleaved配置,气泡率约为多少?

单选题 · extreme

  • A.约30%← 正确答案
  • B.约45%
  • C.约55%
  • D.约70%

答案:A。套用公式(p-1)/(p-1+m·v)=(8-1)/(8-1+8×2)=7/23≈30.4%。相比传统同配置7/14=50%的气泡率,Interleaved让设备空等时间从一半压到三成。