11 KiB
多机多卡 NCCL 诊断报告
- 日期:2026-05-23
- 测试入口:
nccl-gpu-1/aikubeworker0012/172.72.8.12 - 对端节点:
nccl-gpu-2/aikubeworker0016/172.72.8.16 - 诊断配置:
configs/multinode_nccl_diagnostic.yaml - 原始脚本报告:
reports_multinode_nccl_diagnostic_2x8_sshfix.md
当前结论
这不是单纯 “IB 不通” 的问题。底层 CUDA RDMA perftest 可以跑到接近单端口 400Gb/s 的水平;最初使用 pip 包里的 NCCL 2.21.5 时,NCCL 在实际 2 节点通信中把 GPU Direct RDMA 禁用了,导致带宽显著偏低。
后续临时切换到 apt 包解压出的 NCCL 2.27.7+cuda12.4 后,NCCL GDR 已经恢复启用,2 节点 x 8 GPU allreduce 从 67.42 GB/s 提升到 237.86 GB/s,alltoall 从 9.56 GB/s 提升到 28.62 GB/s。当前剩余问题不再是 GDR disabled,而是 GDR enabled 后仍低于当前配置里的验收阈值。
同时,nccl-gpu-2 的 SSH 入口曾因未认证连接过多触发 MaxStartups 随机拒绝,导致 mpirun 拉起远端 rank 失败。已经做了临时 SSHD 缓解并拿到有效的 2 节点 x 8 GPU allreduce/alltoall 报告。
已完成的修正
- 修正
mpirun使用路径,避开系统/usr/bin/mpirun与 DOCA OpenMPI 动态库混用导致的崩溃。 - 补充
LD_LIBRARY_PATH,确保mpirun、CUDA、pip 安装的 NCCL 动态库可同时解析。 - 将 NCCL HCA 限定到 400Gb/s 活跃端口:
mlx5_0,mlx5_1,mlx5_6,mlx5_7。 - 在脚本中加入 multi-node NCCL 网络诊断解析,报告会展示
NCCL Network、GPU Direct RDMA、GDR Disabled HCAs。 - 增加
multinode_nccl.extra_env,可以在配置里快速试 NCCL 环境变量,不需要改代码。 - 增加诊断配置
configs/multinode_nccl_diagnostic.yaml,固定跑 2 节点 x 8 GPU、256M、NCCL_DEBUG=INFO和NCCL_DEBUG_SUBSYS=INIT,NET。 - 在
nccl-gpu-2上临时提高 SSHDMaxStartups并缩短LoginGraceTime,缓解未认证连接过多导致的 SSH 随机拒绝。 - 将 OpenMPI OOB TCP 控制通道固定到
bond0,并加入plm_rsh_args,减少mpirun远端启动受 SSH/host key/接口选择影响的概率。 - 从 NVIDIA apt 源下载但不安装
libnccl2=2.27.7-1+cuda12.4,解压到两台机器/tmp/nccl-2.27.7-cuda12.4,用LD_LIBRARY_PATH临时覆盖 NCCL 运行库验证。 - 增强报告解析,能够区分
GPU Direct RDMA ENABLED和DISABLED,并列出 enabled/disabled HCA。
关键证据
1. CUDA RDMA perftest 通过
命令类型:
CUDA_VISIBLE_DEVICES=0 ib_write_bw -d mlx5_0 -i 1 --use_cuda=0 -s 4194304 -F --report_gbits 172.72.8.16
结果:
| 测试 | 设备 | GPU | 平均带宽 | 结论 |
|---|---|---|---|---|
ib_write_bw --use_cuda |
mlx5_0 |
GPU0 | 387.16 Gb/s |
PASS |
解释:GPU 内存参与 RDMA 写带宽测试可以接近 400Gb/s,说明 nvidia_peermem/经典 GPUDirect RDMA 路径并非完全不可用。
2. CUDA DMA-BUF 路径不可用
命令类型:
CUDA_VISIBLE_DEVICES=0 ib_write_bw -d mlx5_0 -i 1 --use_cuda=0 --use_cuda_dmabuf -s 4194304 -F --report_gbits 172.72.8.16
结果:
| 测试 | 输出 | 结论 |
|---|---|---|
ib_write_bw --use_cuda_dmabuf |
DMA-BUF is not supported on this GPU |
FAIL |
解释:当前环境不能走 CUDA DMA-BUF RDMA。后续 NCCL 应优先确认是否能稳定走经典 nvidia_peermem 路径。
3. NCCL 单卡跨节点仍禁用 GDR
使用 pip NCCL 2.21.5 时,
已经尝试:
NCCL_NET_GDR_LEVEL=SYSNCCL_NET_GDR_LEVEL=5NCCL_NET_GDR_READ=1NCCL_DMABUF_ENABLE=0NCCL_IB_CUDA_SUPPORT=1NCCL_IB_HCA=mlx5_0
结果仍显示:
NCCL INFO Using network IB
NCCL INFO NET/IB : GPU Direct RDMA Disabled for HCA 0 'mlx5_0'
256M allreduce 约 13.4 GB/s,明显低于 400Gb/s IB 端口能力。
3.1 NCCL 2.27.7 恢复 GDR
临时使用:
LD_LIBRARY_PATH=/usr/mpi/gcc/openmpi-4.1.9a1/lib:/tmp/nccl-2.27.7-cuda12.4/usr/lib/x86_64-linux-gnu:/usr/local/cuda-12.4/targets/x86_64-linux/lib
2 节点 x 1 GPU 日志显示:
NCCL version 2.27.7+cuda12.4
NET/IB : GPU Direct RDMA Enabled for HCA 0 'mlx5_0'
Channel ... via NET/IB/0/GDRDMA
256M allreduce 从 NCCL 2.21.5 的约 13.4 GB/s 提升到 45.2 GB/s。判断:NCCL 2.21.5 与当前 driver/OFED/H100 组合存在 GDR 判定或注册路径兼容问题;升级 NCCL 是有效修复方向。
4. 脚本 2 节点 x 8 GPU 诊断结果
原始报告:reports_multinode_nccl_diagnostic_2x8_sshfix.md,使用 pip NCCL 2.21.5。
| Operation | Topology | Peak Bus BW | Threshold | Status | NCCL Network | GPU Direct RDMA |
|---|---|---|---|---|---|---|
| allreduce | 2 nodes x 8 GPUs | 67.42 GB/s |
>= 480 GB/s |
FAIL | IB | DISABLED |
| alltoall | 2 nodes x 8 GPUs | 9.56 GB/s |
>= 75 GB/s |
FAIL | IB | DISABLED |
allreduce 失败原因是带宽不达标,且报告捕获到 GDR 被 NCCL 禁用:
| GDR Disabled HCAs |
|---|
mlx5_0, mlx5_1, mlx5_6, mlx5_7 |
allreduce 和 alltoall 本轮均正常完成,returncode=0、wrong=0,失败原因是带宽低于阈值,不是正确性失败。
4.1 NCCL 2.27.7 诊断结果
256M 诊断报告:reports_multinode_nccl_diagnostic_2x8_nccl227_v2.md
| Operation | Topology | Peak Bus BW | Threshold | Status | NCCL Network | GPU Direct RDMA |
|---|---|---|---|---|---|---|
| allreduce | 2 nodes x 8 GPUs | 212.19 GB/s |
>= 480 GB/s |
FAIL | IB | ENABLED |
| alltoall | 2 nodes x 8 GPUs | 28.37 GB/s |
>= 75 GB/s |
FAIL | IB | ENABLED |
1M 到 4G sweep 报告:reports_multinode_nccl_sweep_2x8_nccl227.md
| Operation | Peak Bus BW | Peak Size | Threshold | Status | GPU Direct RDMA |
|---|---|---|---|---|---|
| allreduce | 237.26 GB/s |
4G |
>= 480 GB/s |
FAIL | ENABLED |
| alltoall | 28.78 GB/s |
1G |
>= 75 GB/s |
FAIL | ENABLED |
16G 大包报告:reports_multinode_nccl_16g_2x8_nccl227.md
| Operation | Peak Bus BW | Peak Size | Threshold | Status | GPU Direct RDMA |
|---|---|---|---|---|---|
| allreduce | 237.86 GB/s |
16G |
>= 480 GB/s |
FAIL | ENABLED |
| alltoall | 28.62 GB/s |
16G |
>= 75 GB/s |
FAIL | ENABLED |
解释:NCCL 2.27.7 已经修复 GDR 禁用问题,且性能提升明显;但在当前跨节点/跨 Leaf 环境和当前阈值下仍不达标。allreduce 约稳定在 238 GB/s,alltoall 约稳定在 28-29 GB/s。
5. SSHD MaxStartups 阻塞已临时缓解
nccl-gpu-2 曾显示:
sshd: /usr/sbin/sshd -D [listener] 52 of 10-100 startups
maxstartups 10:30:100
同时存在大量 sshd: unknown [priv] / sshd: unknown [net] 未认证连接,来源主要是 172.239.10.85。这会触发 OpenSSH MaxStartups 随机拒绝,直接表现为:
kex_exchange_identification: Connection closed by remote host
先临时改为:
MaxStartups 120:30:240
LoginGraceTime 20
后续外部未认证连接继续上涨到 110 of 120-240 startups,测试窗口进一步临时改为:
MaxStartups 500:30:1000
LoginGraceTime 5
改完后从 0012 连续 SSH 0016 5 次成功,2 节点 mpirun hostname 成功,2 节点 x 8 GPU allreduce/alltoall 也都能跑出有效结果。
6. nvidia_peermem legacy 模式实验无效
两台机器默认参数一致:
| 参数 | 值 |
|---|---|
nvidia_peermem version |
580.159.03 |
peerdirect_support |
0 |
persistent_api_support |
1 |
| OFED | OFED-internal-26.01-1.0.0 |
临时切换两台机器到 peerdirect_support=1 后,2 节点 x 1 GPU NCCL 仍显示:
NET/IB : GPU Direct RDMA Disabled for HCA 0 'mlx5_0'
带宽仍约 13.4 GB/s。测试后已经恢复默认 peerdirect_support=0,persistent_api_support=1。
当前阻塞
阻塞 1:当前生产 NCCL 版本过旧,GDR 被禁用
现象:
- pip NCCL 2.21.5:
GPU Direct RDMA Disabled,2x8 allreduce67.42 GB/s - 临时 NCCL 2.27.7:
GPU Direct RDMA Enabled,2x8 allreduce237.86 GB/s - 因此,生产测试环境应避免继续使用 pip NCCL 2.21.5 作为多机 NCCL 验收运行库
判断:底层 RDMA 能力存在,GDR 禁用主要由旧 NCCL 版本触发。建议正式安装并固定 NCCL 2.27.7+cuda12.4 或更新的已验证版本。
阻塞 2:GDR enabled 后带宽仍低于当前阈值
现象:
- 2x8 16G allreduce:
237.86 GB/s,阈值>= 480 GB/s - 2x8 16G alltoall:
28.62 GB/s,阈值>= 75 GB/s - 已使用 4 个 400Gb/s HCA:
mlx5_0, mlx5_1, mlx5_6, mlx5_7
判断:需要确认当前 PDF/config 阈值是否适用于跨 Leaf 两节点场景;如果阈值确实要求跨 Leaf 也达到这些数值,则还需要继续查链路聚合、多 rail 使用、交换网络、NCCL net plugin/SHARP 或 rail mapping。
阻塞 3:nccl-gpu-2 SSH 存在外部连接压力
现象:
- 多次出现过:
kex_exchange_identification: Connection closed by remote host - 根因是未认证连接过多触发
MaxStartups - 当前已经通过临时 SSHD 配置缓解,并拿到了有效 2x8 报告
- 但如果外部连接压力持续,仍建议从网络侧或安全策略侧处理来源连接
判断:这不再阻塞当前报告产出,但属于环境稳定性风险。
建议下一步
- 从网络/安全侧处理
172.239.10.85等来源的 SSH 未认证连接压力,或者保留更高的MaxStartups配置作为测试窗口临时策略。 - 正式安装并固定已验证的 NCCL 2.27.7+cuda12.4 或更新版本,不要依赖 pip NCCL 2.21.5;当前
/tmp/nccl-2.27.7-cuda12.4只是临时解压验证。 - 尝试安装或启用匹配当前 OFED/driver 的 NCCL net plugin/SHARP;当前日志显示
Could not find: libnccl-net.so,NCCL 使用的是 internal IB plugin。 - 核对跨 Leaf 链路的 rail mapping、交换机端口速率、路由和拥塞计数,确认 4 个 400Gb/s HCA 是否都在跨节点通信中充分利用。
- 确认当前
allreduce >= 480 GB/s、alltoall >= 75 GB/s阈值是否应直接用于跨 Leaf 两节点场景;如果是,继续按链路和 NCCL rail 聚合方向排查。
当前可交付物
configs/multinode_nccl_diagnostic.yaml:多机多卡诊断配置configs/multinode_nccl_nccl227_diagnostic.yaml:NCCL 2.27.7 256M 诊断配置configs/multinode_nccl_nccl227_sweep.yaml:NCCL 2.27.7 1M 到 4G sweep 配置configs/multinode_nccl_nccl227_16g.yaml:NCCL 2.27.7 16G 大包配置reports_multinode_nccl_diagnostic_2x8_sshfix.md:脚本生成的原始 2x8 诊断报告reports_multinode_nccl_diagnostic_2x8_nccl227_v2.md:NCCL 2.27.7 256M 诊断报告reports_multinode_nccl_sweep_2x8_nccl227.md:NCCL 2.27.7 1M 到 4G sweep 报告reports_multinode_nccl_16g_2x8_nccl227.md:NCCL 2.27.7 16G 大包报告reports_multinode_nccl_diagnosis_20260523.md:本中文诊断总结