从0训练LLM · 现代大模型体系 岔路 阅读 + 实验 ≈ 30 分钟 页内实验 ×1
C10 并行:一张卡不够怎么办 岔路课

128K 的序列,激活放在哪?

长序列:按序列切
主线的四种切法都没有切「一条序列」本身。一条 131,072 个 token 的序列放一张卡,只存每层输入就要 85.9 GB。按序列切给几张卡,注意力却需要全部的 K、V:Ring 让 K、V 块沿环传一圈,Ulysses 用 all-to-all 换成按头切。因果掩码让连续切出的块负载不等,zig-zag 头尾配对就精确均衡。
🔀

这是一堂岔路课。主线的四种切法——数据、模型状态、层内矩阵、层——都默认「一条序列放得进一张卡」。长上下文训练时这一条不成立了。

本课一问:一条 128K 个 token 的序列,激活放在哪?
这一课先不碰:长上下文的位置编码(C2 第 5 课)、训练阶段怎么把长度一步步拉长(C11)、推理时的 KV cache(C3、C13)。

从已有出发

从已有出发 · 训练一步摊到多张卡 已学本课还没学
取一批
前向 ZeROTPPPCP
loss
反向
梯度同步 DP
优化器更新
每课多切一维:
数字口径:构建时由锚点 Qwen3.8-27B 与 DeepSeek-V3 的官方 config 按公式现算;卡数按 8 张计。本章没有我们自己的多卡实测。

C9 第 5 课的激活公式里,序列长度 s 出现两次:线性项 34sbh 和注意力分数项 5as²b。FlashAttention 不把 s × s 的分数表写进显存,全量重计算每层只存输入 2sbh——这两招把激活压到了头,可它们都随 s 线性增长。这一课讨论长序列,贯穿例句只有 5 个 token,太短,下面的组件改用位置编号 0、1、2……

先自己设计:整条序列放一张卡

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案一条序列整个放在一张卡上
锚点 Qwen3.8-27B · 一条序列 · BF16s = 32,768s = 131,072s = 262,144(原生)
物化的注意力分数(单头单层,s × s × 2 字节)2.1 GB34.4 GB137.4 GB
全量重计算:每层只存输入 2sbh × 64 层21.5 GB85.9 GB171.8 GB

数字口径:按 Korthikanti 2022 的记账与锚点 config 现算,b = 1,GB = 10⁹ 字节。还没算模型状态。

改进一:Megatron 的序列并行(配合张量并行)

第 3 课的张量并行把注意力和 MLP 切开了,但 LayerNorm、dropout 这些按 token 独立的部分,在每张卡上各算一整份。Korthikanti 等人(2022)把这些部分按序列切开,原来的 all-reduce 换成等量的 reduce-scatter + all-gather,激活整体变成 1/t 。它不增加通信,但只在张量并行的组内切,切的份数 = t ≤ 8。

改进二:Ring Attention / 上下文并行,K、V 沿环走一圈

Q 留在本卡,把 K、V 按序列切成 N 块,沿环传 N − 1 步:第 k 步,卡 c 拿到卡 c − k 的那一块 K、V,算自己的 query 对这块 key 的注意力,在线累加(和 FlashAttention 的分块在线 softmax 是同一个技巧),再把这块传给下一张卡。传的同时算上一块,通信可以完全藏在计算后面 。

但因果注意力有个麻烦:第 i 个 query 只看 j ≤ i 的 key。把序列连续切给 N 张卡,卡 0 的 query 只能看自己那一段,最后一张卡要看全部:

每张卡要算多少个 (i, j) 对
Ring 的 N 步:第 k 步每张卡算多少(按最慢的卡同步推进)
🎯

试三件事:① 读条形图:连续切分时 4 张卡要算的 (i, j) 对数是 10 : 26 : 42 : 58,最慢的卡是平均的 1.71 倍;② 看「Ring 的 N 步」表:每一步都要等最慢的那张卡,很多卡在一些步里算 0 个对,总耗时 58,而完全均衡只要 34;③ 切到 zig-zag,每张卡都是 34,Ring 的总耗时也降到 34——再把示例长度换成 32、卡数换成 8,仍然精确相等。

zig-zag 的做法:把序列切成 2N 段,卡 k 拿第 k 段(靠前、要算的少)和第 2N − 1 − k 段(靠后、要算的多)。第 k 段有 k·a² + a(a + 1)/2 个对(a 是每段长度),k 与 2N − 1 − k 两段相加,结果与 k 无关——每张卡的工作量按构造相等 。Llama 3 的上下文并行用的正是这种配对:把序列切成 2 × CP 段,第 i 张卡拿第 i 段和第 2 × CP − 1 − i 段 ——不过它不沿环传,而是先把 K、V all-gather 到每张卡上再算。

改进三:Ulysses,换成按头切

DeepSpeed-Ulysses(2023)换了个角度:进注意力之前做一次 all-to-all,把「每张卡有一段 token 的全部头」换成「每张卡有全部 token 的一部分头」;注意力算完,再 all-to-all 换回来 。多头注意力的头之间互不相干,所以按头切的注意力不需要任何中间通信——和第 3 课按头切的张量并行是同一个道理。

它的约束来自 config:头数必须能被卡数整除。锚点有 24 个 Q 头,8 张卡正好每卡 3 个;可 KV 头只有 4 个,切给 8 张卡就得复制。Ring 没有这个限制,但每个全注意力层都要传 K、V 块。锚点 s = 131,072、8 张卡时,Ring 每个全注意力层每卡传 0.5 GB,Ulysses 的四次 all-to-all(Q、K、V、输出)每卡传 0.4 GB——量级相同,约束不同。下面把这些数放在一起:

每张卡要算多少个 (i, j) 对
Ring 的 N 步:第 k 步每张卡算多少(按最慢的卡同步推进)

线性注意力层:只传一个固定大小的状态

锚点 64 层里只有 16 层是全注意力;另外 48 层是线性注意力(Gated DeltaNet,C11 揭晓)。线性注意力把前面所有 token 压成一个固定大小的状态,锚点每层是 48 × 128 × 128 = 786,432 个数,和序列长度无关。做上下文并行时,卡与卡之间只需要接力传这个状态,而不是随 s 增长的 K、V 块。

Kimi K3 的报告把这一点写成了一节:softmax 注意力做上下文并行要交换随序列长度增长的 K、V 块,线性注意力只带一个固定大小的状态;但 delta rule 这类更新(K3 的 KDA、Qwen3.8 的 GDN 都属于这一类)会先把进来的状态乘一个与 token 有关的矩阵,不能把各段的局部状态直接相加,K3 为此多传一个「累计转移」,只需一次固定大小的 all-gather 。这是 2026 年混合架构的一个隐性好处:长序列的通信只由那少数几层全注意力决定。

⚠

常见误解之一:「序列并行和张量并行是两回事,不能一起用。」

Megatron 的序列并行本来就是张量并行的配套:在张量并行的组内,把 LayerNorm、dropout 这些部分按序列切开,通信量不变。

常见误解之二:「把序列切成等长的块,负载就均衡了。」

因果掩码让靠后的 token 看得更多:4 卡连续切分是 10 : 26 : 42 : 58,序列很长时趋近 1 : 3 : 5 : 7。要 zig-zag 这类配对切法才均衡。

常见误解之三:「上下文并行就是把 KV cache 分到几张卡上。」

那是推理时的事。训练时切的是每一层的激活和计算,K、V 块在前向、反向里都要传。

证据三问

问本课的回答
① 它解决什么问题?一条序列太长,激活放不进一张卡:按序列维切给几张卡
② 数学上为什么可能有效?注意力可以按 key 块分块计算、在线累加(与 FlashAttention 同理);zig-zag 的负载均衡按构造成立
③ 实验上为什么最后选了它?Ring Attention 与 Ulysses 都报告了随卡数扩展的长序列训练;Llama 3 在 131,072 长度的阶段用了 16 路上下文并行(表 4);K3 为线性注意力层单独做了上下文并行

演进地图:你在这里

并行的演进:每切一维,都是被上一代的某个真数字逼出来的
  1. 起点 一张卡 C9 的结论
    解决了训练一步的全部东西都在一张卡上,不需要任何通信。
    卡在锚点的模型状态 16 字节 × 27,781,427,952 = 444.5 GB,是 80 GB 的 5.6 倍;就算放得下也太慢:DeepSeek-V3 预训练用了 2,664K H800 GPU 小时,一张卡约 304 年。
  2. 第一代 数据并行 + ring all-reduce ring 来自 HPC(2009),2017–2018 进入深度学习
    解决了每卡一份完整模型、算 1/N 的数据,每步把梯度加起来。ring 让每卡只收发 2(N−1)/N 倍梯度:锚点 8 卡 97.2 GB、64 卡 109.4 GB(汇总到 0 号卡的朴素做法:388.9 GB → 3,500 GB)。
    卡在只解决「慢」:每张卡仍要放下完整的 444.5 GB。
  3. 第一代 · 工程 分桶,边反向边同步 PyTorch DDP(Li et al. 2020)
    解决了反向逐层产出梯度,攒满一桶(默认 25 MiB)就先发,通信藏到后面几层的反向里。
    卡在DP 的通信量每步固定:锚点 8 卡每卡 97.2 GB,按 IB 50 GB/s 要 1.94 s;每卡 4,096 个 token 的反向只有约 1.05 s(推演)——token 太少就藏不住。
  4. 第二代 ZeRO-1 / 2 / 3 · FSDP Rajbhandari 2019;PyTorch FSDP 2023
    解决了不再每卡存一份:8 卡上 444.5 → 152.8 → 104.2 → 55.6 GB(依次切优化器状态、梯度、参数)。
    卡在切参数后每步多一次 all-gather,通信是 DP 的 1.5 倍;激活不切:s = 4,096 的选择性重计算要 45.6 GB,放不进剩下的 24.4 GB。
  5. 第三代 张量并行(层内切矩阵) Megatron-LM(Shoeybi 2019)
    解决了第一个矩阵按列切、第二个按行切,一个 MLP 只要一次 all-reduce;t = 8 配序列并行,激活 45.6 → 5.7 GB。
    卡在每层前向 2 次、反向 2 次同步:每 4,096 个 token 每卡要发 18.8 GB,每层都要等——只能放在机内。ZeRO 原文实测:跨两台 DGX-2,每卡约 5 TFLOPS,不到峰值 5%。
  6. 解决了按层切,跨机只传段与段之间的激活;切 micro-batch 填满流水线;1F1B 把在途激活从 m 份压到 p 份;interleaved 把气泡除以 v。
    卡在首尾必然空等:p = 8、m = 32 时气泡 (p−1)/m = 21.9%(占总时间 17.9%),interleaved v = 4 也还有 5.5%。
  7. 2023–2024 Zero Bubble · DualPipe Qi 2023;DeepSeek-V3 2024
    解决了反向拆成「对输入」B 与「对权重」W,W 拿去填空泡(F = B = W 时 ZB-H1 的气泡是 1F1B 的 1/3);DualPipe 从两头喂 micro-batch,并把 all-to-all 藏到另一批计算后面。
    卡在DualPipe 要存两份参数;调度更复杂;通信只是被藏住了,量一点没少。
  8. 岔路 · 长序列 序列并行 / 上下文并行 2021–2023:SP、Ring Attention、Ulysses 你在这里
    解决了128K 的序列按序列切给多张卡;zig-zag 头尾配对,把因果负载 10 : 26 : 42 : 58 配平成每卡一样多。
    卡在每个全注意力层都要在卡之间传 K、V:锚点 s = 131,072、8 卡时每层 0.5 GB;Ulysses 按头切,KV 只有 4 个头。
  9. 岔路 · MoE 专家并行 + all-to-all GShard 2020 → DeepSeek-V3 2024
    解决了DeepSeek-V3 的 654B 路由专家参数分到 64 张卡,每卡每层 4 个;每个 token 最多去 4 个节点。
    卡在跨节点 IB 50 GB/s 只有 NVLink 160 GB/s 的约 1/3,跨节点 EP 的计算与通信约 1 : 1;热门专家所在的卡成为掉队者(→ C11)。
  10. 2021 起 组合:3D / 4D / 5D 并行 Narayanan 2021;Llama 3;DeepSeek-V3
    解决了Llama 3 405B:[TP, CP, PP, DP] = 8 × 1 × 16 × 128,16,384 张 H100,BF16 MFU 41%;DeepSeek-V3:PP 16 × EP 64 × ZeRO-1 DP,不用 TP。
    卡在没有万能配置:每种组合都要先算清每卡显存、每一维的通信走哪条链路、气泡多大(实验课)。
数字口径:锚点与 DeepSeek-V3 的数字由 anchor-model.json / frontier-models.json 的官方 config 在构建时按公式现算(GB = 10⁹ 字节,卡按 80 GB 计);「分桶」一行的时间是推演(有效算力 400 TFLOPS、IB 50 GB/s);5 TFLOPS 出自 ZeRO 原文 §1;GPU 小时、并行配置、带宽出自 DeepSeek-V3 报告 §1、§3.1–3.2(本地 PDF);Llama 3 的配置出自其报告表 4。本章没有我们自己的多卡实测。

一句话

📌

长序列的激活按序列切到多张卡上;因果注意力让连续切出的块工作量不等,zig-zag 把头尾配对就精确均衡;Ring 沿环传 K、V 块,Ulysses 用 all-to-all 换成按头切,后者受头数限制。

回到主线

实验课:几种切法怎么组合成一套方案? → 实验课(设备网格里有 CP 这一维);或者先看另一条岔路:MoE 的专家放在哪?

你可能会问