4. 带宽测试工具链

做过多卡训练的人都知道,通信带宽是分布式性能的命门。你模型写得再好,通信一卡顿,整个集群都在等数据。

我个人习惯,拿到一台新机器,第一件事就是跑一遍带宽测试工具链。这就像医生给病人做体检——先查清楚哪里通、哪里堵,心里才有底。

今天我把四个最常用的工具串起来讲:nvidia-smi topo -m、nccl-tests、ib_write_bw、iperf3。它们各自负责不同层面的诊断,组合起来就是一套完整的通信体检方案。

核心思路:从拓扑结构 → GPU通信 → 网络传输 → 带宽验证,逐层排查。

多卡通信带宽测试工具链 nvidia-smi topo -m 拓扑结构探测 nccl-tests GPU间通信带宽 ib_write_bw RDMA网络带宽 iperf3 TCP/IP网络带宽 先看拓扑 → 再测GPU通信 → 最后验证网络层(RDMA + TCP) 逐层排查,定位瓶颈 nvidia-smi topo -m GPU互联拓扑 NVLink / PCIe 链路 nccl-tests all_reduce / all_gather 总线带宽 (GB/s) ib_write_bw / iperf3 RDMA带宽 / TCP带宽 延迟 & 吞吐量 诊断流程:拓扑确认 → GPU通信测试 → 网络带宽验证 → 性能调优 每个环节都有对应的工具,缺一不可

4.1 nvidia-smi topo -m:先看清你的GPU怎么连的

很多人一上来就测带宽,结果发现性能不对。其实第一步应该是看拓扑。

nvidia-smi topo -m 会输出一张GPU互联关系表。你想想看,如果两张卡是通过PCIe桥接的,那带宽上限就是PCIe 4.0 x16的32GB/s。如果是NVLink直连,那就能跑到600GB/s以上。差距巨大。

我在项目中遇到过,有同事抱怨多卡训练慢,一查发现两张卡挂在不同的CPU socket上,走的是QPI/UPI链路。那带宽直接砍半。所以,先跑这个命令,心里有个数。

我的习惯:每次拿到新机器,第一件事就是 nvidia-smi topo -m 保存一份拓扑图。后续所有测试都基于这个拓扑来解读。

4.2 nccl-tests:GPU通信的硬核体检

拓扑看完了,接下来测GPU之间的实际通信带宽。这里我推荐 nccl-tests。

它本质上是NVIDIA官方提供的NCCL性能测试套件。能测 all_reduce、all_gather、reduce_scatter 等常见集合通信操作。

跑起来很简单:

# 编译
git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests
make

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

# 测试8张卡 all_gather
./build/all_gather_perf -b 8 -e 128M -f 2 -g 8

输出结果里,我最关注的是 总线带宽(Bus BW) 这一列。它代表实际的有效带宽。如果这个值远低于理论值,那就要排查了。

测试项 理论带宽 实测带宽(参考) 说明
NVLink 3.0 (A100) 600 GB/s ~550 GB/s 接近理论值,正常
NVLink 4.0 (H100) 900 GB/s ~830 GB/s 性能优秀
PCIe 4.0 x16 32 GB/s ~25 GB/s 有协议开销,正常
跨Socket PCIe 32 GB/s ~15 GB/s ⚠️ 可能瓶颈

注意:nccl-tests 测试的是GPU之间的通信,不经过CPU。如果发现带宽异常低,先检查NVLink是否启用,或者PCIe是否降速。

4.3 ib_write_bw:RDMA网络的真实力

多机训练时,节点之间走的是RDMA网络(比如InfiniBand或RoCE)。这时候 ib_write_bw 就派上用场了。

它属于 perftest 工具包,专门测试RDMA的读写带宽。我个人习惯,先测单条链路,再测多链路聚合。

基本用法:

# 服务端(节点A)
ib_write_bw -d mlx5_0 -p 18515

# 客户端(节点B)
ib_write_bw -d mlx5_0 -p 18515 192.168.1.1

输出结果里,看 BW average 这一行。如果是100Gbps的网卡,实测应该在95-98 Gbps左右。如果只有50-60 Gbps,那就有问题了。

我曾经遇到过,客户说带宽只有理论值的一半。排查了半天,发现是网卡固件版本不匹配。升级固件后,带宽直接翻倍。所以,别小看这个工具。

小技巧:测试时加上 -a 参数,可以自动跑多种消息大小,方便看不同粒度下的带宽表现。

4.4 iperf3:TCP/IP层面的兜底检查

最后,别忘了 iperf3。虽然现在很多场景走RDMA,但TCP/IP仍然是基础。控制面通信、数据落盘、日志传输,都离不开TCP。

而且,如果RDMA跑不起来,很多系统会回退到TCP。这时候TCP带宽就成了兜底。

用法很简单:

# 服务端
iperf3 -s -p 5201

# 客户端
iperf3 -c 192.168.1.1 -p 5201 -t 30 -P 4

-P 4 表示4个并行流。多流测试能更真实地反映多连接场景下的带宽。

我建议,TCP带宽至少要到网卡标称值的80%以上。比如25G网卡,实测应该到20-23 Gbps。如果低于这个值,检查一下网卡配置、驱动、或者交换机流控。

总结一下这四个工具的分工:

  • nvidia-smi topo -m:看拓扑,知道GPU怎么连的
  • nccl-tests:测GPU间通信,验证NVLink/PCIe性能
  • ib_write_bw:测RDMA网络,多机通信的核心
  • iperf3:测TCP网络,兜底检查

这四个工具串起来,就是一套完整的带宽测试工具链。从单机到多机,从GPU到网络,全覆盖。