以下是关于 nccl-tests
工具的使用方法、结果解析及不同场景下性能问题的根因定位指南:
一、nccl-tests 使用方法
1. 安装与编译
- 下载源码:
git clone https://github.com/NVIDIA/nccl-tests.git cd nccl-tests
- 编译(需已安装NCCL库和CUDA):
若无需MPI支持,省略make MPI=1 MPI_HOME=/path/to/mpi CUDA_HOME=/path/to/cuda NCCL_HOME=/path/to/nccl
MPI=1
。
2. 常用测试用例
-
AllReduce性能测试:
# 单节点8卡测试 ./build/all_reduce_perf -b 1G -e 4G -f 2 -g 8 # 多节点测试(假设通过MPI启动) mpirun -np 16 -H node1:8,node2:8 ./build/all_reduce_perf -b 1G -e 4G -f 2 -g 1
- 参数说明:
-b <size>
:起始数据大小(如1G
表示1GB)。-e <size>
:结束数据大小。-f <factor>
:每次测试数据大小的增长因子(如2
表示翻倍)。-g <ngpus>
:每个进程使用的GPU数量(通常为1)。
- 参数说明:
-
其他测试:
all_gather_perf
:AllGather操作测试。broadcast_perf
:Broadcast操作测试。reduce_scatter_perf
:Reduce-Scatter操作测试。
3. 关键环境变量
NCCL_DEBUG=INFO
:输出详细通信日志。NCCL_ALGO=Tree|Ring
:强制指定通信算法。NCCL_PROTO=LL|LL128|Simple
:指定通信协议。NCCL_SOCKET_IFNAME=eth0
:指定通信网卡。
二、结果解析与性能判断
1. 输出示例
典型输出格式如下:
# nThread 1 nGpus 1 minBytes 1073741824 maxBytes 4294967296 step: 2(factor)
# Using devices
# Rank 0 Pid 12345 on node1 device 0 [0x00] NVIDIA A100-SXM4-40GB
# Rank 1 Pid 12346 on node2 device 0 [0x00] NVIDIA A100-SXM4-40GB
#
# out-of-place in-place
# size count type redop time algbw busbw error time algbw busbw error
# (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s)
1073741824 268435456 float sum 105.9 9.47 8.89 0e+00 105.8 9.48 8.89 0e+00
2147483648 536870912 float sum 208.3 9.62 9.02 0e+00 208.1 9.63 9.03 0e+00
4294967296 1073741824 float sum 413.7 9.69 9.09 0e+00 413.5 9.70 9.10 0e+00
2. 关键指标
- algbw(Algorithm Bandwidth):算法带宽,计算公式为
size / time
。 - busbw(Bus Bandwidth):总线带宽,考虑通信路径的带宽(如跨节点时需乘以跳数)。
- time:操作耗时(微秒)。
3. 判断是否达标
- 单节点多卡:
- NVLink场景:A100/A800的AllReduce带宽应接近 ~200 GB/s(NVLink 3.0)。
- PCIe场景:PCIe Gen4 x16带宽约为 ~64 GB/s。
- 多节点:
- 同Leaf交换机:100Gbps网卡的理论带宽为 ~12.5 GB/s,实际应达到 10-11 GB/s。
- 跨Leaf交换机:带宽可能下降至 5-8 GB/s(受上行链路带宽和交换机性能影响)。
不达标信号:
- 单节点带宽低于理论值的70%(如NVLink带宽 <140 GB/s)。
- 跨节点带宽低于网卡标称带宽的60%(如100G网卡带宽 <6 GB/s)。
- 日志中出现
transport retry
、timeout
或bus error
等错误。
三、根因定位方法
1. 单节点性能问题
- 现象:带宽远低于NVLink/PCIe理论值。
- 根因:
- GPU拓扑问题:GPU未通过NVLink直连(检查
nvidia-smi topo -m
)。 - PCIe带宽限制:GPU与CPU间的PCIe链路为Gen3 x8(应为Gen4 x16)。
- 驱动问题:CUDA或NCCL版本不兼容。
- IB网卡故障:IB网卡网线故障或者IB ERRORS
- PCIe降速:PCIe插槽降速,导致GPU卡之间带宽不达标
- GPU拓扑问题:GPU未通过NVLink直连(检查
- 排查步骤:
# 检查NVLink状态 nvidia-smi topo -m # 检查PCIe带宽 nvidia-smi -q | grep "Link Width" # 测试单机带宽基线 ./build/all_reduce_perf -b 8G -e 8G -f 1 -g 8
2. 同Leaf不同节点性能问题
- 现象:同Leaf下多节点带宽显著低于网卡标称值。
- 根因:
- 网卡配置错误:未启用RoCE/RDMA或MTU未设置为4096。
- 带宽争抢:多任务共享同一物理链路。
- 协议效率低:未使用LL或LL128协议。
- GPU Direct RDMA未启用:确保 GPUDirect RDMA 已启用且NIC支持。
- NUMA绑定错误:跨NUMA访问导致延迟增加,需绑定进程到本地NUMA节点
- 中断亲和性:网卡中断未绑定到专用CPU核心,导致处理延迟。
- 排查步骤:
# 检查网卡状态(RoCE模式) ibstat # 检查MTU ip link show eth0 | grep mtu # 强制使用LL协议 export NCCL_PROTO=LL # 绑定进程到NUMA numactl --cpunodebind=0 --membind=0 ./your_application
3. 跨Leaf不同节点性能问题
- 现象:跨Leaf时带宽骤降或延迟抖动。
- 根因:
- 交换机跳数增加:跨Leaf需经过Spine层,引入额外延迟。
- 上行链路拥塞:Leaf-Spine上行链路带宽不足。
- 未适应拓扑的算法:默认的Ring算法在跨Leaf时可能效率低下,需尝试强制使用Tree算法
- QoS配置不当:RDMA流量未标记高优先级(如DSCP)。
- 交换机缓存不足:跨Leaf流量突发时交换机Buffer容量不足导致丢包。
- NIC性能瓶颈::网卡带宽(如100Gbps vs. 200Gbps)或PCIe Gen3/Gen4带宽不足。
- MTU不匹配:不同交换机MTU配置不一致导致分片(Fragment)增加。
- 协议选择不当:LL(低延迟)协议可能在小数据量下更优,但跨Leaf时LL128或Simple协议可能更高效。
- 排查步骤:
# 检查交换机端口流量(需管理员权限) show interface ethernet 1/1 | grep rate # 调整NCCL算法为Tree export NCCL_ALGO=Tree # 检查路由对称性 ibroute | grep -i path
四、工具辅助分析
-
NCCL日志分析:
export NCCL_DEBUG=INFO mpirun -np 8 ./all_reduce_perf 2>&1 | grep "rank\|channel\|collnet"
- 观察各Rank的通信时间和错误信息。
-
网络性能测试:
- 使用
ib_send_bw
测试节点间带宽:# Server端 ib_send_bw -d mlx5_0 -F # Client端 ib_send_bw -d mlx5_0 -F <server_ip>
- 使用
-
GPU通信分析:
- 使用Nsight Systems生成时间线:
nsys profile -t cuda,nvtx --stats=true mpirun -np 8 ./all_reduce_perf
- 使用Nsight Systems生成时间线:
五、总结
- 单节点问题:聚焦GPU拓扑、NVLink状态和PCIe配置。
- 同Leaf问题:检查网卡模式、MTU和协议选择。
- 跨Leaf问题:优化拓扑感知算法(如Tree)、交换机QoS和上行链路带宽分配。
通过逐步对比单节点、同Leaf和跨Leaf场景的测试结果,结合日志和硬件工具,可精准定位性能瓶颈。