28 KiB
多机多卡 NCCL 诊断报告
- 日期:2026-05-23
- 测试入口:
nccl-gpu-1/aikubeworker0012/172.72.8.12 - 对端节点:
nccl-gpu-2/aikubeworker0016/172.72.8.16 - 诊断配置:
configs/multinode_nccl_nccl227_auto_16g.yaml - 当前最佳原始脚本报告:
reports_multinode_nccl_16g_2x8_nccl227_auto.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。
继续 tuning 后发现,配置里固定的 NCCL_MIN_NCHANNELS=4、NCCL_IB_QPS_PER_CONNECTION=4、NCCL_IB_SPLIT_DATA_ON_QPS=1 会明显压低 16G allreduce。去掉这些固定参数、让 NCCL 2.27.7 自动选择后,正式脚本报告中 2 节点 x 8 GPU allreduce 提升到 354.60 GB/s,alltoall 小幅提升到 30.01 GB/s。当前剩余问题不再是 GDR disabled,而是 GDR enabled 且 NCCL 自动调参后,仍低于当前配置里的验收阈值。
按 sx算力节点跨Leaf NCCL测试报告.pdf 的矩阵继续对齐后,发现 2 机 4 卡档位的核心问题是默认 GPU 选择不符合 GPU-NIC 亲和性。显式选择 CUDA_VISIBLE_DEVICES=0,1,4,5 后,2 机 4 卡 allreduce 可以恢复到 333-335 GB/s 区间,接近 PDF 的 335.48 GB/s;alltoall 配合 PDF 固定 NCCL 参数可到 72.93 GB/s,接近 PDF 的 73.73 GB/s。但 2 机 8 卡档位仍只有 allreduce 354.02 GB/s、alltoall 30.04 GB/s,与 PDF 的 491.84/76.54 GB/s 差距明显。
进一步 sweep 8 卡 alltoall 网络参数后,NCCL_PXN_DISABLE=1 是唯一有效正向项。正式矩阵配置已对 2 机 8 GPU 的 alltoall 单独加入该变量,8 卡 alltoall 从约 30.04 GB/s 提升到 36.70 GB/s peak / 36.74 GB/s avg,但仍低于 PDF 参考 76.54 GB/s。复测端口 counter 后,PXN disabled 下 4 条 rail 的流量已均衡,且没有明显链路错误、丢包、RoCE 重传或 slow restart;同类 port_xmit_wait 在高吞吐 allreduce 中也会出现,因此它不是 alltoall 低吞吐的充分解释。继续在 PXN disabled 基线上叠加 NVLS、P2P chunk、buffer、channel、QP/split、AR 等参数,没有稳定收益。NCCL GRAPH/TUNING 日志显示 alltoall 的 channel graph 比 allreduce 复杂很多,且混入大量本机 P2P/CUMEM 路径,但 HCA/GDR/channel 基础状态一致。剩余差距更像 NCCL internal alltoall 通信模式效率、交换网络策略,或缺少 NCCL net plugin/SHARP 能力。
同时,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。 - 将 multi-node NCCL 配置中的
qps_per_connection、min_nchannels、split_data_on_qps改为null,避免默认导出会压低大包 allreduce 的固定 NCCL 参数。 - 增加 topology 级
cuda_visible_devices、env、op_env配置能力,支持按 GPU/NIC 亲和性和不同 NCCL op 分别设置环境变量。 - 生成 PDF 矩阵式原始报告
reports_multinode_nccl_pdf_matrix_nccl227.md,覆盖 2 机 1/2/4/8 GPU per node。 - 对 8 卡 alltoall 做 NCCL 网络参数 sweep,并将有效项
NCCL_PXN_DISABLE=1固化到 PDF 矩阵配置。 - 对 PXN disabled 后的 8 卡 alltoall 抓取
counters/hw_counters增量,确认 rail 已均衡且无明显错误/重传。 - 对同样 2x8 allreduce 抓 counter 对照,确认高吞吐 allreduce 也会出现
port_xmit_wait,因此该 counter 不是 alltoall 低吞吐的唯一根因。 - 在 PXN disabled 基线上继续 sweep NVLS、P2P chunk、buffer、channel、QP/split、AR 等参数,确认没有稳定收益,部分参数明显变差。
- 抓取 allreduce 与 PXN disabled alltoall 的
GRAPH/TUNING/COLL日志,确认两者 HCA/GDR/channel 基础状态一致,但 alltoall graph 明显更复杂。
关键证据
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 禁用问题,且性能提升明显;但在固定 min_nchannels=4/qps=4/split=1 的配置下仍不达标。allreduce 约稳定在 238 GB/s,alltoall 约稳定在 28-29 GB/s。
4.2 NCCL 2.27.7 自动通道/QP 参数结果
进一步对 16G 大包做 tuning,发现默认配置里锁定的参数会压低 allreduce:
| 配置 | allreduce Avg Bus BW | alltoall Avg Bus BW | 结论 |
|---|---|---|---|
NCCL 2.27.7 + 固定 min_nchannels=4/qps=4/split=1 |
238.56 GB/s |
28.62 GB/s |
GDR 已启用,但 allreduce 被压低 |
| NCCL 2.27.7 + NCCL 自动选择 channel/QP | 354.57 GB/s |
30.02 GB/s |
当前最佳脚本结果 |
正式脚本报告:reports_multinode_nccl_16g_2x8_nccl227_auto.md
| Operation | Peak Bus BW | Avg Bus BW | Peak Size | Threshold | Status | GPU Direct RDMA |
|---|---|---|---|---|---|---|
| allreduce | 354.60 GB/s |
354.57 GB/s |
16G |
>= 480 GB/s |
FAIL | ENABLED |
| alltoall | 30.01 GB/s |
30.02 GB/s |
16G |
>= 75 GB/s |
FAIL | ENABLED |
对比临时 tuning 命令:
| 变量组合 | allreduce Avg Bus BW | alltoall Avg Bus BW |
|---|---|---|
| baseline auto | 353.63 GB/s |
30.05 GB/s |
NCCL_IB_MERGE_NICS=1 |
352.73 GB/s |
30.07 GB/s |
NCCL_CROSS_NIC=1 |
354.68 GB/s |
30.05 GB/s |
NCCL_IB_QPS_PER_CONNECTION=8 + NCCL_IB_SPLIT_DATA_ON_QPS=0 |
350.91 GB/s |
29.41 GB/s |
NCCL_MIN_NCHANNELS=16 + NCCL_MAX_NCHANNELS=16 |
354.32 GB/s |
30.06 GB/s |
解释:allreduce 的主要提升来自取消不合适的固定参数,而不是 MERGE_NICS 或 CROSS_NIC。alltoall 对这些参数不敏感,当前基本稳定在 30 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。
7. PDF 矩阵对齐与 GPU-NIC 亲和性
参考 PDF 的跨 Leaf 命令覆盖 2 机 2/4/8/16 卡矩阵,并使用:
NCCL_IB_GID_INDEX=3NCCL_IB_SL=5NCCL_IB_TC=136NCCL_SOCKET_IFNAME=bond0NCCL_IB_TIMEOUT=22NCCL_NET_PLUGIN=noneNCCL_NVLS_ENABLE=1
本环境与 PDF 参考机器有一个关键硬件差异:当前两台机器只有 mlx5_0,mlx5_1,mlx5_6,mlx5_7 是 400Gb/s NDR;mlx5_4,mlx5_5 是 100Gb/s HDR;mlx5_2,mlx5_8 是 25Gb/s;mlx5_3,mlx5_9 为 DOWN。参考 PDF 的命令列出了更多 HCA,但当前节点不能等价使用为 8 条 400G rail。
nvidia-smi topo -m 显示:
| GPU | 最近的 400G HCA |
|---|---|
| GPU0 | mlx5_0 |
| GPU1 | mlx5_1 |
| GPU4 | mlx5_6 |
| GPU5 | mlx5_7 |
默认 2 机 4 卡会选择 GPU0/1/2/3,其中 GPU2 最近的是 25G/down 端口,GPU3 没有直接对应 400G rail。因此 2 机 4 卡默认 allreduce 只有约 168 GB/s。显式设置 CUDA_VISIBLE_DEVICES=0,1,4,5 后:
| 场景 | allreduce | alltoall | 说明 |
|---|---|---|---|
| 默认 GPU0/1/2/3 | 167.89 GB/s |
39.68 GB/s |
GPU/NIC 亲和性错误 |
CUDA_VISIBLE_DEVICES=0,1,4,5 + auto NCCL |
335.34 GB/s |
63.90 GB/s |
allreduce 接近 PDF |
CUDA_VISIBLE_DEVICES=0,1,4,5 + PDF 固定参数 |
225.29 GB/s |
73.10 GB/s |
alltoall 接近 PDF,但 allreduce 被压低 |
因此当前脚本支持按 op 配环境变量:4 卡 allreduce 用 auto,4 卡 alltoall 用 PDF 固定参数。
矩阵式正式报告:reports_multinode_nccl_pdf_matrix_nccl227.md
| Topology | allreduce | PDF Reference | Status | alltoall | PDF Reference | Status |
|---|---|---|---|---|---|---|
| 2 nodes x 1 GPU | 47.26 GB/s |
48.90 GB/s |
FAIL | 24.87 GB/s |
27.25 GB/s |
FAIL |
| 2 nodes x 2 GPUs | 136.36 GB/s |
136.93 GB/s |
FAIL | 47.69 GB/s |
54.41 GB/s |
FAIL |
| 2 nodes x 4 GPUs | 333.23 GB/s |
335.48 GB/s |
FAIL | 72.82 GB/s |
73.73 GB/s |
FAIL |
| 2 nodes x 8 GPUs | 353.47 GB/s |
491.84 GB/s |
FAIL | 36.70 GB/s |
76.54 GB/s |
FAIL |
解释:2 机 4 卡档位已经基本定位并修复到接近 PDF;2 机 8 卡档位不是简单 GPU 顺序问题。尝试调整 8 卡 CUDA_VISIBLE_DEVICES 顺序、加入 100G/25G active HCA、以及套 PDF 固定参数都没有改善;固定参数反而会把 8 卡 allreduce 从约 354 GB/s 压到约 239 GB/s。
8 卡 alltoall 目前的最佳软件侧改动是 NCCL_PXN_DISABLE=1:
| Case | 8 卡 alltoall Avg Bus BW |
|---|---|
| baseline | 30.06 GB/s |
NCCL_PXN_DISABLE=1 |
37.24 GB/s |
| 正式矩阵报告 | 36.74 GB/s |
其他变量如 NCCL_P2P_PXN_LEVEL、NCCL_NET_SHARED_COMMS、NCCL_NET_SHARED_BUFFERS、NCCL_NCHANNELS_PER_NET_PEER、NCCL_IB_ADAPTIVE_ROUTING 均无改善或变差。
PXN disabled 计数器显示该参数确实修复了 rail 分布:
| Case | Rail 分布 | Avg Bus BW |
|---|---|---|
| baseline | mlx5_0/6 约 885 GB,mlx5_1/7 约 295 GB |
30.04 GB/s |
NCCL_PXN_DISABLE=1 |
四条 HCA 均约 591 GB |
36.95 GB/s |
但禁用 PXN 后每条 400G rail 仍只有约 19-20 GB/s,没有接近裸 RDMA 单 rail 的 347-387 Gb/s。因此它解决的是 rail 分布不均衡的一部分,不是全部 alltoall 性能问题。
复测 PXN disabled alltoall 时继续抓 counters/hw_counters:
| 观察项 | 结果 |
|---|---|
alltoall Avg bus bandwidth |
36.4512 GB/s |
| 每条 HCA 流量 | 约 712.18-712.28 GiB,四条 rail 均衡 |
| discard / rcv error / symbol error / link down / link recovery | 0 增量 |
| RoCE retrans / slow restart / packet sequence error / out of sequence | 0 增量 |
port_xmit_wait |
mlx5_1、mlx5_7 有增长,约 15.65M-23.49M |
判断:当前没有明显坏链路、丢包或重传证据;port_xmit_wait 更像发送侧等待 credit/拥塞控制/交换侧调度,或者 NCCL internal alltoall 在当前拓扑下没有把 rail 吞吐打起来。
同样 2 nodes x 8 GPUs、同样 4 条 HCA 的 16G allreduce 对照:
| 观察项 | 结果 |
|---|---|
allreduce Avg bus bandwidth |
354.366 GB/s |
| 每条 HCA 流量 | 约 178.03-178.07 GiB,四条 rail 均衡 |
| 错误/重传类 counter | 0 增量 |
port_xmit_wait |
mlx5_1、mlx5_7 有增长,约 6.11M-6.59M |
判断:allreduce 在接近物理上限时也会出现 port_xmit_wait,所以 alltoall 的核心问题不能只归因于该 counter。现在更应关注 NCCL alltoall 通信模式、交换网络策略、以及 NCCL net plugin/SHARP 能力差异。
PXN disabled 基线上的二次参数 sweep:
| Case | Avg Bus BW | 结论 |
|---|---|---|
NCCL_PXN_DISABLE=1 |
37.0069 GB/s |
短测基线 |
+ NCCL_NVLS_ENABLE=0 |
37.2217 GB/s |
小幅波动,不稳定 |
+ NCCL_P2P_NET_CHUNKSIZE=4194304 |
37.2522 GB/s |
小幅波动,不稳定 |
+ NCCL_BUFFSIZE=8388608 |
37.0911 GB/s |
无实质改善 |
+ NCCL_MIN_NCHANNELS=16 NCCL_MAX_NCHANNELS=16 |
37.0189 GB/s |
无实质改善 |
+ NCCL_IB_AR_THRESHOLD=0 |
37.0843 GB/s |
无实质改善 |
+ NCCL_IB_QPS_PER_CONNECTION=4 NCCL_IB_SPLIT_DATA_ON_QPS=0 |
35.9847 GB/s |
变差 |
+ NCCL_IB_QPS_PER_CONNECTION=4 NCCL_IB_SPLIT_DATA_ON_QPS=1 |
29.8406 GB/s |
明显变差 |
+ NCCL_IB_QPS_PER_CONNECTION=8 NCCL_IB_SPLIT_DATA_ON_QPS=1 |
24.1183 GB/s |
明显变差 |
+ NCCL_NCHANNELS_PER_NET_PEER=8 |
29.8904 GB/s |
明显变差 |
长测复核没有复现 NVLS/P2P chunk 的短测小涨:同一环境确认仍为 NCCL 2.27.7+cuda12.4、4 条 400G HCA、GDR enabled、internal IB plugin,但 baseline 窗口下滑到 32.7280 GB/s,P2P_NET_CHUNKSIZE=4M 为 31.9340 GB/s,NVLS_ENABLE=0 + P2P_NET_CHUNKSIZE=4M 为 27.6585 GB/s。因此这些参数不应固化到正式配置。
GRAPH/TUNING/COLL 日志对照:
| 观察项 | allreduce | alltoall + NCCL_PXN_DISABLE=1 |
|---|---|---|
| NCCL version | 2.27.7+cuda12.4 |
2.27.7+cuda12.4 |
| HCA / GDR | 4 HCA, GDR enabled | 4 HCA, GDR enabled |
| external net plugin | missing, internal IB | missing, internal IB |
| channels | 16 coll / 16 nvls / 16 p2p |
16 coll / 16 nvls / 16 p2p |
| Pattern 4 | crossNic 0, type NVL/PXN, nChannels 8 |
crossNic 2, type NVL/PIX, nChannels 8 |
NET/IB/*/GDRDMA channel edge lines |
256 |
512 |
P2P/CUMEM channel edge lines |
0 |
224 |
| total NET/P2P channel edge lines | 256 |
736 |
判断:PXN disabled 后 4 条 IB/GDRDMA rail 和 16 个 p2p/coll/nvls channels 都仍在;但 alltoall graph 明显比 allreduce 复杂,并包含大量本机 P2P/CUMEM 边。这进一步说明问题不在 HCA/GDR 没生效,而在 alltoall collective graph、P2P/NET 组合方式、internal IB plugin 或交换网络策略。
8. 8 卡链路计数器与物理上限判断
计数器探测报告:reports_multinode_nccl_counter_probe_20260523.md
当前 2 机 8 GPU allreduce 输出:
| Metric | Value |
|---|---|
algbw |
189.16 / 189.07 GB/s |
busbw |
354.68 / 354.52 GB/s |
Avg bus bandwidth |
354.597 GB/s |
allreduce 在 16 ranks 下的换算关系约为:
busbw = algbw * 2 * (nranks - 1) / nranks = algbw * 1.875
因此 PDF 参考 491.84 GB/s busbw 对应约 262.31 GB/s algbw。但当前节点可用的 400G HCA 是 mlx5_0,mlx5_1,mlx5_6,mlx5_7,每节点 4 条 400Gb/s,理论单向合计约 200 GB/s。当前 allreduce 189 GB/s algbw 已经接近这个物理上限,所以 8 卡 allreduce 剩余差距基本不能靠 NCCL 参数小调解决。
裸 RDMA 4 rail 并发 ib_write_bw 也验证了底层 4 条 400G rail 可以同时工作:
| HCA | BW average |
|---|---|
mlx5_0 |
387.16 Gb/s |
mlx5_1 |
387.07 Gb/s |
mlx5_6 |
355.02 Gb/s |
mlx5_7 |
347.70 Gb/s |
| Total | 1476.95 Gb/s / 184.62 GB/s |
这个裸 RDMA 总带宽与 NCCL 8 卡 allreduce 的 189 GB/s algbw 接近,进一步说明 allreduce 已经贴近当前网络形态可提供的实际带宽。
8 卡 alltoall 当前仍只有:
| Metric | Value |
|---|---|
algbw |
32.04 / 32.05 GB/s |
busbw |
30.03 / 30.04 GB/s |
Avg bus bandwidth |
30.0389 GB/s |
同一测试窗口内端口计数器显示 alltoall 流量分布不均衡:mlx5_0 和 mlx5_6 的流量约 885 GB,mlx5_1 和 mlx5_7 约 295 GB,约为三倍差距。继续调换 NCCL_IB_HCA 顺序后,8 卡 alltoall 仍稳定在 30.02-30.07 GB/s,说明不是简单 HCA 列表顺序问题。
NCCL_PXN_DISABLE=1 后,端口流量变为四条 HCA 均约 591 GB,alltoall Avg bus bandwidth 提升到 36.9518 GB/s,但每条 rail 吞吐仍只有约 19.82 GB/s。
9. NCCL net plugin / SHARP 状态
两台机器上均未找到:
libnccl-net.solibsharp*- SHARP/HCOLL 相关 deb 包
当前仅看到 UCX 包:
ucx 1.20.0-1.20260211.d9a4f352d.2601100
apt 源里与 NCCL 直接相关的包只有:
libnccl2
libnccl-dev
因此当前 NCCL 日志里的 Could not find: libnccl-net.so 是真实环境缺失,不是脚本漏配路径。当前运行走的是 NCCL internal IB plugin;如果要继续追 8 卡 alltoall 或 PDF 2 机 16 卡参考值,需要补齐匹配当前 OFED/driver/CUDA/NCCL 的 NCCL net plugin/SHARP 环境,或由网络侧确认该集群不依赖这些组件也能达到目标值。
当前阻塞
阻塞 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:2 机 8 GPU 档位仍低于 PDF 参考值
现象:
- 2x8 16G allreduce:
354.02 GB/s,PDF 参考491.84 GB/s - 2x8 16G alltoall:
30.04 GB/s,PDF 参考76.54 GB/s - 已使用 4 个 400Gb/s HCA:
mlx5_0, mlx5_1, mlx5_6, mlx5_7 - 加入
mlx5_4,mlx5_5100G HCA 或mlx5_2,mlx5_825G HCA 基本无收益 - 调整 8 卡
CUDA_VISIBLE_DEVICES顺序基本无收益 - 套 PDF 固定参数会让 8 卡 allreduce 明显变差
判断:2 机 8 GPU 档位的剩余差距更像硬件 rail 数量/交换网络/路由/拥塞/NCCL net plugin 能力问题,不再是旧 NCCL GDR disabled 或 4 卡 GPU 选择问题。
补充证据:
- 8 卡 allreduce
algbw ~= 189 GB/s,接近当前 4 x 400G HCA 的理论单向合计200 GB/s - 裸 RDMA 4 rail 并发
ib_write_bw合计1476.95 Gb/s/184.62 GB/s - PDF 8 卡 allreduce
491.84 GB/s busbw反推需要约262 GB/s algbw,超过当前 4 x 400G 的物理单向总带宽 - 8 卡 alltoall baseline 端口计数器显示 rail 分布不均,且 HCA 顺序 sweep 无改善
- 当前环境缺失 NCCL net plugin/SHARP,NCCL 只能使用 internal IB plugin
NCCL_PXN_DISABLE=1可将 8 卡 alltoall 提升到约36.7 GB/s,并修复 rail 分布不均,但仍不到 PDF 参考值的一半- PXN disabled 复测没有看到 discard、链路错误、RoCE 重传、slow restart、packet sequence error 等错误类 counter 增长
- allreduce 对照同样出现
port_xmit_wait但能跑到354.366 GB/s,说明port_xmit_wait不是 alltoall 低吞吐的唯一根因 - PXN disabled 基线上继续叠加 NVLS、P2P chunk、buffer、channel、QP/split、AR 等参数没有稳定收益;QP/split 和
NCCL_NCHANNELS_PER_NET_PEER=8明显变差 - NCCL GRAPH/TUNING 对照显示 alltoall 与 allreduce 的 HCA/GDR/channel 基础状态一致,但 alltoall channel edge 更多,并混入大量
P2P/CUMEM本地路径
阻塞 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只是临时解压验证。 - 4 卡 per node 测试应显式使用
CUDA_VISIBLE_DEVICES=0,1,4,5,避免默认 GPU0/1/2/3 落到错误 GPU/NIC 亲和性。 - 4 卡 allreduce 建议继续让 NCCL 自动选择 channel/QP;4 卡 alltoall 如果要贴近 PDF,可单独套
NCCL_IB_QPS_PER_CONNECTION=4、NCCL_MIN_NCHANNELS=4、NCCL_IB_SPLIT_DATA_ON_QPS=1。 - 8 卡 per node 不建议套上述固定参数,会降低 allreduce;继续用 auto。
- 尝试安装或启用匹配当前 OFED/driver 的 NCCL net plugin/SHARP;当前日志显示
Could not find: libnccl-net.so,NCCL 使用的是 internal IB plugin。 - 核对跨 Leaf 链路的 rail mapping、交换机端口速率、路由、credit/拥塞等待与交换机侧队列计数;同时用 allreduce 对照避免把
port_xmit_wait误判为 alltoall 独有根因。 - 确认当前 PDF 的
491.84/76.54 GB/s是否要求当前这两台节点在只有 4 条 400G rail 的形态下也达到;如果要求一致,需要网络/硬件侧继续介入。 - 8 卡 alltoall 当前不建议继续盲调 NCCL 环境变量;重点查 SHARP/NCCL net plugin、NCCL internal alltoall 行为、交换机 ECMP/自适应路由和拥塞/credit 等待;
NCCL_IB_HCA顺序与 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 大包配置configs/multinode_nccl_nccl227_auto_16g.yaml:NCCL 2.27.7 16G 自动 channel/QP 配置configs/multinode_nccl_nccl227_pdf_matrix.yaml:按 PDF 矩阵和 GPU 亲和性优化后的跨 Leaf 配置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_16g_2x8_nccl227_auto.md:NCCL 2.27.7 16G 自动 channel/QP 原始报告reports_multinode_nccl_pdf_matrix_nccl227.md:NCCL 2.27.7 PDF 矩阵式原始报告reports_multinode_nccl_counter_probe_20260523.md:8 卡链路计数器与 HCA 顺序 sweep 报告reports_multinode_nccl_alltoall_tuning_20260523.md:8 卡 alltoall NCCL 网络参数 sweep 报告reports_multinode_nccl_diagnosis_20260523.md:本中文诊断总结