3. 显存监控工具

做压测这么多年,我见过太多人一上来就开跑,结果显存爆了都不知道怎么查。说实话,显存监控这事,比你想象的重要得多。你想想看,模型推理时显存突然飙到 23.8GB,你以为是正常波动,其实是内存泄漏的前兆。今天我就把这三件趁手的兵器给你讲透。

3.1 nvidia-smi:最基础的显存侦察兵

nvidia-smi 是 NVIDIA 官方自带的工具,装完驱动就有。我个人习惯,压测开始前先跑一遍 nvidia-smi -l 1,每秒刷新一次,心里有个底。

常用参数速查

参数 作用 我的用法
-l 秒数 设置刷新间隔 -l 2 两秒一刷,不占资源
--query-gpu=... 查询指定字段 写脚本抓数据时必用
--format=csv 输出为 CSV 配合 grep/awk 做自动化
-i GPU编号 指定某张卡 多卡环境,我只盯 0 号卡

核心字段解读

  • Memory-Usage:显存使用量,单位 MiB。注意看的是 Used 不是 Free
  • Volatile GPU-Util:GPU 利用率百分比。我遇到过利用率 100% 但显存没满的情况,那是计算瓶颈
  • Temp:温度。超过 85°C 就要警惕了,我曾经因为散热问题导致压测结果忽高忽低

我的小技巧

用 watch -n 1 nvidia-smi 替代 -l 参数,可以同时看到历史变化。嗯,这个习惯我用了五年。

实战:抓取显存峰值

# 每秒记录显存使用,持续 10 分钟
for i in $(seq 1 600); do
  nvidia-smi --query-gpu=memory.used --format=csv,noheader >> mem_log.csv
  sleep 1
done

# 找出最大值
sort -n mem_log.csv | tail -1

这段脚本我每次压测都会跑。有一次线上服务半夜挂了,第二天查日志,发现显存在凌晨 3 点突然从 12GB 跳到 24GB,然后 OOM 了。没有这个日志,你根本不知道问题出在哪。

3.2 nvtop:可视化显存监控

nvidia-smi 虽然好用,但信息太散。nvtop 就像 GPU 版的 htop,一眼能看到所有进程的显存占用。我第一次用的时候,心想:这才是人看的工具啊。

安装方式

# Ubuntu / Debian
sudo apt install nvtop

# CentOS / RHEL
sudo yum install nvtop

# 或者从源码编译
git clone https://github.com/Syllo/nvtop.git
mkdir build && cd build
cmake ..
make
sudo make install

注意

nvtop 依赖 libdrm 和 libncurses。我在 CentOS 7 上踩过坑,编译时缺依赖,折腾了半小时。建议直接用包管理器装。

界面解读

启动后你会看到三个区域:

  • 顶部:全局 GPU 利用率、显存总量、温度、风扇转速
  • 中间:每个 GPU 的实时曲线图,按 F2 可以切换指标
  • 底部:每个进程的 PID、用户、显存占用、GPU 利用率

我最常用的是按 M 键按显存排序。压测时盯着底部列表,哪个进程突然暴涨,一眼就能揪出来。

避坑指南

我曾经在压测时发现一个进程显存持续增长,但 nvidia-smi 看不出来,因为总显存没变。用 nvtop 按进程排序才发现,有个子进程在偷偷申请显存,每次推理完不释放。嗯,这就是内存泄漏的典型特征。

3.3 dcgm-exporter:企业级监控部署

如果你要监控几十台机器的 GPU,nvidia-smi 和 nvtop 就不够用了。dcgm-exporter 是 NVIDIA 官方出的 Prometheus exporter,专门干这个的。

部署步骤

# 1. 拉取镜像
docker pull nvidia/dcgm-exporter:latest

# 2. 启动容器
docker run -d \
  --name dcgm-exporter \
  --gpus all \
  -p 9400:9400 \
  nvidia/dcgm-exporter:latest

# 3. 验证
curl http://localhost:9400/metrics | grep -i "gpu"

部署完以后,Prometheus 配置里加上这个 target,Grafana 导入官方仪表盘,就能看到完整的 GPU 监控面板了。

关键指标说明

指标名 含义 告警阈值建议
DCGM_FI_DEV_MEM_COPY_UTIL 显存带宽利用率 > 80% 持续 5 分钟
DCGM_FI_DEV_GPU_UTIL GPU 计算单元利用率 > 95% 持续 10 分钟
DCGM_FI_DEV_FB_USED 显存已用量 > 90% 立即告警
DCGM_FI_DEV_TEMPERATURE GPU 温度 > 85°C 告警

我的部署经验

dcgm-exporter 默认暴露的指标有 100 多个,但大部分你用不上。我建议在 Prometheus 端做一次 relabel,只保留上面表格里的 4 个核心指标,能省不少存储空间。曾经有个项目,一个月存了 200GB 的 GPU 指标数据,90% 都是没用的。

3.4 三款工具对比

工具 适用场景 优点 缺点
nvidia-smi 单机快速排查 零依赖,随装随用 信息分散,不适合长期监控
nvtop 实时可视化监控 进程级显存查看,直观 不支持远程,无历史数据
dcgm-exporter 集群监控、告警 指标丰富,可集成 Prometheus 部署稍复杂,需要维护

我个人习惯是:日常调试用 nvtop,压测时后台跑 nvidia-smi 记录日志,生产环境上 dcgm-exporter + Grafana 面板。三件套配合使用,基本没有抓不到的显存问题。

最后说一句

工具再好,也得会用。我见过有人把 dcgm-exporter 部署好了,但告警阈值设成 99%,结果显存爆了都没收到通知。记住:监控的目的是发现问题,不是证明系统没问题。

显存监控工具选型决策图 显存监控需求 单机场景 集群场景 快速排查 nvidia-smi 实时可视化 nvtop 企业级监控 dcgm-exporter 选择建议:日常调试用 nvtop,压测用 nvidia-smi 记录,生产环境上 dcgm-exporter 临时 交互 生产