MRC(Multipath Reliable Connection)是 OpenAI 与 AMD、Broadcom、Intel、Microsoft、NVIDIA 联合开发的 RDMA 传输协议,已用于 ChatGPT/Codex 前沿模型训练。报告称,它通过多平面拓扑、数据包喷射和 SRv6 静态源路由,在十万卡级超算上实现微秒级故障恢复,并将拥塞降至接近零。
一、动机:为什么需要新协议
大规模同步预训练(synchronous pretraining)中,每个训练步(step)的耗时受最慢传输影响——即 tail latency(尾延迟)主导性能。GPU 之间需要频繁进行 all-reduce、all-to-all 等集合通信,任何一个数据包的延迟或丢失都会造成整步等待。
随着集群规模扩大,三类问题更加突出:
- 流碰撞(flow collision):多条流被 hash 到同一条物理链路上,形成热点拥塞
- Incast 拥塞:多个发送方同时向同一目的地发送,在最后一跳形成拥塞
- 链路/交换机故障:百万级链路的集群中,链路抖动和交换机故障是常态
MRC 的目标:即使存在故障,也能维持可预测的低尾延迟,让训练作业不受干扰地持续运行。
二、多平面拓扑(Multi-plane Topology)
2.1 核心思路
将一张 800Gb/s 的 NIC 按 lane 拆分为 8 个 100Gb/s 端口,各自连接到不同的交换机,构建 8 个独立并行平面(plane)。
| 方案 | 端口配置 | 交换机层级 | 最大 GPU 数 | 故障影响 |
|---|---|---|---|---|
| 传统单平面 | 1 × 800Gb/s | 3-4 层 | ~64K | NIC-交换机链路故障 → 作业崩溃 |
| MRC 多平面 | 8 × 100Gb/s | 仅 2 层 | 131K+ | 丢失一个平面仅损失 12% 带宽 |
2.2 多平面优势
- 低延迟:最多经过 3 个交换机(vs 传统 5-7 个)
- 低成本/功耗:仅需传统方案 2/3 的光模块和 3/5 的交换机数量
- 故障粒度更细:丢失一条 T0-T1 链路损失 0.4% 容量,远小于传统方案的 3%
- NIC-交换机链路失效可存活:作业不会崩溃,仅降级运行
2.3 挑战
传统单路径协议(如经典 RoCE)无法利用多平面的路径多样性——每条流只能走一条路径,流碰撞导致严重拥塞。
三、MRC 协议核心机制
MRC 扩展了 RoCEv2 Reliable Connection (RC) 语义层,借鉴 Ultra Ethernet Transport (UET) 的设计,但保持对 Verbs API 的兼容。仅支持 RDMA write 和 write-with-immediate 操作。
3.1 数据包喷射(Packet Spraying)
每个 MRC QP(Queue Pair)维护一个 熵值集合(EV set),通常包含 128-256 个 EV。EV 值被打散存储在 UDP 源端口和 IPv6 flow label 中。发送方在每个数据包上轮换使用不同 EV,从而将一条流的数据包同时喷射到数百条物理路径上。
EV 在各平面间均匀分配,确保跨平面负载均衡。每个 EV 对应一条确定的网络路径(特定平面上的特定上行链路)。
3.2 乱序直接写入内存
每个 MRC 数据包携带 RDMA 虚拟地址(virtual address)和 remote key,接收端 NIC 无论包到达顺序如何,都能直接将数据写入目标 GPU 内存。
3.3 有损以太网模式
MRC 完全禁用 PFC(Priority Flow Control),使用 best-effort 以太网。原因:
- 数据包被喷射到数百条路径上,PFC 的反压信号无法正确对应
- PFC 会在不同集合通信之间造成头阻塞(HOL blocking),恶化尾延迟
3.4 快速选择性重传(Selective Retransmission)
接收端通过 SACK(Selective ACK) 精确标记哪些包已到达,发送端仅重传丢失的包——类似 TCP SACK 但在 RDMA 层面实现。
3.5 数据包裁剪(Packet Trimming)
当交换机因拥塞要丢弃一个包时,不再丢弃整个包,而是裁掉 payload 只转发头部到目的地。目的端收到裁剪包后立即发送 NACK,触发发送端快速重传。
裁剪的价值:
- 区分「拥塞丢包」和「链路故障丢包」
- 避免误判路径故障(false positive)
- 加速 incast 场景下的恢复
3.6 ECN 自适应负载均衡
交换机启用 ECN(Explicit Congestion Notification),但在最后一跳禁用(仅用于检测核心网络拥塞,而非最后一跳的 incast)。接收端将 ECN 标记回传给发送端,发送端据此判断特定路径是否拥塞,临时切换 EV。
不同 MRC 发送端之间无需协调——各自独立做负载均衡,ECN 负责平滑聚合后的不均。
3.7 路径故障检测与恢复
数据包丢失(非裁剪) → 立即假设路径故障 → 停止使用该 EV→ 从同平面备用池中激活新 EV→ 后台发送探测包(probe)→ 探测成功 → 恢复 EV,重新加入可用池整个过程在 几十微秒 内完成。
四、SRv6 静态源路由
4.1 为什么弃用动态路由
传统数据中心使用 BGP 做动态路由,但:
- 收敛慢:大规模两层级拓扑中 BGP 收敛极其漫长
- ECMP 集合膨胀:高基数交换机每个目的地需要维护大量不同 ECMP 集合
- 与 MRC 冲突:MRC 先避开故障路径 → BGP 重新路由 → ECMP 映射改变 → 干扰负载均衡
- 控制平面 Bug:数据中心研究表明 17% 交换机故障是软件 bug
MRC 将路径管理交给 NIC,交换机只按静态规则转发。
4.2 uN uSID 格式
使用 SRv6 uSID(micro-segment ID) 格式,每个 uSID 16 bit,对应沿途一个交换机。采用 uN 风格——路径上每个交换机显式命名。
IPv6 目的地址 = 32-bit locator prefix + 16-bit uSID₁ + 16-bit uSID₂ + ...4.3 转发流程
- 交换机检查目的地前 48 bit 是否匹配自身 locator + uSID
- 匹配 → 将 uSID 部分左移 16 bit,露出下一跳 uSID
- 查 静态转发表(配置时写入,永不修改)→ 确定出端口
- 线速转发
MRC 包是 IPv6-in-IPv6 封装的:外层地址 = SRv6 路径,内层地址 = 目的 NIC 真实地址。
4.4 EV → SRv6 地址映射
QP 启动时:
- NIC 查节点配置 → 获取 SRv6 地址模板(通用模板,含 dst uSID)
- NIC 生成 EV 集合,平分到所有平面,同平面内随机选子集
- 每发一个包:从 EV 中提取 plane number、T0 uplink number → 填入模板 → 生成最终 SRv6 地址
这样 EV = 路径的压缩表示,无需同时维护 EV 状态和 SRv6 地址两套数据。
五、运维:Clustermapper 全链路探测
每个节点上运行 Clustermapper agent,每毫秒探测全网每条链路:
- 探 T0:源路由到 T0 再回环
- 探 T1:源路由到 T1 再回环
- 精准定位:T0 probe OK + T1 probe 异常 → 问题在 T0-T1 链路,不是 NIC-T0 链路
SRv6 让探测包走与数据包完全相同的路径,避免 hash 带来的不确定性。探测经过数据平面,不会给控制面增加高频探测负担。
六、实战数据
6.1 部署规模
| 集群 | GPU / NIC | 交换机 | 拓扑 |
|---|---|---|---|
| Cluster A | GB200 + CX8 800G | SP4 & TH5 | 2-Tier 4×200G |
| Cluster B | GB200 + CX8 800G | Spectrum 5 | 2-Tier 8×100G |
| Cluster C | MI355 + Pollara 400G | TH5 | 2-Tier 4×100G |
6.2 性能基准
| 场景 | 延迟/带宽 |
|---|---|
| T0-local, 2B | 5.09 μs |
| Cross-T1, 2B | 6.54 μs |
| T0-local, 32KB | ~770 Gb/s(96% 峰值) |
| Cross-T1, 32KB | ~770 Gb/s |
| NCCL sendrecv @ 42K GPU | 92 GB/s |
6.3 故障容错实测
- T0-T1 链路持续抖动(每分钟多条):训练作业几乎无感知
- T1 交换机需重启(75K GPU 训前沿模型时发生 4 次):掉 ~580K 包,吞吐量短暂下降后完全恢复,无需与训练团队协调
- T0 光模块故障,4 链路同时抖动:吞吐量降 ~25%,1 分钟后恢复,作业不崩溃
- T1 交换机完全停止转发:MRC 避开故障路径,吞吐量基本不受影响
- ⚠ 单点故障:NIC 光模块(OSFP)自身故障 → 所有端口同时掉 → 无法存活,此类故障较少见
6.4 vs RoCE 对比(64 GPU 小规模)
| 集合通信 | MRC 1QP | RoCE 1QP | RoCE 16 QP |
|---|---|---|---|
| All-reduce (带宽受限) | 接近线速 | ~50% | ~80%(8QP 后不再提升) |
| All-to-all | 全面优于 RoCE | — | QP scaling 无效 |
带丢包(0.1%):RoCE 大消息勉强撑住,小消息崩溃;MRC SACK 重传大幅优于 RoCE。
6.5 无 PFC 跨作业干扰
7→1 incast + 并行 victim 流:RoCE + DCQCN 下 victim 被严重拖累;MRC victim 完全不受影响——丢包只发生在 incast 流自身。
七、设计对比
| 层面 | 传统方案 | MRC |
|---|---|---|
| 拓扑 | 单平面 3-4 层 | 多平面 2 层 |
| 路径选择 | 动态路由(BGP) | SRv6 静态源路由 |
| 负载均衡 | ECMP hash + QP scaling | 数据包喷射(128-256 paths) |
| 流量控制 | PFC + DCQCN | 禁用 PFC,best-effort |
| 丢包恢复 | Go-Back-N / 连接中断 | SACK 选择重传 + NACK 裁剪 |
| 故障恢复 | 路由收敛(秒~数十秒) | 端侧 EV 切换(微秒级) |
| 运维 | 需协调停训再修链路 | 可在线修链路 |
八、开源与生态
- MRC 规范通过 OCP(Open Compute Project) 公开发布
- 实现硬件:NVIDIA CX-8、AMD Pollara/Vulcano、Broadcom Thor Ultra
- 交换机支持:NVIDIA Spectrum-4/5(Cumulus/SONiC)、Arista EOS + Broadcom TH5
- 联合论文:“Resilient AI Supercomputer Networking using MRC and SRv6”
- 配套博文:OpenAI - Supercomputer networking to accelerate large scale AI training