3、核心工具介绍:NCCL Tests、ib_write_bw、iperf3 的适用场景与基本用法

做带宽测试,说白了就是给网络做「体检」。你不能等到训练跑起来才发现带宽不够,那代价太大了。我个人习惯,在集群上线前,先把这三板斧抡一遍:NCCL Tests、ib_write_bw、iperf3。它们各自管一摊事,谁也替不了谁。

3.1 NCCL Tests:GPU 通信的「照妖镜」

NCCL Tests 是 NVIDIA 官方出品的工具集。它直接调用 NCCL 库,模拟的就是 GPU 之间通信的真实场景。你想想看,我们训练时用的 all-reduce、all-gather,它都能测。

适用场景:

  • 验证多机多卡之间的 NCCL 通信带宽
  • 排查 Ring 算法或 Tree 算法下的性能瓶颈
  • 对比不同拓扑(如 NVLink vs PCIe)的差异

常用命令:

# 单机 8 卡 all_reduce 测试
./build/all_reduce_perf -b 128M -e 8G -f 2 -g 8

# 双机 16 卡 all_reduce 测试(需要指定 hosts)
./build/all_reduce_perf -b 128M -e 8G -f 2 -g 8 --hosts node1:8,node2:8

参数说明:-b 起始大小,-e 结束大小,-f 倍数因子,-g GPU 数量。

我的经验:我曾经遇到一个案例,单机 8 卡 all_reduce 带宽只有 40GB/s,远低于理论值 600GB/s。排查了半天,发现是 NCCL 环境变量 NCCL_IB_DISABLE=1 被错误设置了。所以跑测试前,先 echo $NCCL_* 看一眼环境变量,能省很多时间。

3.2 ib_write_bw:RDMA 网络的「硬指标」

ib_write_bw 是 Mellanox(现 NVIDIA)的 Perftest 工具包里的。它绕过了 GPU,直接测试网卡到网卡的 RDMA 带宽。说白了,它测的是网络本身的极限能力,跟 GPU 没关系。

适用场景:

  • 验证 InfiniBand 或 RoCE 网络的物理带宽
  • 排查网卡、光模块、线缆问题
  • 确认交换机端口协商速率是否正确

基本用法:

# 服务端(node1)
ib_write_bw -d mlx5_0 -p 18515 --report_gbits

# 客户端(node2)
ib_write_bw -d mlx5_0 -p 18515 192.168.1.1 --report_gbits

-d 指定网卡设备,-p 端口号,--report_gbits 以 Gb/s 显示结果。

注意:ib_write_bw 测试的是 点对点 带宽。如果你有 8 台机器,需要两两测试,不能偷懒。我曾经见过一个集群,node1 到 node2 正常,但 node1 到 node3 只有一半带宽,最后发现是交换机端口配置错了。

3.3 iperf3:TCP/IP 层的「通用体检」

iperf3 是网络工程师的老朋友了。它测的是 TCP 或 UDP 的吞吐量。虽然 GPU 训练走的是 RDMA,但控制面、数据下载、日志传输还是离不开 TCP。所以 iperf3 的结果能反映网络栈的整体健康度。

适用场景:

  • 验证 TCP 带宽和延迟
  • 排查路由、防火墙、MTU 问题
  • 对比 RDMA 与 TCP 的性能差异

基本用法:

# 服务端
iperf3 -s -p 5201

# 客户端(测 60 秒,4 个并行流)
iperf3 -c 192.168.1.1 -p 5201 -t 60 -P 4

-P 并行流数,-t 测试时长。

避坑指南:我曾经在某个机房发现 iperf3 带宽只有 1Gbps,但网卡明明是 100Gbps。查了半天,发现是网线插到了管理口上。嗯,这种低级错误,谁都会犯一两次。

3.4 三款工具的对比

工具 测试层级 主要用途 依赖
NCCL Tests GPU 通信层 验证 all-reduce 等集合通信性能 NCCL、CUDA
ib_write_bw RDMA 网络层 验证 InfiniBand/RoCE 点对点带宽 Mellanox OFED
iperf3 TCP/IP 层 验证 TCP 吞吐量、排查网络栈问题 无特殊依赖

我的建议是:先跑 iperf3 确认 TCP 没问题,再跑 ib_write_bw 确认 RDMA 没问题,最后跑 NCCL Tests 确认 GPU 通信没问题。一层一层往下剥,问题出在哪一层,一目了然。

3.5 知识体系结构图

下面这张图,帮你理清这三款工具在测试链路中的位置:

带宽测试工具分层结构 应用层:AI 训练框架(PyTorch、TensorFlow) 依赖 NCCL 进行集合通信 NCCL Tests(all_reduce_perf / sendrecv_perf) 测试 GPU 集合通信带宽 ib_write_bw(RDMA 点对点测试) 测试 InfiniBand / RoCE 网络带宽 iperf3(TCP/IP 吞吐量测试) 测试深度

从这张图可以看得很清楚:iperf3 在最底层,测的是网络基础设施;ib_write_bw 在中间层,测的是 RDMA 能力;NCCL Tests 在最上层,直接反映 GPU 训练通信的真实表现。你如果发现 NCCL Tests 结果差,别急着调 NCCL 参数,先往下查 ib_write_bw 和 iperf3,往往能更快定位问题。

我的习惯:每次新集群上线,我都会写一个脚本,自动跑一遍这三件套,结果存成 CSV。这样下次出问题时,翻出历史数据一对比,就知道是硬件老化还是配置变更导致的。

好了,工具介绍就到这里。记住:没有万能的工具,只有合适的场景。下一节我们聊聊怎么设计测试用例,让这些工具真正为你所用。

可可精品资料库