从单卡到多卡
多用几张卡,原因只有三种:权重放不下(容量),单个请求太慢(延迟),同时来的请求太多(吞吐)。推理实例描述模型怎么部署,超节点描述加速器怎么互联:同一台八卡机器,可以放八个单卡实例,也可以放两个四卡实例。
实例内的卡要频繁交换中间结果,超节点就是为这种协作准备的高带宽、低延迟互联。
图 6-1 · 同样八张卡,三种分组
容量:Qwen3-235B-A22B 放进一台 HGX H100
94 层,隐藏维 4096,64 个查询头、4 个 KV 头,头维 128;每层 128 个路由专家,每 token 选 8 个。BF16 权重约 470.2 GB,每 token 的 KV 是 2 × 94 × 4 × 128 × 2 = 188 KiB。每张卡要满足:
Wi + Ki + Ai + Ui ≤ Ci (权重 + KV + 激活 + 工作区 ≤ 可用内存) (6-1)
图 6-2 · 每卡内存计算器
80 GB / 卡 · 工作区 2 GiB权重按矩阵的行或列分成 p 份;归一化参数和路由器每卡各存一份,所以每卡比 470.2/8 略多。KV 按注意力头分,只有 4 个 KV 头,八卡时每两卡共用一个头,每卡存全部 KV 的 1/4。
时间:一次调用由读取还是计算决定
Top = max(F / P, V / BHBM) (6-2) H100:P = 989.4 TFLOP/s,BHBM = 3350 GB/s
计算和访存重叠,取较长的那项(第 4 章的 Roofline);前后依赖的算子时间相加。以一层专家为例:生成 1 个 token,选中的 8 个专家共 288 MiB 权重要读一遍,约 90.1 μs;矩阵乘只要约 0.31 μs。
batch 为 1 时 MFU 上限只有约 0.3%,这与实现好坏无关;本章的各种并行,都是在这个约束下重新组织权重的读取和复用。
一层专家:读取 vs 计算(拖动 token 数)
每专家 3 × 4096 × 1536 × 2 B = 36 MiB被选中专家数按式 (6-8) 的期望估计:E[1 − (1 − k/E)m]·E。m = 8192(prefill)时 128 个专家全被选中:读 4.5 GiB 约 1.44 ms,算 2.47 TFLOPs 约 2.50 ms,瓶颈翻转为计算。整模型一步读约 43.1 GB 权重 + 1.58 GB KV:单卡约 13.3 ms,八卡每卡约 5.79 GB、1.73 ms。
通信也随形状变
隐藏张量 m × 4096 BF16:单 token 8 KiB,8192 token 64 MiB。交换次数一样,每次数据量差 8192 倍。小消息怕启动开销,大消息看持续带宽。
Decode 有时间依赖
这一步的输出是下一步的输入,单个会话只能逐步走。多个会话能一起提供就绪输入,复用权重,但 KV 容量和读取量也跟着涨。
训练更重
还要反向传播、同步梯度,前向激活要留到反向用完。本章先讲切分与交换,完整训练步在第 10 章。
六种并行方式:各切哪一维
一层的输入激活有三维:样本 B、序列位置 S、隐藏特征 H。模型结构还有两维:层 L 和 MoE 的专家集合 E。六种常用并行方式,就是各切其中一维。点下面的按钮,看每张卡拿到什么、必须交换什么。
切样本、位置、层或专家,各卡得到的是完整结果,收集或交接即可;切特征,各卡只得到同一输出的部分和,必须相加才能用。
粗虚线是切分位置,不表示数据流向。几种方式可以叠加:SP 通常和 TP 用同一组卡,EP 可以和注意力部分的 DP 共用卡,PP 切的是有先后依赖的计算图。
6.2.1 数据并行:复制模型,切分样本
推理中的数据并行就是部署多个实例。一张卡每秒处理 r 个请求,八个单卡实例就是 8r;把八卡合成一个实例、单请求加速 S(8) 倍,吞吐是 S(8)·r。只要有通信和无法并行的部分,协作实例就是拿一部分总吞吐换更短的单请求时间。训练时各卡的梯度要汇合:两卡各算四个样本的平均梯度 g₀、g₁,全批平均梯度是 (g₀ + g₁)/2。
6.2.2 张量并行:切分一层内的矩阵
按列切,每卡算不同的输出元素,结果拼接;按行切,每卡算同一输出的一部分,结果相加。改下面的数字试试。
图 6-7 / 6-8 · 同一个乘法 x·W,两种切法
两种切法在 SwiGLU 里首尾相接:上投影 Wg、Wu 按列切(中间维 f 分给各卡),SiLU 与逐元素乘留在本地,下投影 Wd 按行切,于是
Y = [Z₀ Z₁]·[Wd,0; Wd,1] = Z₀Wd,0 + Z₁Wd,1 (6-3) 每项都是 m × h 的部分和
图 6-5 / 6-9 · 一层里的两处切分,各需一次 AllReduce
卡 1:头 16–31
需要完整结果用 AllReduce;下一个算子能接着用分片,就用 ReduceScatter(先求和再分片);要从分片拼回完整数据用 AllGather。Qwen3-32B 64 层 × 2 = 128 次归约/步。头是最小分配单位:TP 卡数超过 KV 头数后,再加卡只会复制 KV。
例题 · TP 切分省多少读取,多出多少通信
Qwen3-32B:h = 5120,f = 25600长上下文如何迫使稠密模型跨卡
Qwen3-32B 权重约 65.52 GB,一张 H100 放得下;但每 token KV 是 2 × 64 × 8 × 128 × 2 = 256 KiB,一个 128K 会话就要 34.36 GB。权重 + 一个会话 + 2 GiB 工作区约 102.03 GB,单卡放不下,TP 首先是为了容量。
30B 级服务在 128K 下要不要多卡 TP,主要取决于注意力设计,而不是稠密还是 MoE。
图 6-6 · 三个 30B 级模型的状态与容量
能放下的请求数 = ⌊(n × (80 GB − 2 GiB) − W) / S⌋。Qwen3.6-35B-A3B 40 层里只有 10 层是完整注意力(每层 2 个 KV 头、头维 256),其余 30 层是线性注意力,只存固定大小的递推状态(62.9 MB FP32 + 2.0 MB 卷积状态)。Qwen3-32B 与 Qwen3-30B-A3B 上限 128K。
batch 64、32K 上下文时一次 decode 的读取时间(按 3350 GB/s)。三者权重读取相近(18–20 ms),状态读取相差十倍以上:差距来自注意力设计,Qwen3-30B-A3B 同样是 MoE,每 token 仍要 96 KiB KV。MoE 一直保留的优势是矩阵运算量只有稠密的 1/12~1/4。
TP 的执行时间模型
Qwen3-32B 128K 会话每步要读 64 × 930 MiB 层权重 + 1.56 GB 词表输出投影 + 全部 KV:
V(s) = 64 × 930 MiB + 256 KiB × (s+1) + 151936 × 5120 × 2 B (6-4) s = 131064 时 ≈ 98.32 GB → 29.35 ms
T(p) = Tlocal / p + 128 · TAR(p) (6-5) 加卡有用的条件:128 [TAR(2p) − TAR(p)] < Tlocal / 2p (6-6)
矩阵运算只要约 0.34 ms,每层都受内存带宽限制。p 越大,右边越小:即使每次归约只多一点点,累计 128 次也会吃掉本地时间的节省。下面的计算器把第 6.4 节的归约算法也接进来了。
TP 单步时间计算器 · 式 (6-5)
默认值 = 书中 HGX H100 参数每次归约的输入是一个 token 的 BF16 隐藏向量 M = 10 KiB。α = 0.822 μs 是 MSCCL++ 论文在 H100 八卡服务器上测得的 NVLink 单向延迟。TP16 的 KV 不再减少(只有 8 个 KV 头)。“TP16 · 跨服务器”用 nccl-tests 两台 HGX H100、16 rank 的实测 32.74 μs(16 KiB 档),不随滑块变。
二维切分:4×4 网格最快
[8192, 4096] × [4096, 12288] 的投影分到 16 卡,每卡起初只有 4 MiB 输入分片、6 MiB 权重分片。两个方向链路独立等速时,时间由较大的一方决定。
延伸
MeshSlice 沿这种布局继续分块,让收集与矩阵乘流水执行;推理系统 Arctic 在不同执行阶段切换分工,状态迁移见第 9 章。
6.2.3 序列并行:逐 token 算子沿序列分片
LayerNorm、Dropout、残差相加只依赖本 token 的隐藏向量。SP(Megatron 的定义)让 TP 组内每张卡只处理一段位置,不再各存一份完整激活。AllReduce = ReduceScatter + AllGather,SP 只是把这两半放到了不同的算子边界上。
图 6-10 · 两卡 SP + TP 的一段
卡 1:位置 4–7
特征分片
部分和
卡 1:4–7
节省只发生在保持序列分片的区间,不是模型所有激活和权重都缩小。配套实验在 JAX 中对比了保持分片和重新收集两条 FFN 路径,TP/SP 输出逐位相同。
6.2.4 上下文并行:切分同一序列的注意力
CP 把一个长序列的位置分给多卡,每卡存自己那段的 Q、K、V。本卡的查询仍要看到掩码允许的远端 K、V:可以一次收齐,也可以让 K/V 块环形传递、边到边用在线 softmax 累计。Ring Attention 是传输调度方式,CP 是工作划分方式,两者不是同义词。
图 6-12 · 8 位置因果注意力:谁算多少对
行 = 查询位置,列 = 键位置,实色格是必须计算的查询—键配对,颜色表示这一行归哪张卡。点左侧行号可以把该行改派给另一张卡。连续切半时两卡 token 数相同,工作量却差 2.6 倍;搭配成 {1,2,7,8} / {3,4,5,6} 各 18 对。实现常用分块交错的“之”字形布局,但必须保留原始位置和因果掩码,远端上下文不能当 padding 丢掉。
Decode 时沿历史位置切:合并统计量,不能平均输出
每卡先算本段的最大值 mr、指数和 lr、未归一化加权向量 ur,再合并:
m = max mr,l = Σ emr−m lr,u = Σ emr−m ur,o = u / l
与第 5 章 tile 之间合并 softmax 相同,只是统计量要跨卡传输。框架里 SP、CP 的名字有交叠,判断配置时看切了哪些算子、哪些张量、用哪个通信组。
6.2.5 流水线并行:按层划分阶段
把层按顺序分成 q 个阶段,阶段之间只交接激活。输入拆成 b 个互不依赖的 micro-batch,不同阶段才能同时忙。
TPP = (q + b − 1)·t,ηPP = b / (q + b − 1) (6-7)
图 6-14 · 流水时序
左上和右下的空白是流水填充与排空。四阶段四个 micro-batch 利用率 4/7 ≈ 57%,16 个时 16/19 ≈ 84%。阶段不等长时,最慢的阶段定节奏,上游积压,缓冲满后只能暂停;按各层实测时间划分阶段可以缓解。自回归同一会话的未来 token 是一条依赖链,提供不了 micro-batch。
6.2.6 专家并行:切分专家集合
MoE 每个 token 只用选中的专家,但整个专家集合都要常驻。EP 把专家放到不同的卡上:注意力和路由器在 token 所在卡完成,输入按专家所在卡发出去(dispatch),算完送回原卡按路由权重合并(combine)。两次交换都是 All-to-All:每张卡向其他各卡发不同的数据。
图 6-15 / 6-16 · 点选 token A 的专家
示意布局:8 卡 × 每卡 2 个专家每个 4096 维 BF16 输入 8 KiB。同一张卡上的多个专家可以共用一份输入,所以按目的卡发送比按专家发送省。接收方先按专家重排输入行做矩阵乘,再按 token 编号排回原序;收到输入最多的卡,通常也要做最多的专家计算。Qwen3-235B-A22B 每专家 36 MiB,单层 4.5 GiB,94 层约 423 GiB,八卡均分每卡约 52.9 GiB。
组合并行与模型规模
组合多种方式时,先给每张卡标坐标,再对每个算子写出输入、权重、输出分片和通信组。DP2 × PP2 × TP4 占 16 张卡;同一 TP4 组里再开 SP,卡数不变,不再乘一个 SP4。
切分确定每份工作归谁,调度确定就绪、执行、通信与回收的顺序,两者合起来才是完整的并行方案。
设备坐标
每格是一张卡,(d, p, t) 是它在 DP、PP、TP 三个方向上的编号。同色框是一个 TP 组(层内归约),箭头是 PP 相邻阶段的激活交接(TP 组各卡持有完整 8 KiB 隐藏向量时,两阶段之间共发 2 × 8 = 16 KiB)。
TP2 × EP4:注意力复制,专家切分
八卡分成四个专家组,每组 32 个专家,组内两卡再切专家中间维(每卡 768 维)。四个组都对同一请求做注意力、各存一份 KV,于是每组本地就有完整的专家输入,不用跨组 dispatch;代价是存储和重复计算:每卡权重约 64.8 GB,八卡共 518.6 GB,比只存一份的 470.2 GB 多约 48.4 GB;KV 是实际的四倍。
图 6-17 / 6-18 · 先行内、再列内求和
归约用 FP32,单 token 完整隐藏向量 4096 × 4 = 16 KiB。两卡环形归约每卡发 1 个向量,四卡发 1.5 倍。每层三次汇合:注意力组内 16 + 专家组内 16 + 四组之间 24 = 56 KiB/卡。
6.3.2 批内复用与负载不均
64 个 token 各选 8 个专家,共 512 次分派。均匀覆盖 128 个专家时每个专家处理 4 行,全部选同样 8 个时每个专家处理 64 行:有效计算量相同,权重读取相差 16 倍。但活跃专家集中在一个 EP 组,那组的计算就是均匀时的 4 倍,其余组只能等。
分析执行时间要同时看两件事:整批的权重读取量(decode 常受它限制),以及负载最重的专家组的计算量(prefill 常受它限制)。
图 6-19 ~ 6-22 · 分派方式 × 专家放置
E = 128,k = 8,TP2×EP4E[Eactive] = E·[1 − (1 − k/E)m] (6-8) m = 8 时约 52 个活跃专家、理想读取约 1.8 GiB
“均匀”和“集中”是两个极端;真实路由由输入和模型共同决定。DeepSeek V4-Flash 的路由记录覆盖 43 层、约 131 万次选择,各专家频率各不相同。把热点专家分散到不同 EP 组,既保留批内复用,又减轻单组负担。
6.3.3 从数千亿到万亿参数
权重 vs 一台 HGX H100 的 640 GB
每个参数只计一次BF16 按 2 B/参数;V4-Pro 约 1.6T、Kimi K3 约 2.8T 参数,即使按半字节/参数也已超过一台服务器。可选手段:增加 EP 分组把专家分到更多卡,增加专家内 TP 减小每卡专家矩阵,增加 PP 减少每阶段的层数。
先投影再发送,通信减半
Kimi K3 的路由专家在 3584 维潜空间工作,主干隐藏向量 7168 维:先投影再发,BF16 向量从 14 KiB → 7 KiB。每层 896 个路由专家选 16 个,另有两个处理完整主干向量的共享专家;93 层中 69 个 KDA 层用固定大小矩阵递推,24 个 MLA 层用低维表示保存上下文。
两个方向的影响
权重增多扩大所需总存储容量,决定至少要动用多少资源;计算图不同改变要交换的数据,决定这些资源该怎么连。DeepSeek V4-Flash 约 284B 参数,每层 256 个路由专家选 6 个,外加共享专家。
集合通信的实现与执行代价
操作名称规定计算什么、结果落在哪些卡上;算法规定数据分几轮、怎么传。按开始和结束时各卡持有什么,可以分出四种集合通信。点一下切换“开始 / 完成”。
四种集合通信(4 卡)
Broadcast 把一张卡的数据发给全组,Reduce 只把结果交给一张卡,都不让全组持有结果。MoE 的 combine = 结果回传 + 恢复 token 顺序 + 按路由权重求和,不能只凭名字当成 AllReduce。全组要等最后一张卡发起后才能开始交换,发起时刻相差越大,加快交换本身的收益越小(第 7.6.1 节)。
6.4.2 环形 AllReduce:一步一步看
n 张卡排成有向环,每卡的部分和 M 字节分成 n 块。每轮每卡向下一卡发一块、收上一卡一块。下面每卡对每个块的贡献分别记为 1、10、100、1000(卡 0、1、2、3),所以数字的每一位表示已经加进了哪张卡,1111 就是完整和。
图 6-23 / 6-24 · 4 卡环 0→1→2→3→0
Tring = 2(n−1)·α + 2(n−1)·M / (nB) (6-9) Ttree = 2·log₂n·(α + M/B) (6-10)
ReduceScatter 要 n−1 轮(一个块从起点带着一份贡献出发,再经过其余 n−1 张卡),AllGather 再 n−1 轮;每卡共发 2(n−1)M/n。第一项随卡数增长,第二项逐渐接近 2M/B:数据小时逐轮启动占主导。二项树先两两归约再广播,轮数少,但关键路径上每轮都传完整张量。
图 6-26 · 环 vs 树:交点在哪
默认:8 卡、0.822 μs、450 GB/s8 卡时:10 KiB 的 decode 输入,环 11.55 μs、树 5.07 μs;80 MiB 的 prefill 输入,环约 0.34 ms、树约 1.12 ms。交点约 680 KiB。α 减半,交点左移。
带宽翻倍几乎没用
TP8 一次归约 11.55 μs 里有 11.51 μs 是 14 轮启动。带宽翻倍整步只省约 2.5 μs;每轮开销减半,128 次归约省约 0.74 ms。上面 TP 计算器可以直接验证。
TP 卡数的边际收益
TP2 → TP4:本地省 7.34 ms,通信多 0.42 ms,净省约 6.92 ms。TP4 → TP8:本地只再省 3.67 ms,通信多 0.84 ms,净省降到约 2.83 ms。式 (6-6) 两边在靠近,但八卡仍更快。
6.4.3 通信库与计算争用资源
NCCL(昇腾上是 HCCL)先建通信组、给每卡分配 rank,再把操作提交到 CUDA stream。调用返回通常只代表已提交,不代表缓冲区可以复用;用结果的一方要靠 stream 顺序或 event 等待。MoE 每对卡之间的 token 数随 batch 变,等长 All-to-All 表达不了,要用成组的 Send/Recv 或专门的 EP 通信库。
评价重叠执行,要比较两者同时运行的时间,不能把各自单独测的时间直接相减。
图 6-27 / 6-28 · 实验 6-5:通信与矩阵乘同时跑
四个 CPU 进程用 Gloo 做 AllReduce,同时每个进程做一次矩阵乘,五组中位数(M2 Max,PyTorch CPU 版)。GPU 上道理相同:加通信线程和通道能加快单独传输,也会占用计算资源。AutoCCL 在训练中记录含并发干扰的实际通信时间来调优,重计算干扰下 AllGather 从 18.26 提高到 32.44 GB/s。
algbw 与 busbw
algbw = M/T;n 卡 AllReduce 的 busbw = 2(n−1)M/(nT)。busbw 是归一化指标,不是网卡实际吞吐。
调优多久回本
搜索与切换额外花 S,之后每次调用省 Δ,至少调用 ⌈S/Δ⌉ 次才收回。
融合要保持顺序
RMSNorm 必须等归约得到完整输入。两卡部分和:
6.4.4 融合、加速器发起与专用卸载
Qwen3-32B 八卡算例中,128 次归约的启动开销约 1.47 ms。可以改三处:一次启动做多少工作(融合:归约后加残差、做 RMSNorm 放进一个 kernel),由谁发起(加速器发起:省掉主机往返),由谁执行搬移和归约(专用卸载:复制引擎、昇腾 CCU、交换机内逻辑)。若瓶颈是共用的网络出口,卸载并不减少要传的字节。
图 6-29 · 通信请求由谁发起
控制路径穿越 PCIe 的次数CPU 代理线程
- GPU 在主机内存写就绪标志
- CPU 轮询到,构造请求描述符
- 敲网卡门铃(写寄存器)
- 网卡从主机内存读描述符
- 完成记录写回主机,CPU 转告 GPU
一个 CPU 线程每秒能处理的请求有限,大批小请求在这里排队。
GPU 的 SM
- GPU 在自己内存里构造描述符
- SM 直接敲门铃
- 网卡从 GPU 内存读描述符
- 完成记录写回 GPU,SM 轮询
CPU 退出关键路径,但要分出一部分 SM,不能同时做矩阵计算。GPUDirect Async、DeepEP 低延迟 kernel 走这条。
网卡上的处理器
- 主机为一批操作发一次触发
- BlueField 类网卡内的数据通路处理器构造描述符、敲门铃、取描述符
不占 SM,也不占 CPU 核。
三种方式下,发起端的载荷搬出 GPU 内存、完成记录写回 GPU 内存都各穿越 PCIe 一次;对端还要再穿越一次。取舍是:由谁提供核、控制路径多长、每秒能发起多少请求。1、4、16 个 token 时归约输入是 10、40、160 KiB,vLLM 等框架会为小数据量选专门实现。
超节点的物理组织
集合算法规定逻辑上谁发给谁,物理拓扑决定数据实际经过哪些设备和链路。多次传输共用一个接口,就要排队分一份带宽。
再加一台服务器,TP16 反而比 TP8 慢约 1.52 ms:卡多了,每卡读得少了,换来的却是更贵的跨服务器同步。
TP16 · 两台 HGX H100 经网卡
只有 8 个 KV 头,每卡 KV 与 TP8 相同,本地只从 3.67 降到 2.48 ms。16 卡排成一个环、每跳等 InfiniBand 3.76 μs,一次归约 30 轮约 113 μs;实际通信库的分层算法实测 32.74 μs:
T(16) ≈ 2.48 + 128 × 32.74 μs ≈ 6.67 ms
TP16 · 同一个 NVLink 交换域
DGX H100 的 NVLink Switch System 最多连 256 张 H100。按每轮 0.822 μs,16 卡环形 30 轮,128 次约 3.16 ms,单步约 5.64 ms,仍慢于 TP8 的 5.15 ms。对这类模型,更大互联域的价值是容纳更多实例或更大的模型,而不是把一个会话切得更碎。
端口、上联与割集
一张卡和其余 N−1 张都直连需要 N−1 条连接;交换机把连接集中起来。一颗交换芯片的端口数叫基数(radix)。第三代 NVSwitch:64 个 NVLink 4 端口,每端口每方向 25 GB/s。
图 6-30 · 一颗 64 端口 NVSwitch 的下联 / 上联分配
每端口每方向 25 GB/s上联是所有跨交换机流量的共同出口。把系统分两半,连接两半的所有链路叫割集:若有 V 字节必须从 A 侧到 B 侧,传输至少要 V / BA→B。DGX H100 的 NVLink Switch System 每节点只把一半 NVLink 带宽引出节点,即 2:1 收敛。
同样的发送量,不同的路径
16 卡双向物理环上做 8 MiB 输入的 ReduceScatter。递归算法每轮把对端距离翻倍;Swing 改变各轮对端来分散链路负载。两者每卡每轮都发 4、2、1 MiB,但对端不同。
图 6-31 ~ 6-33 · 递归 vs Swing
| 前三轮 | 递归 | Swing |
|---|---|---|
| 每次传输经过的物理跳数 | 1、2、4 | 1、1、3 |
| 最忙单向链路传输量 | 4、4、4 MiB | 4、2、2 MiB |
| 全网物理链路累计传输量 | 64、64、64 MiB | 64、32、48 MiB |
| 按 TPU v4 每条 ICI 50 GB/s,瓶颈链路决定的时间 | 约 252 μs | 约 168 μs |
传输时间少了三分之一,是因为共享链路上的数据少了。左图显示卡 0 这一轮的路径;所有卡同时发送,最忙链路的负载见右图。
经主机内存中转:缓冲位置和环的次序
卡 0、1 接 NUMA 节点 A,卡 2、3 接 B,环形归约共发 48 MiB。中转缓冲全放在 A:CPU 之间每方向 24 MiB;缓冲放到发送卡附近、同节点卡在环中相邻:12 MiB;环改为交替跨节点:又回到 24 MiB。经 PCIe 进出主机的量相同,经 UPI 的量按 2:1:2 变化。DGX H100 主机是两颗 Xeon 8480C,最多 4 条 UPI,每条 16 GT/s;每张 GPU 经 PCIe Gen5 x16 连主机,每方向 64 GB/s。
设计案例:直连环面还是交换网络
64 张卡,每卡同样 6 个端口、每端口每方向 50 GB/s(TPU v4 的 ICI 配置)。环面把 4×4×4 立方体每维首尾相连;交换网络让每卡只接交换芯片。每经过一颗芯片的路由器或交换芯片加 200 ns(UALink 2.0 为 128 lane 交换芯片设的空载延迟目标)。
图 6-34 / 6-35 · 跳数、流量模式、硬件代价
沿维度归约:把 AllReduce 拆成沿 x、y、z 的环形 ReduceScatter 与 AllGather,每步只在邻居之间传、六条链路同时工作,环面用满端口带宽,与交换网络一样快(TPU 编译器把并行分组对应到环面维度)。均匀 All-to-All(MoE dispatch):环面上每份数据平均走 3 跳(每维平均 1 跳),共享链路负载翻倍。图中是链路负载给出的下界,不含启动和排队,交换网络按无阻塞计。
三个比较合起来就是选拓扑的依据:负载以规则集合通信为主,还是大量目的地任意的小传输和 All-to-All;协作域要多少卡;是否愿意用交换芯片和更多线缆换任意两卡等距。
6.5.2 介质、供电与散热给出上限
介质
短距离铜线直接传高速电信号;距离一长,衰减和串扰加重,需要更强的均衡或重定时,线缆也更粗。光连接适合更远距离,但多了光电转换、供电和维护成本。可插拔光模块把转换放在可更换模块里;共封装光学(CPO)把光引擎移到芯片旁,缩短高速电通路,散热、测试和更换也要一起设计。
整组扩容的台阶
一个交换单元只能接 64 个端点时,第 65 张卡可能要加一整套交换设备:成本在整组边界上跳升,不是平滑增长。用式 (6-11) 求出大致范围后,还要按交换机、托盘、机柜这些安装单位组合。
式 (6-11) · 功率预算能装多少卡
DGX H100:10.2 kW / 台(8 卡)N ≤ g · ⌊(Pb − P0) / Ps⌋
单张 H100 SXM 上限 700 W,其余来自 CPU、NVSwitch、网卡和风扇,平均每卡 1.275 kW。ASHRAE 液冷白皮书:40–50 kW 的机柜要多达 5,000 cfm 风量,最好的地板送风口只有 1,900 cfm;40 kW 是本例按此选的风冷阈值。64 卡 81.6 kW、72 卡 91.8 kW 要集中在少数机柜里,都得改液冷。
6.5.3 ~ 6.5.5 三家的路线
NVIDIA:交换层扩大连接范围
DGX-1:八卡 NVLink 混合立方体网格,部分直连、部分要中转,频繁通信的任务要放相邻卡。DGX-2:16 张 V100 + NVSwitch,“是否直连”变成“交换层能同时转发多少”。DGX A100 / HGX H100:八卡服务器为单元。GB200 NVL72:72 张 GPU + 36 个 Grace CPU 的机柜级 NVLink。
TPU:拓扑与负载协同
TPU v4 以 4×4×4 的 64 芯片电互联单元为基础(64 芯片 + 16 台 CPU 主机放进一个机柜),再用光路交换机(OCS)连接多个单元;8³ = 512 芯片要跨柜。OCS 为作业分配形状合适的切片:同样 8 颗空闲芯片,连续两行能放两个 2×2 作业,棋盘状分布就一个也放不下。
华为 UB:扩展到资源访问
问题从“加速器怎么连”扩展到“一台主机上的设备能否直接用另一台主机的内存”。CloudMatrix384:384 个昇腾 910C NPU + 192 个鲲鹏 CPU 经 UB 交换结构组织,超节点外走 RDMA,业务接入走 VPC。若 384 个 NPU 两两直连要 73,536 条连接。
图 6-36 / 6-37 · 环面放大,割集跟不上
k×k×k 环面沿一维等分,要切断中间和首尾两处,各 k² 条,共 2k²。芯片数按 k³ 涨,割集按 k² 涨:每颗芯片都向另一半发同样多数据时,每芯片分到的割集带宽随 k 下降。
重连光路何时回本(Morphlux)
8 颗 TPU v4 做 8 MiB 输入的环形 AllReduce,每颗发 14 MiB,每条 ICI 50 GB/s。OCS 基于 MEMS 反射镜,切换是毫秒级。作业持续得越久,建立更合适的连接越值得。
UB:控制器位置、状态容量、建连时间
UB 把职责分成两层:事务层的 Jetty 是应用的提交/接收/完成端点;传输层的 传输通道(TP Channel,TP 指 Transport Protocol)维护序号、确认、重传、拥塞控制。多个应用端点访问同一远端时可以共用通道。传统 RDMA 的可靠连接 QP 把两者绑得更紧。共享通道不取消权限检查,也不自动建立跨应用的全局顺序。
控制器接在哪里
PCIe 外设网卡:门铃、读描述符、目标端读数据、写回数据、写完成记录,共 5 次穿越 PCIe。UB 控制器接在片上总线:一条 Load 指令直达控制器,数据直接写回寄存器。线路单程 100 ns 时,一次 64 B 读取:
节省不是把原有阶段压缩,而是处理器和控制器共用地址空间后,那些阶段不复存在。剩下的 0.42 μs 主要是线路时延和远端访存。
内存语义
单边操作由发起方直接指定已授权的远端地址,远端不必为每次操作准备接收请求。Load/Store 由处理器指令发起,Read/Write 由显式请求发起;两者都不意味着跨设备缓存自动一致(第 7.4.1 节)。
带宽要分清单向与双向合计:昇腾 950 的 UB 双向合计线速 2016 GB/s(72 lane × 112 Gbit/s),单向 1008 GB/s。UBoE 与 UB Link 共用同一组 SerDes,分配方式决定任务可用带宽。
图 6-40 · 每个网卡要存多少连接状态
片上缓存 256 KiBSpair = 512A²(H−1) + 32A SUB = 52A + 56(H−1) 目录式一致:W·((H−1)/8 + 8) B,W = 2²⁰ 行
逐对连接(RoCE 可靠连接)每条 512 B;UB 每端点一份 20 B Jetty + 32 B 内存段记录,每台远端主机一条 56 B 通道。缓存装不下的状态每次操作要从主机内存重读,逐对连接每次多两次 PCIe DMA,约 1 μs。目录式缓存一致(NVLink 属于这类)每次写还要向所有持有副本的对端发失效消息,规模被限制在几十个对端,NVL72 正在这一范围。
图 6-41 · 建立全部连接要多久
系统调用 5 μs · 32 核并行逐对:每条连接创建 + 三次状态迁移共 4 次系统调用,再交换一次连接编号(一次带外往返),约 0.52 ms,共 N·M 条。UB:N 个端点各 1 次系统调用,M 台远端各 1 次系统调用 + 1 次往返。作业每次重启或扩缩容都要重来,直接影响故障恢复时间。
内存池
并行方式是把计算和权重分出去;另一种办法是计算位置不动,只把一部分数据放到别的节点。借用没有增加物理内存,只是让任务能用上别处原本空闲的空间。
图 6-43 / 6-44 · 四个 80 GB 节点,任务需求 100、60、40、40 GB
总需求 240 GB < 320 GB,但任务 0 比所在节点多出 20 GB;把它整体搬到别处也放不下。借用要讲清三件事:地址(访问哪里)、权限(谁能访问)、完成与释放的顺序(什么时候能用)。例如节点 0 写入新 KV 后,要确认写入完成、能读到,才能开始注意力;节点 1 要等借用结束才能重新分配这段内存。
Bwindow = u·q / L,Busable = min(Bpath, u·q / L) (6-12)
图 6-45 / 6-46 · 在途事务决定能读多快
ConnectX-7 RDMA:50 GB/s,往返 7.52 μsq = 256 B 恰好是 Qwen3-32B 一个 KV 头在一层、一个 token 上的 K 向量(128 维 BF16)。往返取 MSCCL++ 测得的 InfiniBand 单向延迟 3.76 μs 的两倍。只提高线速、仍只允许 128 个在途事务,有效带宽不会变。
反复读:直接读远端还是先取回
KV 适合放哪里
会话在等用户下一轮输入时,可以长时间不读 KV:远端内存主要用来保存状态,恢复时再取回。活跃会话每一步都要读上下文,反复从远端扫描会持续占用带宽。
状态多大取决于上下文表示:第 9.2.2 节对比 8192 token 在 Qwen3-8B 的 GQA 与 DeepSeek-V3 的 MLA 下的字节数,后者约为前者一半。笔者早期关于 UB 内存池的构思针对服务器间的不均衡,KV 的保存与复用后来成为它的具体用途。
从并行方案到超节点规模
八张卡、四个 Qwen3-32B 会话,各自已有 131,064 个上下文 token,都要再续写 8 个 token(正好写满 YaRN 的 131,072 个位置)。一个实例一次服务一个会话,请求按实例轮转分配。每步时间来自式 (6-5),八步相加就是会话服务时间。
层内矩阵可以切给多张卡,独立会话可以分给多个实例,两者抢的是同一批卡;单会话期限越短越需要大协作组,独立会话足够多时就该多开实例。
图 6-47 ~ 6-52 · 部署设计台
成本单位:H100 GPU·s图 6-51 / 6-52 · 每个按时会话的成本随期限变化
曲线从至少三个会话按时完成处开始;TP1 放不下 128K 会话,没有曲线。勾选上面的“故障”可以看图 6-52:故障被隔离在一个实例内,但占用时间延长、按时会话减少,每个会话的成本仍约翻倍。实例用的设备越多,请求执行就依赖越多设备正常;两个实例若共用电源或交换机,拆分也要配合资源隔离。
6.7.3 给定模型与硬件,怎么选切分策略
π* = argminπ ∈ Pfeasible J(π) 可行集:每卡容量、数据依赖、kernel 支持、服务期限
① 记录输入
模型:层数、维度、注意力头与 KV 头、专家数与 top-k、精度、共享权重、跨层状态。负载:prefill 长度、decode 上下文、就绪请求、路由分布、期限、到达过程。硬件:逐卡 HBM、各形状下有效算力与带宽、每方向路径、启动开销与共享瓶颈。
② 按瓶颈列方案
不是先选一个缩写。下表只用来缩小搜索范围,最终仍要比较完成时间。
③ 写数据归属与时间表
每卡存哪些层、头、专家、激活和 KV;峰值内存还要加通信缓冲、双缓冲、padding、在途 micro-batch。算子按依赖排到时间线上。MoE 代入最忙的专家组,不是平均值。
④ 排序,⑤ 测量修正
可行方案按同一目标排序;对排在前面的实测峰值内存、就绪与完成时刻、端口收发量和尾延迟,换上实测参数重排。差距小于波动就都保留。交付选定方案、被排除的方案、会让结论翻转的阈值。
| 当前约束或瓶颈 | 优先考虑 | 必须补算的代价 |
|---|---|---|
| 权重放不下,或小 batch 重复读权重太慢 | TP、PP;MoE 可用 EP | 归约、阶段串行、专家流量与工作区 |
| 独立请求多,完整模型已能容纳 | 更多 DP / 服务副本,较小 TP 组 | 排队、批内复用、每副本 KV 容量 |
| 特定区间的激活重复存储 | 同一 TP 组内启用 SP | 布局边界的收集与归约、kernel 支持 |
| 长上下文的 KV 与注意力占主导 | CP 与 TP 组合 | K/V 交换、统计量归约、因果负载不均 |
| 多层权重大,跨节点归约昂贵 | 节点内 TP + 跨节点 PP | micro-batch 是否够、最慢阶段与流水空档 |
| 专家集合大、路由热点突出 | EP、专家副本、专家分离 | dispatch / combine 双向流量、最忙卡与专家池队列 |
| 给定条件 | 约束内的选择 | 为什么 |
|---|---|---|
| 四会话、128K、130 ms 内至少 75% | 四个 TP2 实例 | TP1 放不下;TP2 全部约 119.1 ms 完成,每个按时会话约 0.238 GPU·s,低于 TP4 的 0.255 与 TP8 的 0.439 |
| 单会话、128K、50 ms | 一个 TP8 实例 | 约 41.2 ms;TP4 约 63.8 ms 已超期 |
| 两台 HGX H100 共 16 卡,单会话、128K、50 ms | 仍选一个 TP8 | 跨服务器 TP16 按实测 AllReduce 约 53.3 ms,超期;另一台跑其他实例 |
| 四会话、32K、130 ms 内至少 75% | 四个 TP2 实例 | TP1 放得下但八步要 173.3 ms;TP2 约 88.3 ms 全部完成,每个按时会话约 0.177 GPU·s |
这个八卡算例里:EP 不适用于稠密模型;SP 只改变一段激活的存储,在工作区固定的算例里没有额外收益;PP 不交错多个会话时,单会话仍要依次经过全部阶段,不是缩短单会话时间的首选。CP、跨会话流水、连续批处理可以进入扩展搜索,但要各自补上时间模型,不能套用 TP 的 1/p 缩放。第 4 章的固定权重架构(权重放 ROM)会减少 HBM 权重读取,让 TP 同步占比上升,减少 TP 卡数、多开实例更有吸引力。
6.7.4 综合算例:放大超节点,V4.1 Flash
256 张 H100,200K 上下文 decode,超节点取 8、64、128、256 卡,每个实例恰好占一个超节点。注意力按 DP 放置(每卡只处理自己会话的注意力与 KV),路由专家和 Engram 表按 EP 均分,每层一次 dispatch + 一次 combine,共 80 次 All-to-All。
Wcard = 9.5 GB + (288.8 GB + 203.1 GB) / S,Nsession = ⌊(C − Wcard − U) / K⌋,K = 180.7 MB (6-14)
图 6-53 · 超节点大小与每卡吞吐
服务目标:每 token 50 ms放大超节点换来的是容量和总吞吐,不是单个会话的速度:batch 为 1 时,8 卡和 256 卡都是 362 token/s。关键路径是本卡读一遍 8.2 GB 每卡各存一份的权重,再逐层读一个专家,共 2.76 ms。要缩短单会话时间,只能把注意力也做 TP。
图 6-54 / 6-55 · 权重离开 HBM 之后,通信成了最长的一项
200K 上下文 · batch 1| 机器 | 存储与计算 | 集合通信 | 单用户速度 | 通信占比 |
|---|---|---|---|---|
| 8 张 H100,权重在 HBM | 2,689 μs | 76 μs | 362 token/s | 3% |
| 58 张 B200 张量并行,权重在 HBM | 165 μs | 562 μs | 1,357 token/s | 76% |
| 两片 ROM 晶圆,权重在 ROM | 77 μs | 159 μs | 4,070 token/s | 65% |
Ttoken = max(Tweight, TKV, Tcompute) / 0.9 + Tcomm + Tfixed (6-15)
ROM 晶圆两行取自 OpenTallas 对 V4.1 Flash 的 roofline 分析(两片 N5 工艺 ROM 晶圆,等硅面积):尚无流片芯片,ROM 密度与读取带宽未经测量。0.9 是两片晶圆层数无法完全均分。图中“固定延迟”由书中单用户速度倒推(1/速度 − 前两项),仅为示意。
Engram 表放哪里
两个模块各一张 3.84 亿行的表,每行 256 个 FP8 值 + 8 B scale,共 203.1 GB;每 token 两模块各查 24 行,共 12.7 KB。查哪些行只取决于 token 序列,第 0 层计算前就能预取。
| 放置 | 占用 | 取回 48 行 |
|---|---|---|
| 主机内存,PCIe/RDMA 预取 | 不占 HBM | 往返 1.05 μs |
| 超节点各卡 HBM 分片 | 8 卡每卡 25.4 GB ≈ 140 会话;64 卡 3.2 GB ≈ 18 会话 | NVLink 一轮 0.83 μs |
| 掩模 ROM | 21,651 mm²,约半片晶圆 | 片内读取 |
机器越快,表越要靠近计算
H100 上可用于预取的时间是第一个 Transformer 块的 69 μs,两条取回路径都远短于它,只需看容量:DeepSeek 的部署就把表放主机内存,边算第一块边用 RDMA 预取。64 卡实例每卡每步 16,080 次随机读,按每秒 6100 万次只要 0.26 ms(步时间的 1.5%)。
ROM 晶圆上第一块只有 6.1 μs,一次主机往返就占去六分之一,步时间短于 42 μs 便掩盖不住。表移出 ROM 后一片晶圆就能装下 checkpoint,单用户速度反而升到 5,037 token/s。KV 放 SRAM:权重进 ROM 后剩余 SRAM 只够一个 200K 会话;KV 放 HBM,两片晶圆可同时驻留 9,637 个会话,总吞吐差三个数量级。
容易想错的地方
从“切哪一维”到“要多大的超节点”
一、切分产生交换
沿样本、位置、特征、层、专家切分,各卡持有的数据和依赖不同;DP、TP、SP、CP、PP、EP 就是这些切法的常见组织。切特征得部分和,必须相加;其余收集或交接即可。调度决定何时发起、何时汇合,算法和物理路径共同决定代价。
二、收益随规模递减
每卡计算和访存在减少,串行部分仍在,归约轮次和跨服务器等待继续消耗时间。批内复用、热点分布、在途事务和物理割集分别改变传输速度和最慢阶段。UB 算例:状态按端点相加还是按端点对相乘,决定缓存能装多少主机、建连要多久。
三、规模服务于任务
128K 续写任务里,单卡放不下一个会话,八卡单会话最快,四个两卡实例却能更早完成全部四个会话;故障、上下文长度和跨服务器路径又改变可选方案。超节点规模要提供足够容量、在期限内完成请求、降低单位请求成本。
方法始终是三步:按式 (6-1) 查容量,按式 (6-2) 逐项估时间,找出关键路径上最长的一项。权重、状态或服务需求继续扩大,单个超节点撑不住一个实例时,下一章加入网卡、数据中心交换网络、远程操作的完成通知与拥塞,继续计算扩大协作范围的收益和代价。
动手验证
实验 6-1 · 上下文长度与输入行数如何影响容量和执行瓶颈
(a) 求 Qwen3-235B-A22B 在 4096、8192、16384 上下文时的单请求 KV。(b) 按八卡分法、每卡预留 2 GiB,一台 HGX H100 最多同时保存多少个 32768 token 会话。(c) 对 1、64、8192 个 token,算一层专家计算的运算量与权重读取时间(64 token 的活跃专家数用式 6-8),判断受计算还是访存限制。(d) HBM 带宽减半,比较三种 token 数下的耗时增幅。(6.1 节的两个计算器可直接复算。)
实验 6-2〔核心〕· 张量切分与 micro-batch 流水如何改变执行时间
(a) 写出两卡 SwiGLU 的六个权重分片和两个输出部分和的形状,用式 (6-3) 说明为什么要相加。(b) 对 TP1/2/4/8 算 Qwen3-32B 一个 128K 会话的本地访存时间,求卡数每次翻倍省多少。(c) 代入 6.4 节的归约时间重算加速比,解释差距从哪来。(d) 画四阶段处理八个 micro-batch 的时序,分别取各阶段 1 ms 与 1、1、2、1 ms,指出积压在哪个阶段之前。(e) 进阶:比较输出完整张量与保留分片时相邻算子要传的数据。
实验 6-3〔核心〕· 专家分派与放置如何改变各卡负载和通信量
(a) 沿图 6-16 写出 token A 的发送、两次专家执行和加权合并顺序。(b) 复算 64 个 token 的两种分派的权重读取量和最重 EP 组的任务数。(c) 把八个热点专家均分到四组,比较总读取量与最重组计算量。(d) 按 TP2×EP4 表,求上下文 8192 与 16384 时每卡 KV,并推导三次汇合的发送量。(e) 进阶:为 DeepSeek V4-Flash、V4-Pro 或 Kimi K3 选一种存储格式,逐项放置路由专家、共享专家、注意力状态与工作区。
实验 6-4 · 数据量多大时环形归约比树形更快
(a) 按图 6-23 的规则跟踪块 1 的三轮归约,写出每轮由谁持有、已累加哪些卡的贡献(环形动画里块 1 一列就是答案的样子)。(b) 求四卡和八卡环形归约的每卡发送量,推导同数据量下树形耗时。(c) 求八卡两种算法耗时相等的数据量;α 减半后重算并解释。(d) 把树形归约 10 KiB 的时间代入 Qwen3-32B 算例,求八卡单步时间,比较换算法与带宽翻倍的收益。
实验 6-5 · 通信优化能节省多少,何时抵消准备开销
(a) 用图 6-27/6-28 的实测值,求 4 MiB 与 64 MiB 时同时运行比分开运行省多少,指出谁决定整体完成时间。(b) 调优额外花 S、此后每次省 Δ,写出回本所需最少调用次数;以 64 MiB 的重叠收益为 Δ,求 S = 1 s 时的次数。(c) 用两个二元向量比较先归约后 RMSNorm 与先 RMSNorm 后归约。(d) 选做:比较同一形状的独占与并发执行,记录就绪、开始、完成事件。
实验 6-6 · 通信拓扑与缓冲位置如何影响传输耗时
(a) 复算两台 HGX H100 上 TP16 的单步时间,求跨服务器 AllReduce 降到多少时 TP16 与 TP8 恰好相同。(b) 64 端口 NVSwitch 的 32/32 与 48/16 分配下,所有 GPU 链路同时向上发送时每条的平均可用带宽。(c) 根据图 6-31 累加第三轮经过同一有向链路的数据量,说明跳数与链路传输量的区别。(d) NUMA 例中先移动缓冲、再改环的次序,画出新增与消失的跨 CPU 访问。(e) 把 64 卡改为 8×8×8 环面,求最远跳数、均匀 All-to-All 每条有向链路负载,以及两级无阻塞交换网络需要多少颗 64 端口交换芯片。
实验 6-7 · 功率预算与整组扩容如何限制卡数
(a) 复算 64、72、96 卡的总功率,求预算增到 150 kW 时最多装多少卡。(b) 超过 64 卡后要为第二级交换设备预留一台服务器的 10.2 kW,求 120 kW 下最多多少卡。(c) 沿用 (b),只能按四台服务器(32 卡)整组增加,求上限并解释 (a)–(c) 为何不同。(d) 用单实例服务时间比较其中两种配置的服务能力。
实验 6-8 · 用通信需求解释超节点的互联结构
(a) 选 DGX-1、DGX-2 或 DGX A100,画出一个通信组经过的直连或交换层。(b) 复算 4³ 与 8³ 环面的芯片数和二分链路数,解释每芯片跨分区带宽为何下降。(c) 把 TP2×EP4 放到两台各四卡的主机上,标出跨主机的专家组归约。(d) 每台主机端点改为 64,求 256 KiB 缓存在逐对方式下能容纳几台主机;缓存扩到 1 MiB,判断 CloudMatrix384 的 192 台主机放不放得下。(e) 带外往返改为 50 μs,重算 N = M = 1024 的建连时间,说明谁对往返更敏感。(f) 选 UB 或 TPU 的一个设计,说明是安装、通信还是资源访问的需求促成了它。
实验 6-9 · 远端内存何时直接读,何时缓存到本地
(a) 复算四节点借用前后的物理占用、借用前其他节点的空闲,以及借用后全部节点的剩余。(b) 每事务 256 B,往返 7.52 μs 与 15.04 μs 时,达到 50 GB/s 需要的最少在途事务数。(c) 比较 128 与 4096 个在途事务时的单次读取时间,前一次完成才发下一次,求每秒最多完成几次完整读取。(d) 用本节远端与本地带宽,求重复读多少次时先取回更省,并说明所需本地容量。
实验 6-10〔核心〕· 按会话完成期限与成本选择并行配置
(a) 从式 (6-4)(6-5) 逐步求四种 TP 配置的八步续写时间和四个会话的完成时刻。(b) 期限取 100、130、170 ms,至少 75% 按时,找出满足的方案并比较成本。(c) 改用两台 HGX H100 的 TP16,跨服务器 AllReduce 取实测值,判断能否满足 50 ms。(d) 复算故障后的完成情况和成本;停顿从 40 ms 改为 10 ms,满足要求的方案怎么变。(e) 上下文改为 32K 并加入功率条件,说明容量、时间、功率各自先排除了哪种方案。(部署设计台可直接拖期限、改停顿。)
实验 6-11 · 超节点、ROM 与 SRAM 的综合算例
(a) 按式 (6-14) 复算各行会话数;服务目标改为每 token 20 ms,求各超节点大小下每卡能服务的会话数。(b) 实例内注意力改为 TP8,重算 batch 1 的单用户速度,与 362 token/s 比较。(c) 跨服务器每轮启动开销从 5 μs 改为 2 μs、每卡配两张网卡,判断跨服务器 64 卡实例能否追平超节点。(d) 片上每跳延迟减半,按式 (6-15) 重算 ROM 晶圆的单用户速度和通信占比。(e) 上下文改为 1M,重算 KV 放 SRAM 与放 HBM 时的会话数。(f) 主机内存一次往返改为 2 μs,求 H100 和 ROM 晶圆各在多快的单用户速度下 Engram 查表开始占用步时间。