从超节点走向集群
模型和总卡数都不变,只把一部分卡移到另一台服务器,原来走 NVLink 的部分和就可能改走 InfiniBand 或 RoCE。并行概念不用重学,要重算的是切分放在哪里、执行代价多大。
模型状态装不下一台机器,是跨服务器协作的直接原因;切分方式不同,要跨服务器交换的东西也不同。按层切要交接激活,层内切要汇合部分结果,多副本要汇合梯度。
存储需求:要几张卡、几台服务器
每卡 80 GB · 每台 8 卡 = 640 GB混合精度 Adam:参数、梯度、FP32 主权重、一阶矩、二阶矩合计 16 B/参数。推理不存梯度和优化器状态,但 MoE 未被选中的专家也要存放:路由减少的是计算量,不是权重。
流量与资源模型:串联取最小,割集定下界
一块数据从 HBM 出发,经加速器接口到网卡,再过交换网络写进对端内存。不同数据块可以在各段上同时传(流水线),持续发送时最慢的一段决定吞吐,各段带宽不能相加。
一张卡向另一台服务器持续发送
每方向 GB/sT𝒞 ≥ V𝒞 / B𝒞 (穿过割集 𝒞 的字节 ÷ 割集带宽;全双工两个方向分别算)
例 7.1 · 加卡何时被跨服务器通信卡住
每方向 360 MiB · 计算 20 ms强扩展:总任务固定,计算 20/x ms,跨服务器流量和路径不变。越过交点后,完全重叠的步时间就停在通信时间上;再想快,只能减少穿过割集的字节,或让更多网卡同时工作。弱扩展(任务随卡数增大)时,流量翻倍而出口不变,通信时间就翻倍。
Clos 网络:割集有多宽,从端口数算起
端口数与超售比
QM9700 · 每端口 50 GB/s两层 Clos:每台脊交换机 k 个端口各接一台叶,最多 k 台叶。无阻塞(d = u = k/2)时 k = 64 接 2048 个端点、96 台交换机,正是 DGX SuperPOD 2048 卡的 64 叶 + 32 脊;三层胖树最多 k³/4 = 65536 个端点、5120 台交换机,半分带宽 1638.4 TB/s。
超售的割集何时成为瓶颈
条件 f ≤ 1/r| 超节点卡数 | 每节点跨域发送 | 无阻塞出口 | 3:1 超售出口 | 跨域传输时间 |
|---|---|---|---|---|
| 8 | 127 GB | 400 GB/s | 133 GB/s | 0.318 → 0.953 s |
| 64 | 120 GB | 3.2 TB/s | 1.07 TB/s | 37.5 → 112.5 ms |
| 128 | 112 GB | 6.4 TB/s | 2.13 TB/s | 17.5 → 52.5 ms |
| 256 | 96 GB | 12.8 TB/s | 4.27 TB/s | 7.5 → 22.5 ms |
第 7.6.4 节 1024 卡作业:3:1 超售时出口只剩三分之一,跨域时间变三倍。同步组的服务器不在同一组叶交换机下,f = 1,这一阶段被拉长到 r 倍;放进同一组(rail 对齐),f = 0,上联一个字节都不承载。
统一互联:接口统一,物理路径不变
总线把设备接到处理器和内存,适合频繁细粒度协作;集群网络连接大量独立节点,还要处理故障。模型跨服务器后,同一项计算同时用到这两类机制:本地访存和远程传输表达的是相似的数据依赖,走的却是不同的提交与完成路径。UB 想为两者提供共同的寻址、访问和通信接口。
接口 ≠ 路径
一次远程读可以用一条指令发起,数据仍要过网卡 50 GB/s 的出口;异步写可以提前提交,接收方仍要等数据就绪。
本章的三层分析
先求必需的流量(7.2),再求用满带宽需要多少并发请求(7.3),最后分析应用要求的操作顺序(7.4)。
统一接口的三种收益
减少搬移、缩短发起路径、简化协作。代价是要额外保存哪些请求状态、做哪些处理。
跨节点流量与物理路径
算例选 Qwen3-8B 第一层 FFN gate 投影的梯度:[12288, 4096] × FP32 = 192 MiB。环形 AllReduce 先 ReduceScatter 再 AllGather,各 p−1 轮,每轮向下一个参与者发 M/p。16 个参与者各发 2(p−1)/p·M = 360 MiB,共 5760 MiB、30 轮。算法决定总发送量,参与者在服务器上的分布决定其中多少要跨服务器、经过哪些网卡。
Tcomm = Σ轮 r ( α + max资源 e Vr,e / Be ) 一轮之内由最慢的传输决定,各轮之间依次相加
例 7.2 · 哪种归约能在 3 ms 内完成
图 7-4 ~ 7-8网卡格子里的数字是该网卡每方向发送的 MiB;绿色为 NVLink 边,橙色为跨服务器边,播放时只有本轮在传的边会亮。连续环每轮的 14 条 NVLink 边约 0.03 ms 就传完,然后整轮等那一条跨服务器边(约 0.25 ms),另外 14 张网卡整轮闲着。分层归约把跨服务器传输压成两轮,每轮 8 张网卡同时各传 12 MiB,割集的有效带宽从 50 GB/s 变成 400 GB/s:跨服务器字节少了 47%,时间少了 83%。
分层什么时候不划算
对照配置 · 4×A100 PCIe每台 4 张 A100 PCIe,卡间 PCIe Gen4 点对点每方向 32 GB/s;一张双端口 ConnectX-7,两个 25 GB/s 端口共用 32 GB/s 的 PCIe 插槽。
在网归约 vs 环:服务器越多差距越大
SHARP对照配置的问题在共享接口:跨服务器阶段把 8 个参与者的分片集中到两轮,全部挤过同一个 32 GB/s 插槽;本地链路又不比插槽快,本地归约多花的时间补不回来。分层要合算,本地带宽要达到插槽的约两倍(64 GB/s)。在网归约的模型只计网卡发送与启动;交换机归约引擎的吞吐要另外给定,流量超过它时瓶颈就转到交换机。SHARP 论文在 128 台主机上测得 8 B AllReduce 从 6.01 μs 降到 2.83 μs:小消息省的主要是轮数带来的启动。
张量并行与流水线并行:一次交接要多久
Qwen3-8B 隐藏宽度 4096,一个 BF16 隐藏向量 8 KiB。prefill 8192 个 token 的同类张量 64 MiB,单请求 decode 只有 8 KiB。每次传送 Tmsg = α + M/B,α 取 5 μs。
启动主导还是带宽主导
交叉点 M = αB图 7-9 · 流水线并行:p 个阶段、m 个 micro-batch
Tpipe = (m + p − 1)τ,U = m/(m + p − 1)。左下和右上的灰色就是流水线启动和收尾时的空闲。低并发 decode 里下一个 token 依赖上一个,加服务器造不出新的独立 micro-batch,只有增加并发请求才行。所以 prefill 优先减少跨服务器字节,低并发 decode 优先减少每层通信的启动次数。
专家并行:目标随路由而变
1024 个 token,每个选 8 个专家,共 8192 次 dispatch;每份激活 8 KiB,一半跨服务器。dispatch 量 = n·k·f·d,加上 combine 返回,共 2nkfd。热门专家放到发送方服务器上,降的是 f;换数据类型或编码,降的是 d。
图 7-10 ~ 7-12 · 同样 32 MiB,接收端怎么分
接收载荷传输下界把目标分散到多张网卡,就消掉了单网卡瓶颈;但还要继续往前找共同经过的接口,对照配置的 32 MiB 必须全部先过同一个插槽。载荷矩阵 Vij:行和是发送量,列和是接收量,跨割集元素之和是割集量,各除以带宽取最大值。若逐份发送、原样返回,combine 矩阵就是 dispatch 的转置,dispatch 的热点接收方就是 combine 的热点发送方;dispatch 用 FP8、combine 用 BF16 时,返回载荷约为两倍。
多网卡:有网卡不等于用上了网卡
图 7-13 · 借用相邻 GPU 的空闲网卡(FuseLink)
1.125 GiB 载荷Beff = min(BD, 50 + min(NVLink, 100))。中继路径内部两段串联,取较慢者;直连与中继并联,相加。前提是消息够大:按 RoCE 可靠连接 δ ≈ 18.6 ns,网卡每秒约发 5400 万项请求,50 GB/s 链路上只有消息小于约 0.93 KB 时发起速率才先成为瓶颈。MoE dispatch 一条消息是一个 token 的隐藏向量(隐藏维 7168:FP8 约 7 KiB,BF16 约 14 KiB),远大于交叉点,按字节分配即可。对照配置把一份数据拆给两个端口,吞吐只升到插槽的 32 GB/s(14.1 → 11.0 ms),换四端口网卡也不再缩短。
多轨拓扑:配对是否对齐,决定字节走一跳还是过脊层
图 7-14 · 八条 rail 就是八条车道
每对每方向 24 MiBDGX SuperPOD 的多轨组网:每台服务器第 i 张网卡都接第 i 台叶交换机;同一组 32 台服务器内,同一 rail 一跳到达,跨 rail 要经脊交换机。错位后每张网卡的发送量不变、下界仍是 0.505 ms,变的是字节占用了脊层链路,要和其他作业共用,还要过第 7.5.3 节的多路径哈希。判断规则只有一条:两端 rank 的 i mod 8 相等就在一条 rail 内。交错环的边 i→i+8 对齐、i+8→i+1 不对齐,一半字节要过脊层。
远程访问的路径与并发
一次数据交接包含两件事:把分片写到对方能读的位置,以及让对方知道它已就绪。单边读写由发起方直接访问预先授权的远端内存,对端程序不参与搬移;双边消息要接收方预先提交接收请求。大块分片适合直接写,来自多个发送方的通知适合进消息队列。先写分片、再发短通知;合并成一次提交还能少发起一次。
小数据量优先减少提交开销,大数据量优先提高带宽。8 KiB 在 50 GB/s 上只传 0.16 μs,启动从 5 μs 降到 2 μs,总时间就从 5.2 降到 2.2 μs;64 MiB 本身要传 1.3 ms,省下的 3 μs 微不足道。
图 7-15 ~ 7-18 · 谁提交请求、数据走哪
实线 数据 · 虚线 控制RPC 的编码开销
base64 把 3 个二进制字节编码成 4 个字符,1 MiB 放进 JSON 约多三分之一。配套跨主机测量:请求从约 1.33 MiB 降到 1.00 MiB,客户端 CPU 处理时间中位数从约 9.8 ms 降到 1.1 ms;但 20 对正式调用只有 11 对整体变快,网络与转发等待波动更大。减少编码省的是本地 CPU,缩短整个调用还要减少网络、转发和远端执行中的等待。
一次 64 B 远程读取,时间花在哪
把关键路径拆成阶段,每段给定延迟后相加:片上总线穿越 30 ns;PCIe 门铃写 150、DMA 读 500、DMA 写 250 ns;线路单程 L = 100 ns;内存行命中 30 ns;网卡流水线按 322 MHz 时钟,外设网卡 9 周期、UB 异步 25 周期、Load 8 周期。
表 · 图 7-19 / 7-20 · 三条路径逐阶段相加
外设网卡多出来的阶段来自三个结构性原因:请求要先写成主机内存里的描述符再由网卡读取;网卡和处理器各有地址空间(门铃、描述符 DMA、目标端 DMA);完成后要跨地址空间通知处理器(响应 DMA、完成记录 DMA、两次轮询)。控制器接到片上总线后,第二类合并成一次总线穿越;改用 Load,处理器的依赖跟踪取代完成通知,第一、三类也消失。第四条路径(网卡内处理器构造描述符)只按表推导:省掉门铃和描述符 DMA 共 650 ns,约 1572 ns。OpenURMA 两节点周期级仿真测得 2236、757、500 ns,与推导差 14、11、81 ns,来自仿真器模块间的固定开销。
| 比较项 | Load / Store | 异步 Read / Write |
|---|---|---|
| 发起与路径 | 处理器指令,经地址映射到可达内存;UB 可由片上控制器承接 | 提交地址、长度等请求;经队列、门铃或设备发起接口推进 |
| 依赖与完成 | 硬件跟踪 Load 的消费者;Store 的远端可见性另需顺序保证 | 运行时等待规定的完成事件,再用结果或回收缓冲 |
| 适用 | 细粒度读取、指针访问、频繁且要低提交开销 | 激活、KV、权重等批量搬移与显式流水 |
| 并发限制 | 指令依赖、未完成访存槽位、地址转换 | 请求队列、完成队列、注册内存、提交能力 |
| 故障处理 | 依赖平台的超时、异常与内存故障机制 | 可按请求报错;仍要处理超时、部分写入和缓冲回收 |
两种接口都可以用内存语义,但不能凭名字推断缓存一致:OpenURMA 的 Load/Store 路径不维护跨节点缓存一致,写入、发布、读取的依赖由应用安排。省掉的 PCIe 往返来自控制器位置和请求路径的改变,把软件接口改名叫 Load 得不到同样的收益。
并发:8 次读取,地址互不依赖吗
按需远程读,还是先搬回本地
144 MiB 不变 KV 快照远程读取与搬回都经本章网卡(50 GB/s,391 个 256 B 事务在途);本地读按 H100 HBM 3350 GB/s。一次远程读约 3.025 ms,一次搬回约 3.075 ms,之后每次本地读约 0.046 ms。只访问 10% 时,URPC 这类按引用传递的调用让被调用方只取需要的数据,搬回要到第 11 次读才划算。
并发与吞吐模型:需要多少在途请求
请求槽位记录一项未完成请求的地址、长度和状态:提交时分配,完成状态处理完才释放。每次 256 B,从发起到释放 2 μs;50 GB/s 链路在 2 μs 里能传 100,000 B,相当于 390.6 次访问,所以至少要 391 个在途事务。
N ≥ ⌈B·T / m⌉ Beff ≤ min( Bpath, N·m/T, m/δ )
例 7.3 · 槽位不足、启动太慢,都用不满出口
图 7-25 / 7-26δ 的一个来源:OpenURMA 发送流水线最慢一级每 2 个时钟周期接一项请求,322 MHz 下 δ ≈ 6.2 ns(约 1.61 亿项/s);同一工具链的 RoCE 可靠连接因序号分配有先后依赖,每项 6 周期,δ ≈ 18.6 ns。仿真 256 项突发测得每微秒 150 项和 54 项。每项 64 B 时 m/δ 只有 10.3 与 3.4 GB/s,4 KiB 时 660 与 220 GB/s。小载荷瓶颈在请求速率,大载荷才在线路。
图 7-27 · PCIe 写与读受不同限制
写是 posted 事务,带着地址和数据发出即完成;读是 non-posted,请求带标签发出,靠完成报文带回数据。在途读的数量受接收方发放的信用和发起方的标签数限制。
图 7-28 · KV-Direct 实测:读卡在标签上
PCIe Gen3 x8 · 64 B 随机 DMA 读理论 7.87 GB/s;每次 64 B 读写带 26 B 报文头与填充,上限 5.6 GB/s(8700 万次/s)。往返 1050 ns,用满链路要 92 个读在途,但主机信用只有 84 个、FPGA DMA 引擎只有 64 个标签:64/1050 ns ≈ 6100 万次/s,实测 6000 万次,差约 1.6%。写不占标签,实测接近报文开销上限。
同一条 PCIe 链路被两类流量共用时争用不对称:进入 GPU 的方向,网卡 posted 写远端数据按协议持续推进,复制引擎的 H2D 读在标签用完后就发不出新请求,分到的带宽远小于一半;离开 GPU 的方向,两路都要先从 HBM 取数,瓶颈在 GPU 内部,退化更接近。判断时先分清每一路是 posted 写还是带完成的读,再看在哪个共用部件汇合。
数据交接、顺序与状态管理
像把装有材料的托盘交给下一道工序:托盘送到了,对方还要时间处理,用完之前不能往托盘里放下一批。发送完成、对接收方可见、接收方用完,是三个要分别判断的事件。
网络传输完成,不能代替“用完了”的通知。源缓冲看接口的完成语义能否复用;目的缓冲要等消费者用完才能覆盖。
图 7-30 · 下一次写入什么时候能覆盖目的缓冲
发送 5 μs 完成,消费者 8 μs 开始读、12 μs 读完。网络传的每个字节都对,接收程序却可能用错数据。把“必须等哪个事件”画成边 u→v,就是依赖图:缺了“可见→通知”的边会读到未发布的数据,多出“无关传输也要等”的边会增加等待。通信库另设已注册缓冲区,计算结果就要先复制、打包,占用 SM 时间;让计算直接写进注册缓冲区省掉这一步,但事件顺序随之变严。
Jetty 与共享传输状态
应用端点是程序提交通信、接收完成通知的身份;传输状态保存序号、确认、重传与速率。前者标识应用,后者保证可靠传输。一个进程多个线程、每个线程访问多个远端时,关系数按乘积增长。
Sprivate = Le + LP(r + t) Sshared = Le + LPr + Pt S(K) = Le + LPr + KPt
图 7-32 · 64 个端点访问 128 个目标
e 256 B · r 64 B · t 1 KiB共享省掉的是 LPt 变成 Pt,应用关系的 LPr 仍在。UB 把 Jetty 与传输通道分开就是这种设计。共享节省了存储,也会争用同一条通道的发送窗口、调度和恢复资源;共享先进先出队列里,丢包和长请求会造成队头阻塞。为关键业务单独分配传输状态,其余共享,在容量内换隔离。
图 7-33 / 7-34 · 实现中的记录尺寸:逐对连接 vs 端点加通道
Jetty 20 B · 段 32 B · 通道 56 B · QP 512 BSpair = 512NM + 32N,SUB = 52N + 56M(关系绑定放在软件映射里,r = 0)。溢出后每次操作都要重新读上下文:PCIe 外设网卡两端各一次 DMA 读,约 +1000 ns;片上总线控制器两端各一次总线穿越加内存访问,约 +200 ns。训练中的全交换常涉及几十到几千个端点,正好落在这一区间。
操作依赖与故障隔离
例 7.4 · 去掉多余的顺序约束
A 写数据 D,B 发布“D 已就绪”,C 传另一块无关数据。必须保持 A→B,C 可以走独立通路。A 写入 20 μs,随后恢复,恢复结束 D 才可见;B 2 μs。
去掉多余依赖,恢复造成的停顿就只留在真正需要这份数据的链上。对等着 C 的下游,这比全组提前 10 μs 重要得多。程序依赖和资源依赖要画在同一张图里:共用处理单元时,资源本身又加回了那条顺序边。OpenURMA 实现:任何顺序模式下提交到首报文出线都是 24 周期;明确要求等前序时最多等 50 周期(约 155 ns);一个发起方被停住,其他四个发起方的 8 个无序请求仍在 78 周期(约 242 ns)内全部发出。RoCE 同一 QP 内严格按序,一个等,后面全等。
图 7-37 · 按序返回,不等于读到了新值
D 在 2 μs 更新 · 标志 3 μs 可见把结果返回时刻(空心点)往后挪,并不会挪动实际取值时刻(实心点)。顺序要求必须落到读取数据的时刻:要么观察到标志后再读,要么提前读、检查冲突、必要时重读。1Pipe 研究过由网络提供全局全序;处理故障时,顺序保证还要和交付、恢复分开解决。
请求槽位的释放与背压
图 7-38 / 7-39 · 传完了,槽位却还没还
16 次操作,每次 8 KiB;最快每 1 μs 提交一次,提交后 5 μs 传完;软件每 20 μs 处理一批完成通知,处理完才释放槽位。
槽位加倍只能吸收短时突发;持续吞吐由完成通知的处理速度决定。处理速度不够时上游就要被约束,这就是背压:槽位用满就暂停提交。缓冲区要等远端用完才能释放时,背压会跨设备传播。故障后也要先停新提交、等待或隔离旧的在途访问,再释放空间,否则迟到的旧写入会覆盖新对象;新版本号、撤销访问权、隔离失联端点都是为此。
共享网络中的拥塞与可靠性
再加一项两台服务器的训练作业,两项作业的服务器各自分属不同组,同一 rail 上的跨服务器流量要经叶交换机上联走脊层,并被哈希到同一条 50 GB/s 上联。分层归约的跨服务器阶段让每张网卡以 50 GB/s 发送,高峰一重叠就超过这条链路。
平均利用率低,挡不住高峰重叠。队列保存的是到达与发出的差额,相位和反馈决定这个差额积累多久。
例 7.5 · 平均只用 40%,为什么还排队
每 100 ms 各有 20 ms 高峰、50 GB/s,平均总需求 20 GB/s。完全重叠时 20 ms 内积压 (100−50)×20 ms = 1 GB,高峰结束后还要 20 ms 排空;推迟 20 ms,任何时刻只有 50 GB/s 到达,队列一直为空。若只给突发留 512 KiB 缓冲,允许的重叠只有约 10.5 μs。CASSINI 利用训练通信的周期性安排放置和通信时刻,并持续监测漂移;配套实验对两个 CPU DDP 作业做一次性错峰(推迟 50 ms),相位在运行中继续漂移,三轮整组完成时间反而多了约 2%–3%。
反馈延迟与缓冲容量
dQ/dt = λ(t) − B 不溢出要求 Tf ≤ Qfree / (λ − B)
图 7-42 / 7-43 · 反馈到之前,缓冲先被填满
到达 100 GB/s,出口 50 GB/s,缓冲初始已占一半。反馈生效时刻决定满载持续多久,降速幅度决定下降段多陡;只降到 50 GB/s 时队列不再增长,但也不会排空。ECN 由交换机在报文上打标记把队列信息带回发送方;DCQCN 据此调节 RDMA 发送速率;基于时延的方法从往返时间变化观察排队;UB 的 C-AQM 让端点和交换网络协同,在溢出前就让发送方减速。理解它们,先看缩短了哪段反馈路径、发送方收到后改变了什么。
图 7-44 · incast:N−1 个发送方同时打一个出口
每发送方 50 GB/s → 出口 50 GB/s直接 ReduceScatter 若所有参与者按同一顺序逐个目标发送,轮到持有者 j 时另外 N−1 个都在向它发;按 rank 错开顺序,每个目标任一时刻只收一条流。PFC(IEEE 802.1Qbb)按优先级暂停相邻一跳:线缆往返传播(5 ns/m)加一个 1500 B 报文串行化,30 m 时共 0.33 μs,这段时间涌入的超额数据要靠预留的 headroom 接住(DCQCN 论文按 1500 B MTU 给出每端口每优先级 22.4 KB)。端到端反馈要一个往返,这期间涌入的数据放不进缓冲。分工:PFC 在一跳内挡住溢出,DCQCN 把源头降到出口能承受的速率。PFC 的代价是暂停会沿上游逐跳传播,成环就是死锁。
多路径与重传
四个 token 的 BF16 隐藏向量共 32 KiB,拆成 8 个 4 KiB 报文轮转到两条 50 GB/s 路径。每个报文串行发送约 82 ns。交付要按序,先到的报文要等前面的缺口补齐。
图 7-45 ~ 7-47 · 到达时刻与按序交付
圆点 到达 · 横线 等缺口双路径省下的只是约 0.33 μs 的串行发送;第二条路径多出的传播时延一旦超过它,均分就不再划算,这个余量只有 30 m 线缆传播时延(约 150 ns)的两倍多。只有每条路径分到的串行时间远大于路径时延差,多路径才有收益。丢包时只补发缺失的 4 KiB(选择性重传),否则要从缺失处重发 32 KiB(回退 N 步)。何时判定丢包也是取舍:等太久,真丢包后停顿长;慢路径报文还没到就重发,又增加重复流量。
表 · 图 7-48 · ECMP 哈希冲突
ECMP 按报文头哈希选上联,同一条流的报文都走同一条路,不乱序,但两条流可能落到同一条上联、各得一半带宽,整组要等最慢的流。期望与 p99 按精确分布计算(与书中表格一致),上方柱子是一次随机抽样。流数接近上联数时代价最大(32 流 32 上联只剩 28.3%)。避开它:用 rail 对齐减少同一台叶上的跨组流,或改用逐包喷洒。
逐包喷洒:8 MiB prefill 激活拆到 8 条路径
2048 个 4 KiB 报文每条路径承担 1 MiB、串行 20.97 μs,再加最慢路径时延;单路径要 167.8 + 1 μs。最慢路径时延小于 147.8 μs 喷洒就更快,代价是接收方要缓存先到的报文。超以太网(Ultra Ethernet)把这两件事写进传输层:报文按熵值喷洒到多条路径(典型 64 到 256 个熵值),拥塞时少往那条路上放;丢包按选择性确认只补发缺失的报文。
死锁
图 7-49 / 7-50 · 资源依赖成环
从通信改进到任务完成
一张卡很早进入集合通信调用,另一张卡的梯度还没算出来,前者就在调用里等后者。这段等待记在通信调用的耗时里,根源却在前面的计算或数据准备。
任务时间线要从数据生成时刻画起。交换的开始时刻等于所有参与者就绪时刻的最大值。
图 7-51 ~ 7-53 · 就绪偏差
MegaScale 发现网络带宽稳定,但各参与者开始通信的时间差越来越大,根源是前向计算期间的主机操作。配套 Gloo 四进程实验:4 KiB 输入,一个参与者晚到约 25.1 ms,全组完成中位数从约 1.6 ms 涨到 26.6 ms,最后一个到达后的尾段仍约 1.6 ms。把梯度分桶,每桶算完即开始归约,上一桶传输时下一桶还在计算。
例 7.6 · 归约算法、执行顺序、链路带宽,先优化哪个
192 MiB · 计算 20 ms · 更新 2 ms通信从 7.6 降到 1.3 ms(−83%),串行整步只从 29.6 降到 23.3 ms(−21%):S = (Tc + Tn) / (Tc + Tn/s)。改进顺序:先用分层减少跨服务器字节、让每张网卡都有分片;再靠足够的并发提交用满带宽;到了带宽上限,找能提早开始的通信;通信被计算完全盖住后,就该优化计算或更新了。
训练与推理的通信瓶颈不同
图 7-60 · 8 人环一次归约:T = 14α + 1.75M/B
原配置 α 5 μs · B 50 GB/s数据量小的一段接近水平(启动主导),大的一段随载荷上升(传输主导)。提带宽主要放缓右侧斜坡,缩短启动主要让左侧平台下移。训练和大 batch prefill 从减字节、加带宽、重叠中获益;低并发 decode 更需要减少层内跨服务器同步、缩短发起与完成路径。
平均与 p99:偶发长等待决定尾部
100 次通信98 次正常;1 次晚就绪多等 2 ms;恢复事件每次多等 10 ms。p99 取排序后第 99 项。
推理状态迁移:同一份流量分析
128K 上下文 · 200 Gbit/s = 25 GB/sDeepSeek 会话迁移到不持有其全局 KV 的实例:V4-Flash 的 439.281 MiB 需约 18.425 ms,V4.1 的 111.250 MiB 需约 4.666 ms,状态压缩在传输环节省约 13.759 ms。恢复时间 = 排队 + 缓存查询 + 传输 + 局部 SWA 状态重建,传输缩短多少,总时间就缩短多少。
固定 1024 卡:超节点变大后如何重新选择
Qwen3-32B 形状(64 层,隐藏维 5120,P = 32×10⁹),1024 张 H100 按 TP8 × DP128 组织,每步 2²⁰ 个 token,每个 DP 副本一个 8192-token micro-batch。训练状态 16 B/参数,每卡 64 GB。梯度按 BF16 传,每卡分片 G = 2P/8 = 8 GB。超节点 S 张卡:H = 1024/S 个超节点,每节点同一 TP 坐标上 q = S/8 个 DP 成员;同一行 8 卡是一个模型副本,同一列先在节点内归约、再跨节点交换。
Tgrad = 2(q−1)α + 2(q−1)G/(qBL) + 2(H−1)α + max( 2(H−1)G/(HqBNIC), Vout/Bout ) Vout = 2(H−1)/H · 8G
Tstep = 0.485(计算)+ TTP + Tgrad + 0.050(更新) Θ = 2²⁰ / Tstep
表 · 图 7-62 · 扩展台
每卡 405.7 TFLOP/s(BF16 峰值 × 41% MFU)每点在分层归约与不分层的连续 DP 环之间取较快者(出口固定 400 GB/s 时 64 卡分层要 331.1 ms,反而比连续环 317.7 ms 慢)。8 → 64 卡吞吐 +36%:8 卡时每卡要把整份 8 GB 分片经网卡同步,0.318 s 占步时间三分之一;64 卡先在 NVLink 上归约成八分之一,梯度同步降到约 69 ms。128 → 256 只 +1.3%,计算与 TP 通信已占 86%。本地带宽 450 → 900 带来的收益属于内部带宽,不能算在节点大小头上。故障开销 ε ≈ C/I + λ(I/2 + R),C = 10 s;中断率取 Meta 统计(1024 卡作业平均 7.9 小时中断一次);R = 60 s + 受影响超节点每卡 64 GB 经一条 PCIe Gen5 x16(64 GB/s)读回。
并行度要重新比较,但不必填满高速域
128 卡超节点、出口扩展时枚举 TP8 / 16 / 32 / 64(DP 128 / 64 / 32 / 16):步时间约 0.672 / 0.753 / 0.942 / 1.333 s,TP8 仍最好,TP 组越大每副本要交换的激活越多。1024 张卡一起训练一个模型,不等于每一层都切到 1024 张卡上。
部署:先算路径,再比协议
InfiniBand、RoCE、UB 各自提供具体机制,比较时先用本章三个模型:GPU 到网卡的连接、共享接口和拓扑决定可用带宽;请求提交与完成处理决定实际吞吐;同步与恢复机制决定执行顺序。端口用途也要先定:昇腾 950 的 UBoE 与 UB Link 按预先配置共用 SerDes。公开记录:16 GiB AllReduce,两台八卡 H100 约 68.7 ms,四台约 91.0 ms。
四个容易算错的地方
三种方案都发 5760 MiB,跨服务器部分却是 720、5760、384 MiB,用到的网卡是 1、8、8 张。时间取决于数据经过哪些资源。
两项周期作业平均只要 20 GB/s,高峰重叠时到 100 GB/s,在 50 GB/s 出口积压 1 GB。
更新之前读到的旧值,不会因为延后返回变成新值。依赖必须约束实际读取的时刻,提前读就要检查并重读。
通信 7.6 → 1.3 ms,串行步只从 29.6 → 23.3 ms;数据提前就绪又把分层降到 22.0 ms。同一优化在不同执行顺序下省的时间不同。
跟着一份数据走:经过哪里、等什么、留多久
一、先算路径
沿算法求数据必须交给谁,沿拓扑找它经过哪些资源。本地先归约,跨服务器字节 720 → 384 MiB,并让 8 张网卡同时工作。超售比定割集宽度,rail 对齐定一跳还是过脊层,哈希冲突与 incast 定有效带宽和缓冲,在网归约把跨服务器阶段压成一轮。
二、再算并发与状态
带宽—时延积决定要多少在途字节,事务大小和启动间隔决定每秒能提交多少,完成通知的处理速度决定槽位多久复用。控制器在 PCIe 后还是片上总线上,决定每次访问的固定开销;连接状态按端点相加还是按端点对相乘,决定能否留在片上缓存。
三、最后画依赖图
把准备、传输、使用、恢复的先后画成依赖图。减少传输量和请求处理工作、提早开始独立操作、缩短关键路径,是网络优化变成任务收益的三种方式。1024 卡里 8 → 64 卡超节点让梯度同步从三分之一降到一成左右,再往上收益迅速变小。
一个作业用上全部的卡,不等于每种通信都要覆盖全部的卡。下一章用这些执行与互联能力搭建单实例推理服务,第 9 章组织跨实例的数据交接。
动手验证
实验 7-1 · 八卡服务器之间的模型切分
算 V4-Pro 与 Kimi K3 的最低服务器数,再加每卡 8 GB 的 KV 与工作区。画出机内 TP/EP + 机间 PP,与跨服务器 TP 两种分工,标出一次 prefill 与一次 decode 要跨服务器交接的位置。(7.1 的容量估算可以直接改参数。)
实验 7-2 · 通信量与出口带宽如何限制扩容
沿用例 7.1,分别把每方向流量减半、让两张网卡同时工作,画串行与完全重叠两条曲线,求交点倍数。再让流量随倍数线性增长,求完全重叠时步时间最短的倍数。(例 7.1 卡片可以直接拖。)
实验 7-3 · 端口数与超售比如何决定割集
端口改 128,求无阻塞两层与三层 Clos 的端点数、交换机数和半分带宽。保持 64 端口、超售 2:1,求 1024 卡分区的割集带宽与每卡份额,以及 128 卡超节点的跨域时间。最后求 3:1 时每张网卡需要多大比例的字节留在本叶内。
实验 7-4 · 在网归约何时值得
梯度改 BF16(每参与者 96 MiB),重算两台与八台服务器的环与在网归约跨服务器时间。设交换机归约引擎每方向 200 GB/s,八条 rail 同时归约时它是否成瓶颈,求让在网归约仍快于环的最小引擎吞吐;再按 8 KiB 输入比较 36 层、每层两次归约的总启动时间。
实验 7-5〔核心〕· 本地带宽与共享出口如何影响算法选择
完整复算例 7.2,再用对照配置重算连续环和分层归约。把本地带宽从 32 提到 300 GB/s(四卡每条边都有),解释为什么选择会翻转而本章配置不会。端口数从 1 增到 2、3,插槽不变,画归约时间随端口数的曲线。
实验 7-6 · rail 对齐与脊层流量
配对改为 rank i 与 ((i+4) mod 8)+8,求经过脊层的字节。再让服务器 B 的网卡 3 故障,rank 11 的流量经 NVLink 各借一半给网卡 2 和 4,求各 rail 的字节与跨服务器阶段时间。最后在 128 卡超节点里改用 TP16(一组跨两台服务器),说明各 rail 承载哪些坐标、负载是否仍均匀。
实验 7-7 · 去掉编码转换能缩短多少远程调用
从配套记录取同一载荷的成对调用,画客户端编码、发送、等待、解码和服务端执行的时间线;解释为什么服务端执行已包含在客户端等待中;计算省去 base64 后少传的字节,分析编码占比如何影响整体加速。
实验 7-8 · 用满远程读取带宽要多少在途事务
槽位占用从 2 μs 改 4 μs,求 256 B 与 4 KiB 事务所需的在途数。固定 δ = 18.6 ns,求达到 50 GB/s 的最小事务大小;换成 6.2 ns 重算。最后把独立地址改成指针链,说明总时间如何随链长增长。(例 7.3 卡片可直接调。)
实验 7-9 · 共享传输状态能支持多少隔离组
64 个端点只访问 1 个目标,求独占与共享所需存储;目标改 128 个、存储 2 MiB,求最多几个完整隔离组。比较增加端点与增加目标的影响。最后用实现尺寸(Jetty 20 B、通道 56 B、QP 512 B)求 1 MiB 片上缓存时两种组织各自的溢出端点数。
实验 7-10〔核心〕· 放宽顺序如何减少等待并保持正确
例 7.4 中 C 改为 50 μs,求两种安排的整组与 C 的完成时间。消费者收到通知后要 30 μs 处理,标出目的缓冲最早可写新数据的时刻。对旧值反例画出“等待后读取”和“提前读后重读”两条路径。
实验 7-11 · 缓冲大小与降速幅度如何影响积压消退
到达 100、出口 50 GB/s、初始积压 256 KiB,求总缓冲 512 KiB 与 1 MiB 时可容忍的反馈时延。反馈在缓冲刚满时生效,降速到 50、45、40 GB/s 时各需多久清空,解释哪个条件无法排空。
实验 7-12 · incast 的缓冲与反馈距离
出口改为 100 GB/s(两张网卡),每发送方仍 50 GB/s,重算 N = 8、16、64 的允许反馈时延与 PFC headroom。线缆改 100 m,求一跳反馈距离及 N = 64 时 headroom 是否仍在 1 MiB 内。最后求往返 5 μs 时只靠端到端反馈不丢包的最大 N。
实验 7-13 · 路径时延差与重传如何推迟按序交付
让路径 2 时延在 1–9 μs 间变化,求均分与只用路径 1 完成时间相等的点。两条路径分别承担 5 个和 3 个报文,时延 1 与 9 μs 时求完成时间。首包丢失、恢复等待从 20 增到 40 μs,求首次能按序交付的时刻和此前要缓存的数据量。
实验 7-14 · 哈希冲突与喷洒的边界
求 16 条流分到 32 条上联的期望最大负载与相对速度,与同为 n/m = 1/2 的 8 流 16 上联比较。喷洒路径时延改 1–30 μs 均匀间隔,求完成时刻与峰值乱序缓存,再求让喷洒不再快于单路径的最慢时延。最后报文改 1 KiB,说明峰值乱序缓存的报文数与字节数如何变化。
实验 7-15〔核心〕· 通信优化能缩短多少训练与推理时间
复算 1024 卡算例,逐项改超节点大小、出口上限、本地带宽,记录哪种算法和 TP 候选更好;恢复通道带宽减半再比有效进度。复算例 7.6 的六种时间线,求分层通信恰好被 20 ms 计算盖住的最晚就绪时刻。再换成 36 层、每层两次 8 KiB 归约,比较带宽 ×3 与启动降到 2 μs,解释两类负载的改进顺序为何不同。