2. 显存溢出排查工具:nvidia-smi命令详解、gpustat工具使用、nvtop交互式监控

说到显存溢出排查,我第一个想到的就是 nvidia-smi。这玩意儿就像医生的听诊器,是咱们GPU工程师最基础的诊断工具。不过很多人只会用它看一眼显存占用,其实它藏着不少好东西。

2.1 nvidia-smi 命令详解

先说说最常用的几个参数。我个人习惯先跑个 nvidia-smi 看看全局状态:

# 最基础的查看命令
nvidia-smi

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

# 只看某个GPU(比如第0块卡)
nvidia-smi -i 0

# 显示更详细的GPU信息
nvidia-smi -q

输出里最重要的几个指标,我列个表给你看:

指标 含义 正常范围 危险信号
Memory-Usage 显存使用量/总量 < 80% > 95% 且持续增长
Volatile GPU-Util GPU计算单元利用率 80%-100% < 50% 但显存爆满
Temp GPU温度 < 80°C > 85°C 可能降频
Power 功耗 接近TDP 远低于TDP但任务卡住

核心经验:显存溢出往往不是突然发生的。我遇到过很多次,显存占用从70%慢慢爬到95%,然后程序就崩了。所以别只看最后一次快照,要看趋势。

再深入一点,nvidia-smi -q 能挖出更多细节:

# 查看进程级别的显存占用
nvidia-smi -q -d MEMORY

# 只看某个进程的显存使用
nvidia-smi --query-compute-apps=pid,used_memory --format=csv

# 输出到文件,方便后续分析
nvidia-smi --query-gpu=index,timestamp,memory.used,memory.total --format=csv -l 5 > gpu_monitor.csv

嗯,这里要注意一点。很多人以为 nvidia-smi 显示的显存占用就是模型实际用的。其实不是。它显示的是进程申请的显存,包括缓存和碎片。我曾经调试一个模型,nvidia-smi 显示用了11GB,但模型本身只占8GB,剩下3GB是PyTorch的缓存。

小技巧:用 nvidia-smi -l 1 持续监控时,可以配合 grep 过滤关键信息。比如 nvidia-smi -l 1 | grep -A 2 "MiB" 只看显存变化。

2.2 gpustat 工具使用

gpustat 是我后来才发现的工具。说实话,它比 nvidia-smi 更直观。安装很简单:

# 安装gpustat
pip install gpustat

# 基本使用
gpustat

# 持续监控,每2秒刷新
watch -n 2 gpustat

# 显示更详细的信息
gpustat --show-cmd --show-user

为什么我喜欢用 gpustat?你看它的输出:

GPU0 [Tesla V100] | 32°C | 78% | 11234 / 16160 MB | user1(pid:12345) python train.py

一行就把温度、利用率、显存、进程名全展示了。而且它用颜色标记状态——绿色正常,黄色警告,红色危险。一眼就能看出问题。

我记得有一次排查线上问题,服务器上跑了8块卡。用 nvidia-smi 要翻好几页,用 gpustat 一行就看清了哪块卡显存快爆了。

避坑指南:我曾经遇到 gpustat 显示显存占用为0,但程序明明在跑。后来发现是权限问题——普通用户看不到其他用户的进程。加上 sudo 就好了。

2.3 nvtop 交互式监控

如果说 nvidia-smi 是听诊器,gpustat 是血压计,那 nvtop 就是心电监护仪。它提供了实时的、交互式的GPU监控界面。

安装方式:

# Ubuntu/Debian
sudo apt install nvtop

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

启动后,你会看到一个类似 htop 的界面。上半部分显示每个GPU的实时状态,下半部分显示进程列表。你可以用键盘操作:

  • 上下箭头:切换选中的GPU
  • F5:按显存使用排序
  • F6:按GPU利用率排序
  • q:退出

我最喜欢 nvtop 的一点是,它能同时显示多个GPU的历史曲线。你想想看,当模型训练到一半显存突然飙升,你能看到过去几分钟的趋势图,立马就能判断是正常波动还是泄漏。

实战场景:有一次我调试一个分布式训练任务,8块卡的显存占用很不均衡。用 nvtop 一看,发现是数据加载不均匀导致的。调整了 DataLoader 的 sampler 后,显存分布就均匀了。

2.4 三个工具的对比与选择

这三个工具各有千秋,我总结一下:

工具 优势 劣势 适用场景
nvidia-smi 系统自带,信息最全 输出冗长,不够直观 快速查看、脚本监控
gpustat 简洁美观,一目了然 功能较少,无历史曲线 日常巡检、多卡监控
nvtop 交互式,有历史趋势 需要安装,占用资源稍多 深度排查、性能调优

我个人习惯是:日常用 gpustat 扫一眼,发现问题用 nvidia-smi -q 深挖,复杂场景开 nvtop 盯着看。

终极技巧:写个脚本,把 nvidia-smi 的输出定时记录到文件。这样即使程序崩溃了,你还能回头看当时的显存变化曲线。我靠这招抓过不少内存泄漏的bug。

显存溢出排查工具知识体系 显存溢出排查工具 nvidia-smi 系统自带,信息最全 适合脚本监控 支持CSV输出 gpustat 简洁美观,一目了然 颜色标记状态 适合日常巡检 nvtop 交互式监控 历史趋势曲线 适合深度排查 排查流程建议 日常巡检 → gpustat 发现问题 → nvidia-smi -q 深挖 复杂场景 → nvtop 持续监控

好了,这三个工具够你应付大部分显存排查场景了。记住一点:工具只是辅助,关键是要理解显存是怎么分配的、模型是怎么跑的。下次遇到显存溢出,别慌,先跑个 gpustat 看看,八成能找到线索。