想象一家专做多层蛋糕塔的工厂。每座塔有 8 层,4 位师傅按楼层接力:张师傅只做第 1-2 层,李师傅做第 3-4 层,王师傅做第 5-6 层,赵师傅做第 7-8 层。订单一份接一份送来,师傅们却总在“干等”——李师傅做完这一单的 3-4 层,要等张师傅把下一单的 1-2 层做出来;赵师傅的等待更多。这些空转时间,训练圈里叫它“气泡”。Interleaved(交错交叉流水线)用一招化解:把每份活儿拆成更小的包(虚拟阶段),再像打扑克一样头尾交错地发给师傅们。从此大家手头总有活,气泡大幅缩小。本文就从这座蛋糕工厂讲起,帮你彻底搞懂 Interleaved 的原理、代价,以及它到底适不适合你的训练任务。

岗位关联

一句话价值:Interleaved 是大模型流水线压榨效率的关键一招,学会它的收益模型与权衡,你就能在实际训练中游刃有余地选型。

目录
  1. 可视化演示
  2. 一、流水线瓶颈:气泡从哪来
  3. 二、虚拟阶段划分:把蛋糕切得更碎
  4. 三、交叉调度:像发牌一样交错分配
  5. 四、通信开销权衡:省了时间费了带宽
  6. 五、实现复杂度:排班表更难写了
  7. 六、选型实践建议:什么时候用 Interleaved
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示Interleaved交叉流的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

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

Interleaved交叉流:Inte Interleaved虚拟阶段 交叉调度执行流程详解 核心机制可视化 Interleaved交叉流整体架构与关键组件

一、流水线瓶颈:气泡从哪来

蛋糕塔工厂里,一单 8 层塔由 4 位师傅接力:张师傅做 1-2 层,李师傅做 3-4 层,王师傅做 5-6 层,赵师傅做 7-8 层。订单一份接一份送来,但工位只有一条流水线——赵师傅做完第 2 单的 7-8 层后,想直接做第 3 单,却发现王师傅还没把第 3 单的 5-6 层送上来。整条线环环相扣,任何一环卡住,后面的人全得干等。这些大家集体“等米下锅”的时间段,在分布式训练里有个形象的叫法——气泡(bubble)。

在大模型训练里,“蛋糕层”就是 transformer 层,师傅就是 GPU 设备,订单就是微型批次(microbatch,一种把大训练批次拆小后逐个送入流水线的数据切片)。把模型按层切成几段,每台设备负责连续一段,数据按顺序流过所有设备——这就是最基本的流水线并行。气泡的本质是:一个批次进入和排出流水线时,前后设备无法同时开工,存在“启动慢、排空慢”的阶段。

设设备数为 P,微型批次数为 M,传统流水线(如 GPipe、1F1B,其中 1F1B 是一种让前向和反向交错执行的经典调度方式)的气泡占比近似为:

通俗理解:M 越大、订单排得越满,气泡占比越低;P 越大、流水线越长,气泡占比越高。想喂饱一条长流水线,必须准备足够多的订单(微型批次)。

张师傅们不是不勤快,而是流水线的结构决定了他们必然要等。要减少气泡,要么多接订单(增大 M),要么……换一种排班方式,比如把每层的活拆细,交错着干。

B=P−1M+P−1\displaystyle B = \frac{P-1}{M+P-1}
  1. 分子 P−1代表一个订单从进入到最后排出,流水线首尾两端的“半空”时段,与设备数量直接相关。
    P−1\displaystyle P-1
  2. 分母 M+P−1整体执行时间单元数,由 M 个订单的实际加工时间,加上 P−1 个排空空闲单元组成。
    M+P−1\displaystyle M+P-1
  3. 整体比值设备真正闲着的时间占总时间的比例,也就是气泡占比。分子越小、分母越大,设备就越“忙”。
    B=P−1M+P−1\displaystyle B = \frac{P-1}{M+P-1}

二、虚拟阶段划分:把蛋糕切得更碎

店长想了个新主意:既然大家干等是因为“活儿太大块”,那就把活儿拆小。张师傅负责的 1-2 层拆成“1 层”和“2 层”两个小包,李师傅的 3-4 层拆成“3 层”和“4 层”……整个蛋糕塔从 4 大包变成 8 小包。每小包就是一个“虚拟阶段”——它还是一段真实的楼层,只是变细了。

这就是 Interleaved 的第一个核心动作:虚拟阶段划分。假设原来把模型切成 P 段(对应 P 台设备),现在再把每一段切成 k 小段(chunk,即“大块里的子块”),于是总共有 k×P 个虚拟阶段,每台设备将负责 k 个虚拟阶段。

例如 4 台设备、每段切 2 小段:虚拟阶段总数 = 8。关键点:切碎后,设备的“工作包”不再是一整段连续层,而是多个分散的小段——这就为后面“交错分配”创造了条件。

把大包拆成小包还只是第一步。真正神奇的是下一步——怎么把 8 个小包分给 4 位师傅,才能让他们都忙起来?答案是:不再按楼层顺序分,而是交错着分。

Nvirtual=k×P\displaystyle N_{\text{virtual}} = k \times P
  1. k(每台设备的虚拟阶段数)也叫“块数”或 chunk 数,表示把原来每台设备负责的连续层段再切几份。
    k\displaystyle k
  2. P(设备数)流水线并行度,即一共有几台设备参与纵向切分。
    P\displaystyle P
  3. 乘积 N_virtual总虚拟阶段数。切得越细,虚拟阶段越多,后续调度的粒度就越细,设备间的配合也越“无缝”。
    Nvirtual=k×P\displaystyle N_{\text{virtual}} = k \times P

三、交叉调度:像发牌一样交错分配

店长把 8 个小包排成一列,不按“一二三四”顺序发,而是像打扑克牌一样交叉着发:张师傅领第 1 小包和第 8 小包,李师傅领第 2 小包和第 7 小包,王师傅领第 3 小包和第 6 小包,赵师傅领第 4 小包和第 5 小包。每位师傅都既有“开场活”,又有“收尾活”。订单流动时,谁都不会干坐着。

这就是 Interleaved 的命名由来——interleave,交叉交错。设备 i 认领的虚拟阶段按头尾配对:第 i 个和第 kP−1−i 个,再下一轮是第 i+P 个和第 kP−1−i−P 个……这种对称交错让每个设备的工作负载在时间轴上呈互补分布,谁都不再是“只等开场”或“只等收尾”的可怜人。

交错调度使设备之间的依赖更均匀地铺开,直接反映在气泡公式上:

对比传统公式 (P−1)/(M+P−1),分母多出 (k−1)P 项,气泡比例显著下降。当 k 越大,分母越大,气泡越趋近于零——但永远不会是零。

发牌式排班让每个人都“心中有数,手头有活”。但天底下没有免费的午餐:包拆小了,送包的小工(通信模块)就得跑更多趟。下一节说说这个代价。

Binter=P−1M+kP−1\displaystyle B_{\text{inter}} = \frac{P-1}{M+kP-1}
  1. 分子仍是 P−1设备间的本质依赖和首尾效应没有消失,气泡无法归零,只是被压缩。
    P−1\displaystyle P-1
  2. 分母 M+kP−1执行时间单元中多了 kP−P 个,因为虚拟阶段让计算粒度变细、设备间配合更紧凑。
    M+kP−1\displaystyle M+kP-1
  3. 收益来源分母变大,比值变小,这就是交错排班带来的理论收益。
    P−1M+kP−1<P−1M+P−1\displaystyle \frac{P-1}{M+kP-1} < \frac{P-1}{M+P-1}

四、通信开销权衡:省了时间费了带宽

蛋糕小包是拆细了,但问题来了:原来张师傅把 1-2 层一起端给李师傅,一趟完事;现在得把“1 层”和“2 层”分两趟端。传菜的小工(通信)来回跑的次数明显变多。小工腿跑断了,师傅倒是没干等。

通信开销的变化是 Interleaved 最核心的权衡。每完成一个虚拟阶段,就需要把结果(激活值或梯度)传给下一个虚拟阶段所在的设备。虚拟阶段总数从 P 变成 kP,机器间的通信边界从 P−1 变成 kP−1,通信总次数从 M(P−1) 变为 M(kP−1)。

每次通信的数据量不变,但趟数约为原来的 k 倍。幸运的是,通信可以异步进行(与计算重叠),只要带宽够用,增加的部分就可以被隐藏起来。这也是 Interleaved 在 InfiniBand 等高速网络上效果更好的原因。

所以 Interleaved 不是“无脑更优”,而是“用师傅的忙碌换小工的奔波”。带宽像高速公路,路宽便宜,多跑几趟不心疼;路窄收费高,就得盘算值不值。

Cratio=M(kP−1)M(P−1)≈k\displaystyle C_{\text{ratio}} = \frac{M(kP-1)}{M(P-1)} \approx k
  1. 分子 M(kP−1)Interleaved 下每个微型批次跨机器的通信次数,乘以微型批次总数。
    M(kP−1)\displaystyle M(kP-1)
  2. 分母 M(P−1)传统流水线的通信总次数,边界只有 P−1 条。
    M(P−1)\displaystyle M(P-1)
  3. 比值约等于 k通信趟数大约变成原来的 k 倍,这就是为减少气泡付出的直接账单。
    Cratio=M(kP−1)M(P−1)≈k\displaystyle C_{\text{ratio}} = \frac{M(kP-1)}{M(P-1)} \approx k

五、实现复杂度:排班表更难写了

店长的排班表从一页纸变成了一本册子。原来每位师傅“永远只干固定的活”,现在张师傅时而做 1 层、时而做 8 层,还得记住第 5 单送到哪一步了。稍不留神,蛋糕就送错了柜子。老板还得多雇一个“调度员”,专门盯着进度。

工程实现上,Interleaved 的复杂度来自三方面:一是调度器要为每个设备维护多个虚拟阶段的执行顺序(前向和反向交错),二是每个虚拟阶段都要保留独立的中间状态,显存管理更精细,三是负载均衡更难——如果拆得不均匀,某些虚拟阶段比其他重,气泡又会悄悄回来。

常见的实现框架如 DeepSpeed 的 Interleaved Schedule、PipeDream 的变体(如 V-Shaped schedule)都内置了这类调度逻辑。但引入它们意味着要处理更复杂的流水线冲刷(pipeline flush,即训练结束时把流水线内残留的批次全部处理完的过程)、梯度累积顺序和通信流控制,调试成本显著高于传统 1F1B。对于训练框架开发者和参与并行策略调优的人来说,这部分是重点考量的“隐性成本”。

排班表复杂,不等于不该用。只要收益大于麻烦,店长就愿意花精力升级。关键是要算清楚账——这正是最后一节的主题。

六、选型实践建议:什么时候用 Interleaved

店长终于学会了算账:如果订单足够多(M 大)、传菜通道足够宽(带宽足)、客户还要求极致效率(性能敏感),那这套复杂排班法非常划算;如果店里只有两三个订单、传菜通道还是条窄胡同,那就老老实实按顺序接单。

工程选型时,Interleaved 的收益不是固定的,而是随条件变化。最直接的评估是看气泡节省比例:

它告诉我们:M 越大,节省越有限(因为传统方案本来气泡就少);k 越大,节省越多(但通信成本也越高)。要找到甜点位,通常需要用小规模实验扫描 k 的取值。

一句话总结:订单多、路宽、追求极致,就上 Interleaved;否则传统流水线的简单可靠也是一种智慧。学会了算这笔账,你就能像那位店长一样,让每一位师傅都物尽其用。

S=1−M+P−1M+kP−1\displaystyle S = 1 - \frac{M+P-1}{M+kP-1}
  1. 传统总时间 M+P−1传统流水线完成一个训练回合的总时间单元。
    M+P−1\displaystyle M+P-1
  2. 交错总时间 M+kP−1Interleaved 完成同样回合的时间单元,分母更大。
    M+kP−1\displaystyle M+kP-1
  3. 节省比例 S气泡减少带来的理论提速比例上限,实际收益还要扣掉通信重叠不充分、负载不均等损耗。
    S=1−M+P−1M+kP−1\displaystyle S = 1 - \frac{M+P-1}{M+kP-1}

AI 应用场景

大模型预训练提速

阶段:模型训练 / 并行策略优化

解决的问题:预训练 GPT 级别模型需要数百台 GPU,传统流水线并行在地图和排空阶段浪费大量算力。气泡让昂贵的 GPU 长期空转,而 Interleaved 通过虚拟阶段交错调度,让每台设备尽量保持繁忙,吞吐可提升 10%-20%。

具体案例:某团队用 DeepSpeed 在 128 台 A100 上训练 175B 参数模型,将 PP=16、k=2,气泡比例从约 15% 降至约 4%,训练总时间缩短近一周。

长序列 LLM 微调

阶段:模型微调 / 资源利用优化

解决的问题:长序列微调时批次往往较小,M 小导致传统流水线气泡占比很大。Interleaved 能利用小批次场景下的空闲窗口,让设备在更细的粒度上保持忙碌,是“小订单”困境的解药。

具体案例:金融领域 8K 上下文微调,batch=4、P=4,采用 k=2 的 interleaved 调度后,显存占用基本持平,而训练时间缩短约 15%。

多团队共享 GPU 集群

阶段:集群调度与资源切分

解决的问题:集群上每个任务分到的 GPU 有限,PP 设备数少时气泡尤其严重。Interleaved 通过细分虚拟阶段,让少量设备之间的配合更紧凑,提升单任务吞吐。

具体案例:内部 ML 平台为多个小任务分配 2-4 卡,开启 interleaved 调度后,设备利用率从 55% 提升到 70% 以上。

Python 演示

python21 行
def bubble_ratio(M, P, k=1):    """Return bubble ratio (0~1). k=1 means traditional pipeline."""    return (P - 1) / (M + k * P - 1)  def main():    M = 32     # number of microbatches    P = 4      # number of pipeline devices    print("M =", M, " P =", P)    print("k(chunks)  bubble_ratio  saved_vs_trad")    base = None    for k in (1, 2, 4, 8):        ratio = bubble_ratio(M, P, k)        if base is None:            base = ratio        saved = (1 - ratio / base) * 100        print("%6d      %8.2f%%       %6.2f%%" % (k, ratio * 100, saved))  if __name__ == "__main__":    main()
目的:用公式 (P−1)/(M+kP−1) 对比传统流水线与 Interleaved 的气泡比例,直观看到 k 增大时理论收益的变化。
  1. def bubble_ratio(M, P, k=1):定义气泡比例函数,k=1 时自动退化为传统流水线。
  2. return (P - 1) / (M + k * P - 1)核心公式,分子始终是 P−1,分母随 k 增大而变大。
  3. base = None先记录传统方案(k=1)的气泡值作为基准。
  4. saved = (1 - ratio / base) * 100计算相对传统方案节省的气泡比例。
  5. if __name__ == "__main__":可执行入口,让脚本既能被导入也能直接运行。

常见误区

误区看到公式分母里有 k,就以为把 k 设成 16、32,气泡趋近于零,k 越大肯定越赚。

正解分母增大确实降低理论气泡,但通信次数按 k 倍增长,调度和显存开销也迅速上升。实践中 k 通常在 2-4 之间收益最大,超过后收益递减甚至变慢。带宽有限时,k 越大越可能拖慢整体。

为何常见:人们容易只盯住公式里的收益项,忽略通信和调度成本项,把“越多越好”的错误线性外推套到 k 上。

误区交错之后所有设备一直在干活,气泡应该归零了。

正解气泡比例公式的分子恒定是 P−1,说明设备间的启动与排空等待无法完全消除,只能压缩。k 无限大时理论趋近 0,但现实中通信、同步、负载不均仍会制造新的空闲。

为何常见:论文对比图里气泡视觉上“消失”了,让人误以为被消灭,其实只是被大幅缩小。

误区既然气泡少了,那换成交错流水线,训练速度肯定提升。

正解气泡节省只是理论上限。实际收益要看 M 大小:若 M 已经很大(例如 64+),传统方案气泡本身就很小,换 Interleaved 收益有限,还额外引入通信和复杂度成本;带宽紧张时甚至可能变慢。

为何常见:教程常展示“气泡对比图”而没强调前提条件,造成无脑更优的错觉。

误区把 transformer 层拆细了,和张量并行(把矩阵横向切开)是一回事吧。

正解虚拟阶段是沿层方向(纵向)再做细分,每个虚拟阶段仍是完整的小层组;张量并行是把单个算子的矩阵横向切到多卡。两者切分维度完全不同,可以叠加使用但不要混为一谈。

为何常见:“切分模型”这个表述太宽泛,初学者容易把所有切分方式都当成同一种。

面试题

Q1. Interleaved 流水线并行的核心目标是?

单选题 · easy

  • A.减少设备空闲等待时间← 正确答案
  • B.增加模型参数量大小
  • C.降低网络通信带宽需求
  • D.简化流水线调度逻辑

答案:A。Interleaved 的核心目标就是用交错分配来压缩设备等待时间(气泡),而不是增加参数量或简化工程。它反而会让通信与调度更复杂,所以 B、C、D 都不对。

Q2. 传统流水线中的“气泡”指的是?

单选题 · easy

  • A.设备等待上流数据的空闲← 正确答案
  • B.显存中的临时缓存区域
  • C.网络传输时的数据拥堵
  • D.训练过程中的报错情况

答案:A。气泡指设备因等待上游数据而空闲的时间段。蛋糕厂里赵师傅干等王师傅送蛋糕来,就是气泡。显存临时区、网络拥堵、训练报错都是不同层面的东西。

Q3. 在微型批次量 M 和设备数 P 固定时,关于虚拟阶段 k 的说法正确的是?

单选题 · easy

  • A.虚拟阶段越多气泡越少← 正确答案
  • B.虚拟阶段越多气泡越多
  • C.虚拟阶段与气泡无关
  • D.虚拟阶段增加模型体积

答案:A。在 M 和 P 固定时,k 越大,分母 M+kP−1 越大,气泡比例越小。这就是 Interleaved 压缩气泡的直接来源。k=1 时则完全退化为传统方案。

Q4. 若有 P 台设备、每台负责 k 个虚拟阶段,则虚拟阶段总数为?

单选题 · mid

  • A.虚拟阶段总数等于k乘P← 正确答案
  • B.虚拟阶段总数等于k加P
  • C.虚拟阶段总数等于P乘M
  • D.虚拟阶段总数等于k乘M

答案:A。总虚拟阶段数 = 每台设备的虚拟阶段数 k × 设备数 P。比如 4 台设备、每台 2 个虚拟阶段,总共 8 个。要区分 M(微型批次)与 k 的角色。

Q5. Interleaved 相比传统流水线最大的额外代价是?

单选题 · mid

  • A.通信次数显著增加← 正确答案
  • B.模型精度大幅下降
  • C.显存占用明显变小
  • D.训练数据需要加倍

答案:A。Interleaved 使机器间通信边界从 P−1 增加到 kP−1,通信次数约为原来的 k 倍。它不会改变模型精度或数据量,显存管理反而更复杂而非变小。

Q6. 影响 Interleaved 实际收益的因素有哪些?

多选题 · mid

  • A.微型批次数量的大小← 正确答案
  • B.集群通信带宽高低← 正确答案
  • C.虚拟阶段的划分粒度← 正确答案
  • D.激活函数的类型选择

答案:ABC。收益受 M(订单量)、带宽(传菜通道)、划分粒度(虚拟阶段细度)共同影响。激活函数类型与气泡收益无关,属于干扰项。

Q7. 当每台设备的虚拟阶段数 k=1 时,Interleaved 等价于?

单选题 · mid

  • A.传统流水线并行方案← 正确答案
  • B.纯数据并行训练方式
  • C.张量并行切分策略
  • D.零冗余优化器框架

答案:A。k=1 时虚拟阶段总数等于 P,交错退化为每设备一段,即传统流水线并行。数据并行、张量并行、ZeRO 都是其他维度的并行或优化手段。

Q8. P=4、M=32、k=4 时,Interleaved 的气泡比例约为?

单选题 · hard

  • A.3/47 约 6.4%← 正确答案
  • B.3/35 约 8.6%
  • C.4/47 约 8.5%
  • D.3/15 约 20.0%

答案:A。interleaved 气泡公式为 (P−1)/(M+kP−1) = 3/(32+16−1) = 3/47 ≈ 6.4%。B 是传统公式 3/35 的值,C 和 D 代入有误。

Q9. Interleaved 相比传统流水线带来的变化有哪些?

多选题 · hard

  • A.通信次数大约增至k倍← 正确答案
  • B.气泡比例得到明显下降← 正确答案
  • C.调度实现复杂度上升← 正确答案
  • D.模型参数量随之增加

答案:ABC。通信次数约增 k 倍、气泡下降、调度复杂度上升,这三者正是 Interleaved 的“得与失”。模型参数量只由层数和宽度决定,与调度方式无关。

Q10. 关于 Interleaved 的工程实现,下列说法正确的有?

多选题 · extreme

  • A.需要维护多虚拟阶段调度表← 正确答案
  • B.可与1F1B调度方式结合← 正确答案
  • C.负载不均衡时收益会打折← 正确答案
  • D.一定比传统实现更快收敛

答案:ABC。Interleaved 需要调度表维护多个虚拟阶段,可与 1F1B 结合使用,负载不均会削弱收益,这些都正确。但“一定更快”是理想化错觉,实际可能因实现质量和带宽限制而变慢。