3、性能基准测试:GPU基准测试工具、网络基准测试、存储基准测试

各位同学,咱们今天聊点实在的——基准测试。说白了,就是给你的集群“体检”。

我见过太多团队,集群搭起来就跑,结果一上大模型训练,各种瓶颈全冒出来。GPU利用率上不去、网络卡成狗、存储读写慢得像蜗牛……嗯,这些坑我都踩过。所以,在正式调优之前,先把基准跑一遍,心里才有底。

3.1 GPU基准测试工具

GPU是集群的心脏。心脏跳得怎么样,得用工具测一测。

3.1.1 nvidia-smi:最基础的“听诊器”

nvidia-smi 是NVIDIA自带的命令行工具。我个人习惯,上机第一件事就是敲这个命令。它能告诉你:

  • GPU型号、驱动版本、CUDA版本
  • 当前功耗、温度、风扇转速
  • 显存使用量、GPU利用率
  • 进程占用情况

举个例子,看看你的GPU是不是在“摸鱼”:

nvidia-smi -l 1   # 每秒刷新一次,持续监控

如果GPU-Util一直低于80%,而显存快满了,那大概率是数据加载瓶颈。我曾经排查过一个案例,GPU利用率只有30%,一查发现是数据预处理线程卡住了——嗯,这就是基准测试的价值。

小技巧: 用 nvidia-smi dmon -s pucvmet 可以输出更详细的指标,包括PCIe带宽、电源管理状态等。适合做长时间记录。

3.1.2 DCGM:企业级监控利器

单机用 nvidia-smi 够了,但集群规模一上来,你就需要DCGM(Data Center GPU Manager)。

DCGM能做什么?

  • 健康检查:自动检测GPU是否异常(比如ECC错误、温度过高)
  • 性能指标:收集GPU利用率、内存带宽、NVLink流量等
  • 策略管理:设置功耗上限、时钟频率锁定

我最常用的是 dcgmi diag 做快速诊断:

dcgmi diag -r 1   # 运行级别1的快速诊断
dcgmi diag -r 3   # 运行级别3的全面诊断(耗时较长)
注意: DCGM的诊断测试会占用GPU资源,建议在集群空闲时运行。我曾经在生产环境跑了一次全面诊断,结果把正在训练的任务给挤掉了……从那以后,我都是先检查GPU占用再跑。

3.1.3 MLPerf:行业标准性能标杆

MLPerf是MLCommons组织推出的基准测试套件。它不是为了诊断问题,而是为了横向对比——你的集群跟别人的比,到底快多少?

MLPerf包含多个场景:

  • 训练(Training):图像分类、目标检测、自然语言处理等
  • 推理(Inference):在线推理、离线推理
  • 存储(Storage):针对AI工作负载的存储性能

我个人建议,如果你要采购新集群,或者优化现有集群,至少跑一次MLPerf Training。它能给出一个客观的“分数”,让你知道钱花得值不值。

举个例子,跑一个ResNet-50的训练基准:

# 下载MLPerf基准代码
git clone https://github.com/mlcommons/training.git
cd training/image_classification

# 运行基准(假设使用PyTorch)
python main.py --arch resnet50 --epochs 90 --batch-size 256
核心观点: MLPerf的结果受软件栈影响很大。同样的硬件,用不同的框架、不同的优化库,性能可能差30%以上。所以,跑基准时一定要记录软件版本。

3.2 网络基准测试

GPU算力再强,网络不行也是白搭。分布式训练中,梯度同步、参数传输都依赖网络。我见过最夸张的情况:8卡机器内部用NVLink,但跨机通信走的是千兆以太网——结果训练速度还不如单机4卡。

3.2.1 ib_write_bw:InfiniBand带宽测试

如果你的集群用了InfiniBand,ib_write_bw 是必测工具。它属于perftest工具集,专门测试RDMA(远程直接内存访问)的带宽和延迟。

基本用法:

# 在服务端启动
ib_write_bw -d mlx5_0 -p 18515

# 在客户端连接
ib_write_bw -d mlx5_0 -p 18515 192.168.1.100

输出结果会显示带宽(Gbps)和延迟(us)。

我记得有一次,客户说他们的HDR100(100Gbps)网络跑不满,一测只有40Gbps。排查了半天,发现是PCIe链路宽度不对——网卡插在了x8的槽位上。嗯,硬件细节真的很重要。

避坑指南: 测试时记得加 --run_infinitely 参数,持续跑几分钟,观察带宽是否稳定。有些网络在短时间测试中表现很好,但长时间高负载下会降速。

3.2.2 perftest:更全面的网络测试套件

perftest不仅包含 ib_write_bw,还有 ib_read_bw、ib_send_bw、ib_atomic_bw 等。为什么需要这么多?

  • 写操作(Write):模拟梯度推送,数据从本地写到远端
  • 读操作(Read):模拟参数拉取,数据从远端读到本地
  • 原子操作(Atomic):模拟全局归约(AllReduce)中的累加操作

我个人习惯,先跑 ib_write_bw 看带宽上限,再跑 ib_send_lat 看延迟:

ib_send_lat -d mlx5_0 -p 18515 192.168.1.100

如果延迟超过5微秒(对于InfiniBand),那就要检查网络配置了——比如是否启用了流控、MTU是否设置正确。

3.3 存储基准测试

存储是集群的“粮仓”。数据加载慢,GPU就得饿肚子。我见过一个团队,买了A100集群,结果训练时GPU利用率不到50%,一查发现是NFS存储太慢,数据读取成了瓶颈。

3.3.1 IOR:并行文件系统性能测试

IOR是Lustre、GPFS等并行文件系统的标准测试工具。它能模拟不同访问模式:

  • 顺序读写(Sequential)
  • 随机读写(Random)
  • 共享文件(Shared File) vs 独立文件(File Per Process)

基本用法:

# 测试顺序写,使用16个进程,每个写1GB
mpirun -np 16 ior -w -t 1m -b 1g -o /mnt/lustre/testfile

输出结果会显示吞吐量(MB/s)和IOPS。对于AI训练,我建议重点关注 大块顺序读 的性能——因为训练数据通常是大的TFRecord或HDF5文件。

关键指标: 对于现代GPU集群,存储带宽至少应该达到每GPU 1-2 GB/s。如果低于这个值,训练时大概率会出现数据加载瓶颈。

3.3.2 mdtest:元数据性能测试

mdtest专门测试文件系统的元数据性能——比如创建文件、删除文件、查看属性等。为什么重要?

你想想看,训练过程中,数据加载器会频繁打开、关闭文件。如果元数据性能差,光打开文件就能卡死你。

基本用法:

# 测试目录创建性能
mpirun -np 16 mdtest -n 10000 -d /mnt/lustre/testdir

输出结果会显示每秒操作数(ops/s)。对于AI场景,我建议关注 stat 和 open/close 的性能。

注意: mdtest会创建大量小文件,测试前确保磁盘空间足够。我曾经一次测试创建了100万个文件,结果把Lustre的inode用光了……嗯,从那以后我都是先算好空间再跑。

3.4 知识体系总览

下面这张图,是我自己总结的基准测试知识体系。你可以把它当作一个检查清单:

GPU集群性能基准测试知识体系 GPU基准测试 网络基准测试 存储基准测试 nvidia-smi:实时监控 DCGM:健康检查与诊断 MLPerf:行业标准标杆 ib_write_bw:带宽测试 perftest:延迟与原子操作 RDMA性能验证 IOR:吞吐量测试 mdtest:元数据性能 并行文件系统验证 测试目的 GPU:确认算力是否达标,排查硬件故障 网络:确认带宽和延迟是否满足分布式训练需求 存储:确认数据加载是否成为瓶颈

这张图把三大测试领域串起来了。GPU、网络、存储,三者缺一不可。我建议你每次搭建新集群,或者做重大升级时,都按这个清单跑一遍。别嫌麻烦——省下的排查时间,够你喝好几杯咖啡了。

好了,基准测试就聊到这儿。记住一句话:没有数据,就没有优化。先把基准跑出来,后面的事情才有方向。


可可精品资料库