3、基准测试工具:nvidia-smi深度使用、dcgmproftester、NVIDIA SMI Query、GPU Burn压力测试
说到GPU集群压测,工具选对了,事半功倍。我这些年踩过不少坑,今天就把几个核心工具掰开揉碎讲清楚。
3.1 nvidia-smi深度使用:不只是看一眼
很多人对nvidia-smi的印象就是敲个命令看看显存占用。其实它远不止这么简单。我个人习惯把它当作第一道防线——先摸清GPU的底细。
3.1.1 基础查询与监控
# 最常用的,显示所有GPU状态
nvidia-smi
# 只看关键指标,每秒刷新一次
nvidia-smi -l 1
# 查询GPU UUID和PCIe信息
nvidia-smi -q -i 0 | grep -i uuid
嗯,这里要注意:-l参数后面跟的是刷新间隔(秒)。我在项目中遇到过,有人用-l 0.1想刷快一点,结果把监控日志撑爆了。建议生产环境用-l 5以上。
3.1.2 查询模式(Query Mode)
这才是nvidia-smi的精髓。说白了,-q参数能让你看到GPU的每一个毛孔。
# 完整查询所有GPU信息
nvidia-smi -q
# 只查某个GPU的时钟和温度
nvidia-smi -q -i 0 -d CLOCK,TEMPERATURE
# 输出为可解析格式(脚本里用这个)
nvidia-smi -q -x
关键指标解读:
- GPU-Util:不是显存占用率,是计算单元繁忙程度。我见过有人把90%显存占用当成GPU满载,其实计算单元才用了20%。
- Memory-Usage:显存占用。压测时如果这个值一直上不去,说明数据加载有瓶颈。
- Volatile GPU-Util:瞬时利用率。波动大不一定有问题,但持续低于50%就要警惕了。
3.1.3 持久化模式与进程管理
我曾经在调试一个训练任务时,发现GPU利用率忽高忽低。查了半天,原来是没开持久化模式。
# 开启持久化模式(推荐)
nvidia-smi -pm 1
# 查看当前运行的GPU进程
nvidia-smi pmon -c 1
# 杀掉占用GPU的僵尸进程
nvidia-smi --gpu-reset
我的习惯:每次压测前,先跑一遍nvidia-smi -pm 1,再执行nvidia-smi pmon确认没有残留进程。这一步能省掉后面很多排查时间。
3.2 dcgmproftester:专业级压测工具
DCGM(Data Center GPU Manager)是NVIDIA官方出品的工具集。dcgmproftester是其中的压测模块。说实话,这个工具比很多第三方压测脚本靠谱得多。
3.2.1 安装与基本用法
# 安装DCGM(Ubuntu示例)
sudo apt-get install datacenter-gpu-manager
# 运行基础压测(测试所有GPU,持续60秒)
dcgmproftester --no-dcgm-validation -d 60 -t 1
# 指定测试类型和GPU
dcgmproftester -i 0,1 -t 4 -d 120
-t参数指定测试类型,我整理了一张表:
| 测试类型 | 编号 | 说明 |
|---|---|---|
| 带宽测试 | 1 | 测显存带宽,看HBM是否达标 |
| 计算测试 | 4 | FP32矩阵运算,压计算单元 |
| 混合测试 | 7 | 计算+带宽同时压,模拟真实负载 |
| PCIe测试 | 9 | 测GPU与CPU之间的数据传输 |
3.2.2 实战:压测脚本模板
我在实际项目中,一般会写一个循环脚本,把几种测试类型都跑一遍:
#!/bin/bash
# 压测脚本:覆盖主要场景
for test_id in 1 4 7 9; do
echo "Running test type $test_id..."
dcgmproftester --no-dcgm-validation -d 300 -t $test_id
sleep 10 # 让GPU冷却一下
done
echo "All tests completed."
注意:测试类型7(混合测试)对GPU压力最大。我曾经在A100上跑这个测试,温度直接飙到85度。建议先跑类型1和4,确认散热没问题再上混合测试。
3.3 NVIDIA SMI Query:脚本化监控利器
nvidia-smi的--query系列参数,说白了就是给脚本准备的。你想想看,如果每次都要人工盯着屏幕看,那还叫什么自动化压测?
3.3.1 查询格式与字段
# 查询指定字段,输出为CSV格式
nvidia-smi --query-gpu=index,timestamp,utilization.gpu,memory.used,temperature.gpu --format=csv
# 输出示例:
# index, timestamp, utilization.gpu [%], memory.used [MiB], temperature.gpu [C]
# 0, 2024/01/15 10:30:00, 95, 32456, 78
常用的查询字段:
utilization.gpu:GPU计算单元利用率utilization.memory:显存带宽利用率memory.total/memory.used:显存总量与已用temperature.gpu:GPU核心温度power.draw:当前功耗(瓦)clocks.current.sm:SM时钟频率
3.3.2 集成到压测流程
我习惯把SMI Query和压测工具配合使用:
# 后台启动监控,每2秒记录一次
nvidia-smi --query-gpu=index,utilization.gpu,memory.used,temperature.gpu,power.draw \
--format=csv -l 2 > gpu_monitor.csv &
# 然后启动压测
dcgmproftester --no-dcgm-validation -d 300 -t 7
# 压测结束后,停止监控
kill %1
小技巧:压测结束后,用Python或Excel打开CSV文件,画一条时间序列图。你能直观看到GPU利用率是否平稳、有没有掉频、温度曲线是否正常。我靠这个发现过好几次散热硅脂干了的故障。
3.4 GPU Burn:极限压力测试
GPU Burn是一个开源工具,专门用来把GPU跑到极限。说白了,它就是让GPU满负荷运转,看会不会崩溃、降频或者报错。
3.4.1 安装与编译
# 从GitHub克隆
git clone https://github.com/wilicc/gpu-burn
cd gpu-burn
# 编译(需要CUDA Toolkit)
make
# 运行基础测试(默认60秒)
./gpu_burn
3.4.2 参数详解
# 指定测试时长(秒)
./gpu_burn 120
# 指定使用哪些GPU
./gpu_burn -d 0,1,2 300
# 显示详细输出
./gpu_burn -m 60
GPU Burn的输出很直观:
GPU 0: 100.0% (78 C, 350 W)
GPU 1: 100.0% (82 C, 348 W)
GPU 2: 99.8% (76 C, 352 W)
看到这个输出,你就知道GPU是不是真的跑满了。如果某个GPU利用率不到99%,那肯定有问题。
3.4.3 实战:集群压测方案
我在一个8卡A100集群上做过压测,方案是这样的:
- 先跑GPU Burn 30分钟:看有没有GPU掉线或报错
- 同时用nvidia-smi监控:记录温度、功耗、时钟频率
- 检查结果:所有GPU利用率>99%,温度不超过85度,功耗达到TDP
警告:GPU Burn会让显卡满负荷运转。如果散热不好,温度可能冲到90度以上。我曾经在机房测试时,有个GPU风扇坏了,温度直接飙到95度,吓得我赶紧停了。建议第一次跑时人在现场盯着。
3.5 知识体系总览
下面这张图,是我对本章工具链的理解:
这四个工具各司其职:nvidia-smi做日常巡检,dcgmproftester做专业压测,SMI Query做自动化监控,GPU Burn做极限测试。结合起来,就能把GPU集群的底细摸得清清楚楚。
好了,这一章的内容就到这里。工具是死的,用法是活的。希望你能在实际项目中找到自己的节奏。