多机推理先认清拓扑:环上 rank 顺序就是物理顺序,加机器不加带宽

排障 · 约 6 个命令 / 10 分钟自查L0整理于 2026-11-03 有效期 180d

四台机器之间是环还是交换机,决定了多机推理能不能起来、值不值。实测一根 4 节点环:200G 网卡四条边平均只跑 102.8 Gbps(达成率 51.4%),单条 TCP 更是只有 40 Gbps;4 机 all-reduce 是 2 机的 1.004 倍——加机器买到的只有显存。rank 按自然序排会直接起不来(报 ibv_modify_qp 110 超时),rendezvous 写数据面地址会卡 181 秒。三步自查能在上机前把这三件事全部排掉。

多机推理环拓扑NCCLall-reducerankrendezvousRoCE200G集群拓扑DGX Spark分布式选型

这条适用于

版本指纹

NCCL 走 RoCE,NCCL_SWITCHLESS_RING_ONLY=1 / NCCL_ALGO=Ring / MIN-MAX_NCHANNELS=4;网卡 200G ×2 直连/台

具体做法

【实测条件】四台同型号统一内存机器,每台 4 个 200G 网口(其中 2 个配了地址、2 个有链路无地址),两条 200G 直连对端。2026-11-03 凌晨采集,逐台取 ip route / ip route get / ping / ibv_devinfo / 网卡速率。

【逐边实测】四条边的 8 流读数逐条列出(括号内为对 200G 标称的达成率):Spark #1→#2 105.2 Gbps(52.6%)、#2→#4 95.6(47.8%)、#4→#3 99.9(50.0%)、#3→#1 110.7(55.4%)。最高与最低只差 15.8%,四条边整整齐齐都在一半上下 —— 单台机器坏或单根线劣质不会呈现这种分布。

【拓扑结论】四台之间是一根环,没有交换机。每条边独立打流(8 条 TCP 并发):105.2 / 95.6 / 99.9 / 110.7 Gbps,均值 102.8 = 200G 标称的 51.4%。四条边离散度很小,这是链路层统一天花板,不是个体故障。对角两台之间在高速网上无通路:路由落到管理网关,ping 100% 丢包。

【单流与多流】同一条边:1 条 TCP 40.0 Gbps(只有两成)、4 条 102.3(2.56 倍)、8 条 110.9(2.77 倍,饱和)。所以多通道不是优化项,是必需品。

【all-reduce 阶梯】同配置走 RoCE,四档消息 × 两种世界大小全部跑过:1MB 档 2 机 72.9 / 4 机 73.4 Gbps;8MB 档 103.6 / 105.9;64MB 档 109.6 / 110.4;256MB 档 110.9 / 111.3。四档的 4机÷2机 分别是 1.007、1.022、1.007、1.004 —— ,这就是环与交换机的本质差别。

【all-reduce 倍数】同一份 NCCL all-reduce,同配置走 RoCE:256MB 大消息 2 机 110.9 Gbps、4 机 111.3 Gbps,比值 1.004。环上每跳串行,加机器只是让串行链条更长 —— 聚合带宽不涨,涨的只有显存。

【小消息三档】4KB 31.5 μs、10KB 36.4 μs、20KB 41.1 μs、40KB 43.6 μs(4 机 bf16)。从 4KB 到 40KB 消息涨 10 倍、延迟只涨 38%,说明这一区间主要成本是固定开销而非搬运时间。

【小消息】4KB 单次 31.5 μs、10KB 36.4 μs(4 机 bf16)。10KB 正好是每层 all-reduce 的体量,40 层 × 36.4 μs = 1.456 ms/token,占实测 17.76 ms/token 的 8.2% —— 这个占比是算得不是量得。
【两个必踩的坑】
① rank 按自然序(第 3 台=2、第 4 台=3)启动失败:ibv_modify_qp failed with 110 Connection timed out,报错里的 local GID 是第 3 台的数据面地址、remote GID 是第 4 台的另一个网段地址 —— NCCL 试图跨越环的对角线。改成物理环序(第 4 台=2、第 3 台=3)一次通过,111.3 Gbps。
② rendezvous 写数据面地址:卡满 181 秒后报 Timed out waiting for clients, 3/4 clients joined。必须用管理网地址做 rendezvous,高速网只跑数据面。
【显存账】每台可用 unified memory 121.7 GiB,四台合计 4 × 121.7 = 487 GiB。800 GB ÷ 121.7 ≈ 6.6,向上取 7 台;若量化没到位,按 GLM-5.2 实测的 2.03 字节每参数(1506.69 GB / 744B)反推,1.6T 总参要约 13 台。800 GB − 487 GiB = 313 GB,这是物理缺口。

【要不要切分的判据】本机盘顺序读 9.6-9.9 GB/s(三次 9.6 / 9.9 / 9.6);环上单边 8 流 110.7 Gbps 折 13.8 GB/s,但那是收发两端合计,折成单向约 6.9 GB/s,而环上跨机单向只有约 6.9 GB/s —— 本地盘比跨机取数快。所以在这套拓扑上,「分布式」相对「单机 + 大盘」没有传输优势。切分要解决的是单机显存装不下,不是网络比盘快。

失效边界
200G 只跑到 51.4% 的成因未定位(可能是 RoCE 未调 PFC/ECN、GPUDirect 未生效、队列深度不足),只测到现象。只跑了 dense all-reduce,MoE 的 EP 切分靠 all-to-all,这部分完全未测 —— 所有关于切分代价的判断只覆盖 dense 这一半。TP 通信税 8.2% 为算得(假设每层一次 10KB all-reduce),真实框架可能合并或拆分,只能当量级参考。
← 统一内存机器查显存,四个命令给出四个答案,最大差 17.5 倍显存明明够却 OOM:先看报错里 reserved but unallocated 是不是大于 1GB →

← 返回全部排错方案