3. 常用监控工具:nvidia-smi、gpustat、nvtop 的安装与使用

排查显存问题,你第一件事得知道“谁吃掉了我的显存”。
没有监控工具,就像修车不看仪表盘。我见过太多人,代码跑崩了只会拍大腿,其实看一眼工具就能找到元凶。

这一章,我们聊三个最趁手的工具。
它们分别是:nvidia-smi(官方标配)、gpustat(轻量增强版)、nvtop(交互式大杀器)。
我个人习惯这三样都装上——日常诊断用 gpustat,深挖细节上 nvtop,出问题时 nvidia-smi 兜底。

记住:监控工具不是用来“看着玩的”。每一次 OOM 之后,第一反应应该是打开它们,而不是盲目调 batch size。

3.1 nvidia-smi:官方标配,必须掌握

nvidia-smi 是 NVIDIA 驱动自带的命令行工具。
但凡装了 NVIDIA 驱动,它就在那里。不用额外装。

基础用法

直接打命令:

nvidia-smi

你会看到一张表格:GPU 型号、温度、利用率、显存总量、已用、剩余、进程列表。
嗯,信息很全,但乍一看有点密。我来拆开说。

关键字段解读

字段 含义 常见异常值
Volatile GPU-Util GPU 计算核心利用率(%) 一直接近 0%,可能是 CPU 瓶颈或没在跑
Memory-Usage 显存使用量 / 总容量 接近 100% 且报 OOM,大概率显存泄漏
Processes 占用 GPU 的进程 ID、类型、显存用量 PID 显示 No running processes found 但显存占用很高——这是僵尸进程

常用参数

我个人最常用这几个组合:

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

# 只输出简洁的GPU摘要,不显示进程
nvidia-smi --query-gpu=index,name,memory.used,memory.total --format=csv

# 显示所有GPU的详细进程信息(包括显存用量)
nvidia-smi pmon -s p -d 1

# 杀掉占用显存但已经无响应的进程(谨慎使用!)
# 先查PID,再用 kill -9
# 例如:kill -9 12345

我踩过的坑

我曾经有一次排查显存泄漏,盯了半天 nvidia-smi 发现显存一直在涨,但进程列表里啥都没有。
后来才意识到——程序异常退出后,显存没被释放。你想想看,这不是代码问题,是资源没清理。
从此我养成了一个习惯:每次跑实验前,先跑一遍 nvidia-smi 确认没有残留僵尸进程。

3.2 gpustat:更快、更友好

gpustat 本质上是对 nvidia-smi 的封装。
它把输出格式整理得更清爽,还加上了进程排序、颜色高亮。
说白了,就是让你一眼看到重点。

安装

pip install gpustat

使用

# 查看当前所有GPU状态
gpustat

# 持续监控,每2秒刷新一次(我最常用的姿势)
gpustat --watch --color

和 nvidia-smi 的区别

对比维度 nvidia-smi gpustat
安装 随驱动自带 需 pip 安装,依赖 nvidia-smi
输出格式 表格、全量信息 精简、带颜色、可排序
更新频率 通过 -l 参数 通过 --watch 参数
进程排序 默认按 PID 排序 按显存用量排序(高亮大用户)
适用场景 手边没有 Python 环境时 日常快速诊断

避坑指南

我曾经在服务器上用 gpustat 发现有一个进程占着 8GB 显存,但记不清是谁启动的了。
gpustat 直接显示了 PID 和用户,我顺藤摸瓜找到了那个人的实验脚本——他的 batch size 设成 512 了。
嗯,这种“小偷”一抓一个准。

建议:把 gpustat --watch --color 加到你的 shell 别名里。比如在 ~/.bashrc 中写:
alias gpuw='gpustat --watch --color'
以后打 gpuw 就能实时监控,省时间。

3.3 nvtop:交互式,像 top 一样用

nvtop 是 GPU 版的 htop/top。
它让你看到实时变化的曲线、进程列表、显存和计算核心的利用率。
说实话,我第一次用它时,感觉像从黑白电视换成了彩电。

安装

nvtop 不像前两个那么省心。有些发行版需要编译安装:

# Ubuntu / Debian
sudo apt install nvtop

# 从源码编译(推荐,版本最新)
git clone https://github.com/Syllo/nvtop.git
mkdir -p nvtop/build && cd nvtop/build
cmake ..
make
sudo make install

使用

直接运行:

nvtop

界面打开后,你会看到:
上半部分是折线图——显存用量、GPU 利用率、温度、功耗的实时曲线。
下半部分是进程列表——每个进程的 PID、用户、显存占用、GPU 利用率。

常用快捷键

键位 功能
q 退出
h 帮助
k 杀死选中的进程(慎用!)
↑/↓ 切换进程
F5 刷新
m 按显存用量排序(最常用!)

我推荐的使用场景

当你怀疑显存泄漏,用 nvidia-smi 要看很久才能发现趋势时,nvtop 的曲线图能让你立刻看到显存是不是在“匀速上涨”。
我记得有一次排查训练过程中的显存分配——每隔几步显存就涨 200MB,曲线斜率很稳。一眼就知道代码里有显存泄漏。
如果是间断性 OOM,也能从曲线上的“尖峰”看出是哪个操作导致的。

注意:nvtop 在有些老版本驱动下可能显示不了准确的进程信息。如果你发现进程列表是空的,但显存占用很高——还是先用 nvidia-smi 验证一下。不要全信一个工具。

3.4 知识结构图谱

下面这张图概括了三个工具的关系和使用逻辑:

显存监控工具选型 & 使用流程 出现 OOM / 显存高占用 nvidia-smi gpustat nvtop 基础诊断 查进程、杀僵尸 快速扫视 排序 + 颜色高亮 深度监控 实时曲线、趋势 定位到吃显存的进程

3.5 三选一?还是全都要?

我的建议是:都装上。
它们不冲突,场景互补。

  • 日常检查:gpustat —watch,看一眼就够
  • 深入分析:nvtop,打开实时曲线,盯几分钟
  • 应急兜底:nvidia-smi,任何机器都能用,不依赖 Python

你想想看,当你被 OOM 搞得焦头烂额时,一个命令就能看到是哪个进程吃了显存——这种感觉,就像是溺水时抓住了救生圈。

好了,工具装好、会用,下一步才谈得上排查。
记住:不要上来就改代码,先看看监控。