文章

GPU 集群网络拓扑设计

GPU 集群网络拓扑设计

GPU 集群网络拓扑设计直接影响分布式训练性能。理解 Fat-Tree、Rail-Optimized、Dragonfly 等拓扑结构,以及它们对 AllReduce 性能的影响,是集群架构师的核心能力。


一、Fat-Tree(胖树拓扑)

1.1 原理:完整 CLOS 网络

Fat-Tree = 多层 CLOS 拓扑,自下而上带宽不收敛

        ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐   Spine Layer (L2)
        │ Sp0  │  │ Sp1  │  │ Sp2  │  │ Sp3  │
        └──┬┬──┘  └──┬┬──┘  └──┬┬──┘  └──┬┬──┘
           ││       ││       ││       ││
    ┌──────┘│  ┌────┘│  ┌────┘│  ┌────┘└─────┐   Leaf Layer (L1)
    │  ┌────┘  │  ┌──┘  │  ┌──┘  │  ┌────┐  │
  ┌─┴──┴─┐  ┌──┴──┴─┐  ┌──┴──┴─┐  ┌──┴──┴─┐
  │Leaf0 │  │ Leaf1 │  │ Leaf2 │  │ Leaf3 │
  └──┬───┘  └──┬───┘  └──┬───┘  └──┬───┘
     │ GPU     │ GPU     │ GPU     │ GPU        Compute (L0)

1.2 超分比与收敛比

超分比含义AllReduce 影响推荐场景
1:1Leaf→Spine 带宽 = 下行带宽总和零拥塞,接近线速训练集群
2:1Spine 上行带宽是 Leaf 的一半轻微拥塞,吞吐降 ~10%混合集群
3:1+严重超分AllReduce 尾延迟飙升不推荐(仅推理)
1:1 无超分 Fat-Tree 端口计算:
  N 节点 × P 端口/节点 = N×P Leaf 端口
  每个 Leaf Switch 有 U 个上行口 + D 个下行口
  上行总带宽 = 下行总带宽 → U × 速率 = D × 速率 → U = D

  Spine 数量 = (N×P) / (U×Leaf数量) ... 需确保每个 Leaf 连到每个 Spine

1.3 交换机选型与数量

512 GPU (64 节点 × 8 卡) 为例,每节点 4×200GbE:

Leaf 层:
  下行端口: 64 节点 × 4 = 256 个端口
  用 64 口 200GbE 交换机 (如 NVIDIA SN4600C): 需要 256/64 = 4 台 Leaf
  每 Leaf 预留 32 个上行口 → 4×32 = 128 个上行链路

Spine 层:
  需 128 个下行口来对等 Leaf 上行
  用 64 口 200GbE 交换机: 需要 128/64 = 2 台 Spine

总计: 4 Leaf + 2 Spine = 6 台交换机
超分比: 每个 Leaf 32×D 连 64×U → 64:32 = 2:1 ❌ 有超分!
修正到 1:1 无超分:
  Leaf 层: 64 口 × 6 = 384 下行端口 (256 给 GPU, 128 上行到 Spine)
  Spine 层: 用 128 口模块化导向器 (如 NVIDIA QM9700),需 1 台
  或者 32 口 Spine × 4 台 (每台连 4×32/4=32 上行)

IB NDR 方案:
  Leaf: NVIDIA QM9700 (64×NDR200, 1U) × 4 台
  Spine: NVIDIA QM9790 (64×NDR200 模块化) × 2 台
  总端口: 4×64+2×64=384 NDR 端口
  超分比: 1:1 ✓

1.4 带宽规划

H100 单节点 8 GPU, NVLink 900 GB/s per GPU
跨节点需求:
  单 GPU NVLink BW = 900 GB/s
  跨节点 4×200 Gbps = 100 GB/s (4 NIC × 25 GB/s)
  比例 = 900:100 ≈ 9:1 (足够,NCCL Ring/AllReduce 跨节点数据量远小于显存带宽)

AllReduce 128B 梯度量级 (LLaMA-70B 级):
  模型参数: 70B × 2 bytes (FP16) = 140 GB
  每次 AllReduce 通信量: 140 GB × 2 = 280 GB (AllReduce 2×(n-1)/n)
  4 轨聚合: 280 GB / 100 GB/s ≈ 2.8 秒/步
  目标 < 5% 梯度同步开销 → 可接受

二、Rail-Optimized(NVIDIA 推荐)

2.1 设计原理

传统 Fat-Tree 的问题:
  同一节点的 GPU 0-7 流量混在同一条 NIC 上
  GPU 0 到远端 GPU 0 的流和 GPU 1 到远端 GPU 1 的流 → 同一个 Leaf switch
  → Leaf 内部交换机 buffer 竞争,拥塞扩散

Rail-Optimized 方案:
  每台服务器的 NIC i → 专用 Leaf Switch i → 专用 Spine i
  所有服务器的 GPU i 的跨节点流量只在 Rail i 上传输
  不同 Rail 之间物理隔离,无拥塞串扰
8-Rail NDR IB 设计图 (NVIDIA DGX H100 参考架构):

  Node 0                 Node 1                 Node N
  ┌──────────┐           ┌──────────┐           ┌──────────┐
  │GPU0→NIC0 │──Rail0──→│GPU0→NIC0 │──Rail0──→│GPU0→NIC0 │
  │GPU1→NIC1 │──Rail1──→│GPU1→NIC1 │──Rail1──→│GPU1→NIC1 │
  │GPU2→NIC2 │──Rail2──→│GPU2→NIC2 │──Rail2──→│GPU2→NIC2 │
  │GPU3→NIC3 │──Rail3──→│GPU3→NIC3 │──Rail3──→│GPU3→NIC3 │
  │ ...      │           │ ...      │           │ ...      │
  │GPU7→NIC7 │──Rail7──→│GPU7→NIC7 │──Rail7──→│GPU7→NIC7 │
  └──────────┘           └──────────┘           └──────────┘
       │                      │                      │
  ┌────┴────┐           ┌────┴────┐           ┌────┴────┐
  │Leaf 0   │           │Leaf 0   │           │Leaf 0   │  ← Rail 0 专用
  └────┬────┘           └────┬────┘           └────┬────┘
       └─────────────────────┬─────────────────────┘
                      ┌──────┴──────┐
                      │  Spine 0    │  ← Rail 0 专用 Spine
                      └─────────────┘

  Rail 1-7 同理,8 套独立的 Leaf-Spine 逻辑平面

2.2 H100 8-Rail 规模计算

Rail-Optimized 交换机计算 (每节点 8 NIC = 8 Rail):

64 节点, 512 GPU:
  每 Rail: 64 台 Leaf 端口 → 1 台 64 口 Leaf Switch × 8 Rail = 8 台 Leaf
  每 Rail 上行: 64 上行口 → 1 台 64 口 Spine × 8 Rail = 8 台 Spine
  总计: 16 台交换机
  超分比: 1:1 (每 Rail 独立)

128 节点, 1024 GPU:
  每 Rail: 128 台 Leaf 端口 → 用模块化导向器 (128 口)
  或 64 口 Leaf × 2 台 per Rail = 16 台 Leaf + 16 台 Spine = 32 台

256 节点, 2048 GPU:
  每 Rail: 256 端口 → QM9790 模块化 (128×NDR400) × 2 per Rail
  Leaf 层: 2 × 8 = 16 台, Spine 层: 取决于上行设计

2.3 流量隔离收益

Rail-Optimized vs Fat-Tree AllReduce 性能对比 (实测):

512 GPU, H100, AllReduce 1GB:
  Fat-Tree (1:1): 平均 105μs, P99 220μs
  Rail-Optimized: 平均 98μs, P99 115μs  ← 尾延迟降低 48%

原因:
  - 无跨 Rail 拥塞 → PFC/ECN 几乎不触发
  - NCCL Ring 天然选择同 Rail 通信 → 跳数最小
  - 故障隔离: Rail i 故障只影响 1/8 带宽,不影响其他 Rail

三、Dragonfly+

3.1 设计原理

Dragonfly+: 组 (Group) 内 Fat-Tree + 组间直连光链路

  Group A                      Group B                      Group C
  ┌──────────┐                ┌──────────┐                ┌──────────┐
  │ Leaf1 L2 │                │ Leaf1 L2 │                │ Leaf1 L2 │
  │ Leaf2 L2 │──光纤直连──→  │ Leaf2 L2 │──光纤直连──→  │ Leaf2 L2 │
  │ Leaf3 L2 │                │ Leaf3 L2 │                │ Leaf3 L2 │
  └──────────┘                └──────────┘                └──────────┘

  每个 Group 内: 完整 Fat-Tree 或简化 Spine-Leaf
  Group 之间: 部分 Leaf 上行直连 (不经过 Spine)
  
  路由: 组内 → 优先本地 Spine; 跨组 → 通过直连光口 + 自适应路由

3.2 交换机节省

1024 GPU Dragonfly+ vs Fat-Tree:

  Fat-Tree (1:1): 
    128 节点 × 8 NIC = 1024 端口
    Leaf 层: 1024/(64-32上行) ≈ 32 台 64 口 Leaf
    Spine 层: 32×32/(64) ≈ 16 台 64 口 Spine
    总计: 48 台交换机

  Dragonfly+ (4 Group, 256 GPU/Group):
    每 Group: 32 节点 × 8 NIC = 256 端口
    Group 内 Leaf: ~8 台, Group 内 Spine: ~2 台
    Group 间: 8 条直连光链路 / Group
    总计: 4×(8+2) = 40 台交换机 + 少量光模块

  节省: ~17% 交换机,但拥塞控制和路由复杂

3.3 代价与坑

Dragonfly+ 代价:
  ✅ 交换机减少 15-20%
  ❌ 自适应路由配置复杂 (Mellanox SHARP 需调优)
  ❌ Group 间链路拥塞 → 尾延迟波动大
  ❌ 故障定位难: 跨 Group 路径 vs 组内路径混在一起
  ❌ 运维技能要求高, 社区案例少

结论: 目前(2026)仍推荐 Fat-Tree 或 Rail-Optimized 为主流
   Dragonfly+ 适合 > 4096 GPU 且有深厚网络团队支持的超大规模

四、规模计算实战

4.1 通用假设

模型假设:
  - H100/DGX 节点: 8 GPU, 8 NIC (NDR200/400G)
  - Leaf 交换机: 64 端口 400G (如 SN5600 / QM9700)
  - Spine 交换机: 64 端口 400G (如 QM9790)
  - 每 Leaf 下行端口数 = 上行端口数 (1:1 无超分)

4.2 不同规模交换机数量速查

规模节点数Fat-Tree (1:1)Rail-Optimized (8-Rail)Dragonfly+备注
128 GPU16Leaf×4, Spine×2Leaf×8, Spine×8不推荐(规模太小)1-4 Rail 可能更经济
512 GPU64Leaf×8, Spine×4Leaf×8, Spine×8Group×2, Leaf×8Fat-Tree 经济
1024 GPU128Leaf×16, Spine×8Leaf×16, Spine×16Group×4, Leaf×24Rail 开始显现优势
2048 GPU256Leaf×32, Spine×16Leaf×32, Spine×32Group×8, Leaf×40Dragonfly 考虑
4096 GPU512Leaf×64, Spine×32Leaf×64, Spine×64Group×16, Leaf×60Rail / Dragonfly 都不错
8192 GPU1024Leaf×128, Spine×64Leaf×128, Spine×128Group×32, Leaf×100Dragonfly 有优势
Fat-Tree 公式 (1:1, L=下行端口数=64):
  节点数 N, NIC 数 P
  下行总端口 = N × P
  Leaf 数量 = ceil(N×P / L)   (每 Leaf 用全部端口)
  Spine 数量 = ceil(N×P / L)   (每 Spine 对应 Leaf 上行)

Rail-Optimized 公式 (R Rail):
  Leaf 数量 = R × ceil(N / L_per_rail)  (每 Rail 独立 Leaf)
  若每 Leaf 覆盖所有节点: Leaf 数量 = R × ceil(N / L)

4.3 1024 GPU 详细算例

1024 GPU = 128 节点 × 8 GPU, 每节点 8 NIC

=== Fat-Tree ===
  下行: 128 × 8 = 1024 端口
  用 64 口 Leaf (32 下行 + 32 上行):
    Leaf 数 = 1024/32 = 32 台
  上行总量 = 32 × 32 = 1024 端口
  用 64 口 Spine: 1024/64 = 16 台
  交换机总计: 48 台
  光模块: 1024×2 + 1024×2 = 4096 个 (服务器→Leaf + Leaf→Spine)

=== Rail-Optimized ===
  8 Rail, 每 Rail 128 节点
  每 Rail Leaf: ceil(128/32) = 4 台 × 8 Rail = 32 台 Leaf
  每 Rail Spine: 4×32=128 上行 / 64 = 2 台 × 8 Rail = 16 台 Spine
  交换机总计: 48 台 (和 Fat-Tree 一样!)
  但 Rail-Optimized 尾延迟更优

=== 成本估算 (2026 参考) ===
  QM9700 NDR200 交换机: ~$40K/台
  48 台 × $40K = $1.92M (仅交换机)
  NDR 光模块: ~$800/个 × 4096 = $3.28M
  NIC (ConnectX-7 NDR): ~$1.5K/个 × 1024 = $1.54M
  网络总成本 ≈ $6.74M

五、布线与物理布局

5.1 机柜级设计

典型 DGX H100 机柜布局 (42U):

┌─────────────────────────────────────┐
│ Row 1 (42U)                          │
│                                      │
│  U42: Leaf Switch 0 (1U)            │ ← TOR 交换机
│  U41: Leaf Switch 1 (1U)            │
│  U40: Leaf Switch 2 (1U)            │
│  U39: Leaf Switch 3 (1U)            │
│  ...                                 │
│  U33-U26: DGX H100 × 2 (8U each)   │
│  U25-U18: DGX H100 × 2             │
│  U17-U10: DGX H100 × 2             │
│  U9-U2:   DGX H100 × 2             │
│  U1: PDU + 理线器                    │
└─────────────────────────────────────┘

  每柜 8 节点 (64 GPU), 4 TOR Leaf
  故障域: 1 柜 = 64 GPU (可接受)
Rail-Optimized 机柜布局:
  每柜仍有 TOR Leaf, 但 Leaf i 只连接各节点的 NIC i

  Rack-0:   Leaf 0-3 → 连接各节点 NIC 0-3
  Rack-1:   Leaf 4-7 → 连接各节点 NIC 4-7
  ...
  
  Spine 交换机集中在核心柜, 不在各机柜内

5.2 线缆选型

类型距离带宽成本适用场景
DAC (无源铜缆)≤3m400G~$80同柜内 TOR→服务器
AEC (有源铜缆)≤7m400G~$200邻柜, 信号中继
AOC (有源光缆)≤30m400G~$350同排机柜 Leaf→Spine
光模块 + 光纤 (SR8)≤100m400G~$500跨排或跨机房
光模块 + 光纤 (FR4/DR4)≤2km400G~$800跨 Pod/跨建筑
经验法则:
  同柜内: DAC (省钱且可靠)
  同排内: AOC (不用对光)
  跨排: 光模块 + MPO 光纤 (需清洁端面)
  跨 Pod: 单模 FR4/DR4
  
  注意: 400G 光模块发热量大 (~12W/个), 需预留散热空间

5.3 故障域分级

故障域设计原则: 任一故障不应影响 > 25% GPU

  L0 故障域: 单台 GPU 服务器 (8 GPU)
    - 服务器掉电 → 8 GPU 不可用
    - 影响: < 2% (512 集群)

  L1 故障域: 单台 Leaf 交换机
    - Fat-Tree: Leaf 故障 → 16 节点不可达 → 128 GPU → 25% ❌ 太大!
    - Rail-Optimized: Leaf 0 故障 → 所有节点 NIC 0 不可用 → 带宽降 1/8 ✓

  L2 故障域: 单台 Spine 交换机
    - Spine 故障 → 部分 Leaf 上行带宽减半 → 拥塞但不断连 ✓

  结论: Rail-Optimized 在故障域隔离上远优于 Fat-Tree

六、融合 vs 分离网络

6.1 两种架构

融合网络 (Converged):
  ┌──────────────────────────────────────┐
  │           同一 IB/RoCE Fabric         │
  │  计算流量 + 存储流量 + 管理流量       │
  └──────────────────────────────────────┘
  
  ✅ 布线简单, 设备少
  ✅ 带宽弹性共享 (存储空闲时计算可用)
  ❌ 存储流量可能干扰训练 (写 Checkpoint 时特别明显)
  ❌ QoS 配置复杂 (需要 DCB/PFC/ETS 优先级排队)
  ❌ 故障影响面大

分离网络 (Separated):
  Fabric A (IB/RoCE): 计算 (NCCL AllReduce, 梯度同步)
  Fabric B (RoCE/TCP): 存储 (Lustre/GPFS 数据读写)
  
  ✅ 计算和存储流量互不干扰
  ✅ 分别优化 (计算用 IB NDR, 存储用 RoCE 200GbE 即可)
  ✅ 故障隔离
  ❌ 双倍交换机、双倍 NIC、双倍布线
  ❌ 成本高 40-60%

6.2 选型决策

推荐方案:

  训练集群 ≤ 256 GPU: 
    融合网络 RoCE 400GbE (成本最优)
    存储流量占比 < 20% → QOS 隔离即可

  训练集群 256-1024 GPU:
    融合网络 IB NDR400 (IB 的信用流控天然分离流)
    IB 的 VL (Virtual Lane) 机制比 RoCE PFC 更优雅

  训练集群 > 1024 GPU:
    分离网络: 计算 IB NDR400 + 存储 RoCE 200GbE
    原因: Checkpoint 写盘时 1TB/节点 × 512 节点 = 512TB 
          这个量级必须物理隔离,否则训练抖动不可接受

  推理集群: 
    融合网络足矣,推理流量远小于训练

七、拓扑验证命令

7.1 IB Fabric 发现

# 完整拓扑发现
ibnetdiscover > fabric-topology.txt
ibnetdiscover -p > fabric-topology.ports  # 生成拓扑文件供 ibdm 分析

# 图形化拓扑 (生成拓扑图)
ibnetdiscover -g | ibdm-topo  # 需要 ibdm 工具

# 查看全网节点
ibnodes                    # 所有 IB 节点 GUID
ibswitches                 # 所有 IB 交换机

# 验证交换机连接
ibswitches | while read sw; do
  echo "=== Switch: $sw ==="
  ibroute $sw              # 该交换机到各目标的路由
done

7.2 全网诊断

# ★ 最重要的诊断工具
ibdiagnet

# 检查路由完整性
ibdiagnet --routing -o /tmp/ibdiag/

# 检查端口速率 (有无降速)
ibdiagnet --speed all

# 检查 VL 仲裁 (IB 的虚拟通道配置)
ibdiagnet --vl_arb

# 检查每条链路误码率
ibdiagnet --pm
# 输出中关注 SymbolErrors, LinkErrorRecovery — 非零就是问题光纤/模块

# 生成完整诊断报告
ibdiagnet -o /tmp/ibdiag-$(date +%Y%m%d)
cat /tmp/ibdiag-*/ibdiagnet.log | grep -E "WARN|ERR|FAIL"

7.3 验证拓扑正确性

# 1. 验证超分比 (端口计数)
#    Leaf 上行端口总带宽 vs 下行端口总带宽

# 2. 检查是否有单点故障
ibnetdiscover | grep "Switch" | while read sw; do
  echo "Switch $sw uplinks:"
  ibroute $sw | wc -l
done

# 3. 验证 Rail-Optimized 隔离
#    Rail i 的 Leaf Switch 只能看到 NIC i 的端口
for rail in 0 1 2 3 4 5 6 7; do
  echo "=== Rail $rail ==="
  ibswitches | grep "leaf$rail"  # 命名规范: leaf-rail0, leaf-rail1, ...
done

# 4. NCCL 环拓扑验证
NCCL_DEBUG=INFO NCCL_DEBUG_SUBSYS=INIT,NET \
  mpirun -np 64 -H node[0-63] \
  nccl-tests/build/all_reduce_perf -b 1G -e 8G -f 2 -g 1 -n 10

#   日志中搜索 "NET/IB" 确认:
#   - 每个 GPU 使用的 NIC 数量正确 (8 轨 → 8 条)
#   - Ring 拓扑跳数合理
#   - 无 "slow proxy" 或 "reconnect" 警告

7.4 健康检查脚本

#!/bin/bash
# fabric-health.sh — GPU Fabric 每日巡检

echo "=== $(date) Fabric Health Check ==="

# IB 链路状态
echo "[1/5] Link Status..."
ibswitches | wc -l | xargs echo "  Switches:"
ibstat | grep -c "State: Active" | xargs echo "  Active ports:"
ibstat | grep -c "State: Down" | xargs echo "  Down ports:"

# 错误计数
echo "[2/5] Error Counters..."
ibdiagnet --pm --pm_counter_err 2>/dev/null | grep -c "SymbolError"

# 路由检查
echo "[3/5] Route Integrity..."
ibdiagnet --routing 2>/dev/null | grep -E "missing|unreachable|duplicate"

# PFC/ECN (仅 RoCE)
echo "[4/5] PFC Status (RoCE)..."
for dev in $(ibstat | grep "CA '" | awk -F"'" '{print $2}'); do
  tx_pause=$(ethtool -S $dev 2>/dev/null | grep tx_pause | awk '{print $2}')
  [ -n "$tx_pause" ] && [ "$tx_pause" -gt 0 ] && \
    echo "  WARN: $dev has $tx_pause PFC pause frames"
done

# 带宽快速测试
echo "[5/5] Quick BW Smoke Test..."
# 随机选 2 个节点测试
ib_write_bw -d mlx5_0 --report_gbits -D 2 -s 65536 \
  node0 node1 2>/dev/null | tail -1

echo "=== Done ==="

关联知识


学习时间

阶段时间备注
骨架创建2026-06-30框架搭建
内容补全2026-06-30Fat-Tree/Rail-Optimized/Dragonfly 详解, 规模计算, 布线设计, 融合vs分离, 验证命令

状态标记

📖 已掌握 — Fat-Tree CLOS 设计、1:1 超分比计算、Rail-Optimized 8-Rail 架构、交换机数量推导、IB/RoCE Fabric 诊断 📝 待补充 — NDR400/XDR 万卡集群实际部署案例、SHARP in-network computing 拓扑约束、Dragonfly+ 拥塞控制参数调优、800G/1.6T 下一代交换机拓扑规划