2219 字
约 7 分钟
6
S23-J20 · 跨节点网络与远程访问路径

适用读者:要做多机训练/推理的通信预算、要解释"为什么加了服务器没变快"的人。
前置:S23-J19(集合通信与超节点)。
覆盖旧文:A-4340 §7.1–§7.3(从超节点走向集群 + 跨节点流量与物理路径 + 远程访问路径与并发,441 点)→ 441 点。
扩展点:E-S23-067(跨机诱因是容量不是算力:8B 训练状态 128 GB、284B 约 4.5 TB)、E-S23-068(割集带宽:50 → 400 GB/s 让 7.6 ms 变 1.3 ms)、E-S23-069(交错环把跨机流量放大 8 倍,时间不变)、E-S23-070(分层归约的门限:本地带宽 ≥ 网卡带宽;PCIe 反例 64 GB/s)。
上一篇:S23-J19 · 集合通信、超节点组织与内存池
下一篇:S23-J21 · 数据交接、拥塞与任务完成。


1. 一句话结论

跨机的瓶颈不是"总带宽",是"割集带宽"。 16 卡、192 MiB 梯度、3 ms 预算:连续环 30 轮每轮都要等一条 12 MiB 的跨机边(50 GB/s),7.6 ms 直接爆预算;分层归约把跨机压成 2 轮、8 张网卡并行(400 GB/s),1.3 ms。

出处:AI Infra 教材 §7.1–§7.3(id 4340),16 个 rank、NVLink 450 GB/s/方向、NIC 50 GB/s/方向、每轮启动 0.83 μs。

T_comm = Σ_r ( α + max_e V_{r,e}/B_e )
一轮之内:由最慢的那条边决定;轮与轮:依次相加

2. 为什么要跨机:容量先到墙(E-S23-067)

对象 占用 结论
8B 训练(Adam 混合精度,16 B/参数) 128 GB 单卡 80 GB 放不下;2 卡 160 GB 只剩 32 GB 给激活
284B 训练(同表示) 约 4.5 TB 必须分散到更多卡
DeepSeek V4-Pro(1.6T,0.5 B/参数) 约 800 GB 单台 640 GB(8×80)→ 至少 2 台
Kimi K3(2.8T,0.5 B/参数) 约 1.4 TB → 至少 3 台

判据:MoE 只减少"这次前向算多少",不减少"权重存多少"。 未选中的专家照样占显存——这是跨机需求最常被低估的一项。

2.1 本算例的网络参数(可直接替换成你自己的实测值)

16 个 rank(A: 0–7,B: 8–15)
机内:NVLink 900 GB/s 双向 = 每方向 450 GB/s
跨机:每卡一张 400 Gbit/s NIC = 50 GB/s/方向,独立 PCIe,不与其他卡共用
同号网卡接同一交换机 → 一条 rail
每轮启动 α = 0.83 μs(nccl-tests 实测:16 B–128 B 的 AllReduce 约 25 μs,除以 30 轮)
梯度张量:192 MiB;通信预算:3 ms(训练步 20 ms,梯度 17 ms 就绪)

判据:"跨超节点边界"本身不改变要传多少字节。 算法、放置、精度决定字节数;路径决定这些字节走哪个出口、等多久。只知道是 IB 还是 RoCE,推不出有效带宽、延迟、超售比和在途窗口。


3. 同一份梯度的三种走法(E-S23-068)

逻辑发送总量都是 5,760 MiB,区别只在"多少走网卡":

方案 跨机流量 跨机轮次 每轮谁在等 总时间
连续环(0-1-2-…-15) 720 MiB 30 一条 12 MiB 跨机边 7.6 ms
交错环(A/B 交替) 5,760 MiB(8×) 30 16 条边各走网卡 7.6 ms
分层归约 384 MiB(−47%) 2 8 张网卡并行各 12 MiB 1.3 ms

3.1 逐项算(分层归约)

本地 ReduceScatter + AllGather:14 轮 × 24 MiB / 450 GB/s = 0.78 ms
跨机交换:2 轮 × 12 MiB / 50 GB/s = 0.50 ms
启动:16 轮 × 0.83 μs ≈ 0.013 ms
合计 ≈ 1.30 ms

判据:交错环让所有网卡都忙起来,却把跨机流量放大 8 倍,时间一点没省。 时间是"最慢边的和",不是"总字节数"。

3.2 为什么分层能省 83%

项 连续环 分层归约
割集有效带宽 50 GB/s(一条 rail) 400 GB/s(8 张网卡并行)
跨机轮次 30 2
机内是否吃满 其余 14 条边 0.03 ms 就等 本地 14 轮用满 NVLink

4. 分层不是免费的:两个门限(E-S23-070)

令 336 MiB/B_L + 0.5 ms = 7.6 ms  →  B_L ≈ 50 GB/s

判据:只要本地互联不慢于一张网卡(50 GB/s),分层归约就更快。 NVLink 450 GB/s 远高于门限,所以"没有代价"。

4.2 PCIe 反例(4×A100 PCIe + 双端口 CX-7)

本地:PCIe Gen4 x16 点对点 32 GB/s/方向
网卡:两个 200 Gbit/s 端口各 25 GB/s,共用同一 x16 插槽 → 也是 32 GB/s
方案 时间
连续环(14 轮,每轮 32 GB/s) 11.0 ms
分层归约 15.7 ms ❌
门限:B_L ≈ 64 GB/s(约网卡插槽带宽的 2 倍)
四卡若每边都有 300 GB/s 的桥接,分层才降到约 7.3 ms(< 11.0 ms)

判据:共享接口是反例的根因。 分层把远端字节集中到 2 轮,全部挤同一个 32 GB/s 插槽;本地省下的读取又被更长的远端轮次抵消。


5. 远程访问路径与并发(§7.3)

一次跨机数据要依次经过:GPU 内存 → 加速器接口 → 网卡 → 交换网络 → 接收方内存。不同数据块可以在各段上重叠,形成流水;持续发送时,最慢的一段决定吞吐。

机制 作用 代价/边界
完成通知 接收方知道数据可用,才能开始算 需要事件/轮询,占控制路径
加速器直接发起通信(RDMA 类) 省掉 CPU 中转与额外拷贝 需注册内存、地址交换
内存语义(Load/Store vs Read/Write) 一侧用线程语义、一侧用消息语义 两套语义混用要显式同步
并发与吞吐模型 在途请求数 × 单请求字节决定有效带宽 并发不足 → 带宽用不满

判据:"网卡 50 GB/s"是上限,实际能到多少取决于在途数据量。 消息太小、并发太少,有效带宽会远低于线速——与 J14 的 α + V/R 是同一个道理,只是 α 变成跨机延迟。


6. 可复算(实测)

$ cd /root/博客运营官/blog-v2 && python3 tools/s23_book_calc.py | tail -7
跨机梯度 AllReduce(16 rank、192 MiB、α=0.83 μs)
  连续环: 30 轮 × 12 MiB/50 GB/s = 7.60 ms(预算 3 ms,超)
  交错环: 同 7.60 ms,跨机流量 5760 MiB(8×)
  分层归约: 14×24 MiB/450 + 2×12 MiB/50 + 16α = 1.30 ms
  跨机流量: 720 / 5760 / 384 MiB → 分层 -47%,时间 -83%
  门限 B_L ≥ 50 GB/s(NVLink 450 ✅)
  PCIe 反例: 连续环 11.0 ms vs 分层 15.7 ms(门限约 64 GB/s,需 2× 插槽带宽)

7. 前提与边界

结论 成立条件 不成立时
割集决定时间 每轮等最慢边、等轮同步 允许乱序重叠 → 更接近 max
分层省 83% 8 张网卡并行、本地带宽 ≥ 网卡 PCIe 共享插槽 → 反而更慢
交错环无收益 同一条 rail、无多轨调度 多轨全互联 → 另算
3 ms 预算 梯度 17 ms 就绪、步 20 ms 步更短 → 预算更紧

8. 常见误区

误区 纠正
"跨机就看网卡总带宽" 看割集:一条 rail 只有 50 GB/s
"所有网卡都用上就更快" 交错环 8× 流量、时间不变
"分层归约总是更优" PCIe 反例:15.7 vs 11.0 ms
"MoE 让模型变小了" 权重照存,只是少算
"知道 IB/RoCE 就能估时间" 还需超售比、在途窗口、故障恢复

9. 自测

  1. 8B 模型 Adam 混合精度训练,参数状态多少字节/参数、共多少 GB?
  2. 16 rank、192 MiB 梯度,连续环为什么是 30 轮?每轮跨机多久?
  3. 分层归约三项时间各是多少?合计?
  4. 为什么 PCIe 服务器上分层归约反而更慢?
答案
  1. 16 B/参数 → 128 GB。
  2. 2(n−1) = 30 轮;每轮 12 MiB / 50 GB/s = 0.25 ms。
  3. 0.78 + 0.50 + 0.013 ≈ 1.30 ms。
  4. 跨机 2 轮的流量全部挤同一个 32 GB/s 的 x16 插槽,本地省下的时间补不回来。

10. 下一篇

S23-J21 · 数据交接、拥塞与任务完成 —— 分片生成与缓冲区复用、事务层与传输层分离、请求槽位与背压,以及共享网络里的拥塞与尾延迟。

S23-J20 · 跨节点网络与远程访问路径
https://www.clxhxhhr.top/posts/5547/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。