H20 集群 RoCEv2 算力网络调优最佳实践
在 H20 训练集群里,GPU 通信性能的上限很大程度取决于 RoCEv2 网络工程质量。400G 网卡、Leaf-Spine、ECMP 这些硬件条件只是基础,真正决定稳定性的,是端到端参数是否一致、拥塞控制是否生效、GPU Direct RDMA 是否打通,以及所有配置是否能批量验证。
一、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 要和交换机端保持一致。但必须满足三个要求:
- 服务器端、交换机端、对端服务器一致。
- GID、路由、策略路由与 MTU 配置一并纳入自动化。
- 每次调整后通过 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
生产上要注意两点:
- ACS 调整要纳入变更审批,并结合服务器型号、BIOS 和安全策略确认。
- 调整后必须复跑单机和双机 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卡智算集群里,任何“只有一个节点不一致”的问题,都会在大规模通信中变成慢节点、掉速或超时。生产最佳实践是把所有调优项做成幂等自动化,并且每个配置项都要有验证命令和验收结果。