NCCL 多卡通信测试:测 all_reduce/all_gather 带宽,判断 NVLink、PCIe 与 IB 是否正常
NCCL Tests 是 NVIDIA 提供的集合通信微基准,包含 all_reduce_perf、all_gather_perf、reduce_scatter_perf、broadcast_perf、alltoall_perf 等程序。它测的是 GPU 之间的通信带宽和延迟,不测模型算力,也不替代训练吞吐测试。单机多卡看 NVLink/PCIe,多机看 IB/RoCE 和 NCCL 拓扑选择。
判断结果时看 busbw(算法带宽按通信模式折算后的总线带宽),不要只看 algbw。all_reduce 的 busbw = algbw × 2(n-1)/n,不同集合操作的折算系数不同,跨操作比较 algbw 没有意义。先跑正确性检查 -c 1,再跑性能;出现 #wrong 非零时不要继续调优。
# 单机 8 卡,从 8B 到 128MB,按 2 倍递增
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8
# 只做正确性检查,不做性能统计
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8 -c 1
# 多机:每机 8 卡,共 16 卡;hostfile 里列出节点
mpirun -np 16 --hostfile hosts \
-x NCCL_DEBUG=INFO -x NCCL_SOCKET_IFNAME=ib0 \
./build/all_reduce_perf -b 8 -e 8G -f 2 -g 8
# 打开 NCCL 调试日志,确认网卡、拓扑和算法选择
NCCL_DEBUG=INFO NCCL_DEBUG_SUBSYS=INIT,NET \
./build/all_reduce_perf -b 1G -e 1G -f 2 -g 8
# 指定 IB HCA,避免 NCCL 选错网卡
NCCL_IB_HCA=mlx5_0,mlx5_1 ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8
构建时按环境选择 MPI 或单进程模式:
make MPI=1 MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi CUDA_HOME=/usr/local/cuda
algbw 当成跨操作可比的带宽:不同集合操作的折算系数不同,统一看 busbw,并用相同消息大小和 GPU 数比较。-b/-e 覆盖完整区间。NCCL_SOCKET_IFNAME、NCCL_IB_HCA 明确网卡,并看 NCCL_DEBUG=INFO 的拓扑日志。-g 是每进程 GPU 数,mpirun -np 是进程数;多机时二者乘积要等于总 GPU 数。--gpus all、NVIDIA_VISIBLE_DEVICES、/dev/infiniband 和 IPC/共享内存配置;容器网络模式也会影响 NCCL。nvidia-smi 确认空闲,关闭 ECC 错误计数干扰,固定时钟后对比;不要让训练任务和基准争抢同一张卡。#wrong 仍继续看性能:先排查硬件、驱动、NCCL 版本和拓扑,正确性不通过时性能数字没有意义。合上页面,先回答,再展开对照。
algbw 和 busbw 有什么区别?为什么跨集合操作比较时要看 busbw?#wrong 非零时,应该先调性能还是先排查正确性?algbw 是按消息大小和耗时算出的算法带宽;busbw 按集合操作的通信模式折算成总线带宽。不同操作的折算系数不同,busbw 才能跨操作比较。NCCL_DEBUG=INFO,确认选中的网卡和拓扑;用 NCCL_SOCKET_IFNAME 指定数据网卡,用 NCCL_IB_HCA 指定 IB 设备,并确认容器能看到 /dev/infiniband。#wrong 非零说明结果不一致,可能是硬件、驱动、NCCL 版本或拓扑问题;此时性能数字不可信。
小程序版
微信扫码,随时查命令