第二章-H20集群RoCEv2算力网络调优最佳实践

第二章-H20集群RoCEv2算力网络调优最佳实践

Deng YongJie's blog 1 2026-01-11

H20 集群 RoCEv2 算力网络调优最佳实践

在 H20 训练集群里,GPU 通信性能的上限很大程度取决于 RoCEv2 网络工程质量。400G 网卡、Leaf-Spine、ECMP 这些硬件条件只是基础,真正决定稳定性的,是端到端参数是否一致、拥塞控制是否生效、GPU Direct RDMA 是否打通,以及所有配置是否能批量验证。

h20-rocev2-tuning-flow-optimized

一、RoCEv2 调优目标

RoCEv2 调优不是追求某个单独参数“看起来正确”,而是让训练流量在大规模集合通信中稳定、低抖动、可定位。

生产环境建议同时关注这些目标:

目标 说明
可达性 所有训练网卡 IP、GID、路由可达
一致性 BIOS、固件、OFED、驱动、NCCL、CUDA 版本一致
无损队列 PFC、ECN、DSCP、CNP 标记端到端匹配
拥塞控制 DCQCN 参数在每张训练网卡上固化
GPU Direct nvidia_peermem 加载,PCI ACS 不阻断 P2P
可回滚 每个调优动作有变更记录和回滚策略
可验收 单机、双机、百台级 NCCL 可复跑

很多集群的问题不是“完全不能跑”,而是“小规模正常,大规模掉速”。这类问题通常与队列、路由、局部拥塞、少数节点配置漂移有关。

二、RDMA 与 GPU Direct 基线

第一步是让 RDMA 与 NVIDIA GPU Direct RDMA 的基础模块稳定加载。

cat >/etc/modules-load.d/rdma.conf <<'EOF'
ib_core
ib_umad
ib_uverbs
ib_cm
rdma_cm
iw_cm
rdma_ucm
mlx5_ib
ib_ipoib
nvidia_peermem
nvidia_uvm
nvidia_modeset
EOF

for module in ib_core ib_umad ib_uverbs ib_cm rdma_cm iw_cm rdma_ucm mlx5_ib ib_ipoib nvidia_peermem nvidia_uvm nvidia_modeset; do
  modprobe "${module}"
done

验证时不要只看命令返回值,至少要检查:

lsmod | egrep 'mlx5_ib|rdma_cm|nvidia_peermem'
ibv_devinfo
show_gids
nvidia-smi topo -m

nvidia_peermem 是 GPU 与 NIC 之间走 GDR 的关键模块。如果这个模块未加载或加载异常,NCCL 仍可能跑通,但跨机带宽和延迟会明显不符合预期。

三、网卡命名、MTU 与路由

8 卡 H20 服务器通常会有多张训练网卡。生产环境不建议依赖系统自动生成的 enp* 名称,因为 BIOS、固件、系统版本变化都可能导致接口名漂移。

建议做法是根据 PCI 地址生成稳定命名,并把训练网卡统一映射到约定名称,例如:

<train-iface-1> -> bond2
<train-iface-2> -> bond3
...
<train-iface-8> -> bond9

这里的 bond2-bond9 更像是项目中的训练网卡命名约定,不一定代表传统意义上的双口链路聚合。这是“训练网卡稳定命名”,原始 udev 规则里的真实 PCI、MAC 和业务命名。

MTU 要和交换机端保持一致。但必须满足三个要求:

  1. 服务器端、交换机端、对端服务器一致。
  2. GID、路由、策略路由与 MTU 配置一并纳入自动化。
  3. 每次调整后通过 ping、RDMA 工具、NCCL 三层验证。

四、RoCE 模式与 GID 检查

ConnectX 网卡需要确认链路类型和 RoCE 控制参数。模板如下:

mst start

for dev in <mst-device-list>; do
  mlxconfig -y -d "${dev}" set LINK_TYPE_P1=2
  mlxconfig -y -d "${dev}" set ROCE_CONTROL=2
done

reboot

重启后检查:

for dev in <mst-device-list>; do
  mlxconfig -d "${dev}" query | egrep 'LINK_TYPE|ROCE_CONTROL'
done

show_gids
cma_roce_mode -d <mlx5-device>

如果 NCCL 使用了固定 NCCL_IB_GID_INDEX,就必须确认所有节点同一张训练网卡上的 GID index 语义一致。否则会出现部分节点通信正常、部分节点连接异常或性能异常的情况。

五、PFC、ECN、DSCP 与 CNP

RoCEv2 建立在以太网上,训练网络需要对拥塞和丢包特别敏感。项目资料中采用了 DSCP 信任、PFC 队列、ECN 开关和 CNP DSCP 48 的组合思路。

for iface in <train-iface-list>; do
  mlnx_qos -i "${iface}" --trust dscp --pfc 0,0,0,0,0,1,1,0
  echo 48 > "/sys/class/net/${iface}/ecn/roce_np/cnp_dscp"
  echo 1 > "/sys/class/net/${iface}/ecn/roce_np/enable/5"
  echo 1 > "/sys/class/net/${iface}/ecn/roce_rp/enable/5"
done

检查:

for iface in <train-iface-list>; do
  echo "### ${iface}"
  mlnx_qos -i "${iface}"
  cat "/sys/class/net/${iface}/ecn/roce_np/cnp_dscp"
done

这里最容易出问题的是“只配服务器,不配交换机”或“服务器与交换机 DSCP/队列不一致”。RoCE 的 PFC 和 ECN 是端到端工程,服务器端正确不代表整网正确。

六、DCQCN 拥塞控制

DCQCN 是 RoCEv2 生产网络里常用的拥塞控制机制。项目资料中启用了 DCQCN 兼容模式和 legacy DCQCN 软件模式:

mst start

for dev in <mst-device-list>; do
  mlxconfig -d "${dev}" -y set ROCE_CC_DCQCN_COMPATIBILITY_MODE=1
  mlxconfig -d "${dev}" -y set ROCE_CC_LEGACY_DCQCN_SW=1
done

reboot

检查:

for dev in <mst-device-list>; do
  mlxconfig -d "${dev}" query | grep ROCE_CC
done

DCQCN 的价值通常在规模放大后才明显。双机测试可能看不出差异,但到 128 机、256 机甚至整网验收时,拥塞控制不一致会造成带宽波动、尾延迟升高和慢节点。

七、PCI ACS 与 GPU Direct RDMA

PCI ACS 可能把 PCIe 点对点访问重定向到 Root Complex,影响 GPU 与 NIC 之间的直接通信。训练集群中如果需要 GPU Direct RDMA,就要确认 ACS 不阻断关键路径。

lspci -d "*:*:*" | awk '{print $1}' | while read bdf; do
  if setpci -s "${bdf}" ECAP_ACS+0x06.w >/dev/null 2>&1; then
    setpci -s "${bdf}" ECAP_ACS+0x06.w=0000
  fi
done

生产上要注意两点:

  1. ACS 调整要纳入变更审批,并结合服务器型号、BIOS 和安全策略确认。
  2. 调整后必须复跑单机和双机 NCCL,不能只看配置值。

八、NCCL 侧配合项

RoCE 网络调好后,NCCL 侧也要显式绑定正确路径:

mpirun -np <total-ranks> \
  -H <node-a>:8,<node-b>:8,... \
  --allow-run-as-root \
  --bind-to none \
  --map-by slot \
  --mca btl_tcp_if_include <business-bond> \
  --mca oob_tcp_if_include <business-bond> \
  -x NCCL_SOCKET_IFNAME=<business-bond> \
  -x UCX_NET_DEVICES=<business-bond> \
  -x NCCL_IB_DISABLE=0 \
  -x NCCL_IB_GID_INDEX=<gid-index> \
  -x NCCL_IB_HCA=<train-hca-list> \
  -x NCCL_IB_TC=<traffic-class> \
  -x NCCL_NET_GDR_LEVEL=<gdr-level> \
  ./all_reduce_perf -g 1 -b 120M -e 34G -f 2 -n 100

九、生产调优检查表

检查项 命令示例 期望
RDMA 设备 ibv_devinfo 训练网卡全部可见
GID show_gids GID index 与 NCCL 参数一致
GPU Direct `lsmod grep nvidia_peermem`
RoCE 模式 mlxconfig query Link Type 与 RoCE Control 正确
PFC mlnx_qos -i <iface> 训练队列 PFC 与交换机一致
CNP DSCP cat /sys/class/net/<iface>/ecn/roce_np/cnp_dscp 与网络设计一致
DCQCN `mlxconfig query grep ROCE_CC`
NCCL all_reduce_perf 单机、双机、百台级曲线稳定

十、总结

H20 RoCEv2 调优的核心不是把命令背下来,而是形成闭环:先建立硬件和软件基线,再统一网卡命名和路由,然后配置 RoCE、PFC、ECN、DSCP、DCQCN,最后通过 NCCL 分层验收验证效果。

在 3000卡智算集群里,任何“只有一个节点不一致”的问题,都会在大规模通信中变成慢节点、掉速或超时。生产最佳实践是把所有调优项做成幂等自动化,并且每个配置项都要有验证命令和验收结果。