2、显存监控工具:nvidia-smi详解、nvtop使用技巧、PyTorch内存跟踪器

显存监控这事儿,说白了就是给GPU做「体检」。我见过太多同学模型跑崩了还不知道问题出在哪,一查显存早就爆了。今天咱们就把这三把刀磨快——nvidia-smi、nvtop、PyTorch内存跟踪器,一个一个说清楚。

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

nvidia-smi是NVIDIA官方自带的工具,装驱动就有。我个人习惯把它当作第一道防线,跑模型前先看一眼心里有底。

2.1.1 基础用法

# 最简模式
nvidia-smi

# 持续刷新(我常用这个)
watch -n 1 nvidia-smi

# 只看显存和利用率
nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu --format=csv

输出里最关键的是这几列:

字段 含义 我的经验
Memory-Usage 显存使用量/总量 超过80%就要警惕了
Volatile GPU-Util GPU计算单元利用率 低利用率+高显存=数据加载瓶颈
Temp GPU温度 超过85°C会降频,显存占用可能异常
注意:nvidia-smi显示的显存占用是「已分配」而非「已使用」。PyTorch有缓存机制,显存不会立刻释放。我曾经被这个坑过——模型都删了,显存还占着,以为是内存泄漏。

2.1.2 进阶技巧

我习惯用这个命令来定位显存泄漏:

# 每0.5秒记录一次显存变化
nvidia-smi --query-gpu=memory.used --format=csv -l 0.5 > mem_log.csv

然后画个曲线图,一眼就能看出显存是不是在持续增长。嗯,这招帮我抓过不少bug。

2.2 nvtop:可视化显存监控利器

nvtop是第三方工具,但比nvidia-smi直观太多了。它就像GPU版的htop,实时显示每个进程的显存占用。

2.2.1 安装与启动

# Ubuntu
sudo apt install nvtop

# 启动
nvtop

界面分三块:

  • 顶部:GPU整体负载、温度、风扇转速
  • 中间:每个进程的显存占用、GPU利用率
  • 底部:历史曲线(按F2切换)
我的小技巧:按F6可以只看某个进程。我调试大模型时,经常同时开多个实验,用这个功能一眼就能看出哪个进程在「吃显存」。

2.2.2 实战场景

有一次我跑LLM推理,显存莫名其妙涨到24GB。用nvtop一看,发现有个后台进程偷偷加载了另一个模型。你想想看,这种问题用nvidia-smi很难发现,但nvtop的进程视图一目了然。

2.3 PyTorch内存跟踪器:代码级别的显存侦探

工具再强,也强不过代码层面的精确跟踪。PyTorch自带的内存跟踪器,是我调试显存问题的最后一道防线。

2.3.1 torch.cuda.memory_summary()

这个函数能打印出非常详细的显存分配报告:

import torch

model = MyModel().cuda()
input_tensor = torch.randn(1, 3, 224, 224).cuda()
output = model(input_tensor)

# 打印显存快照
print(torch.cuda.memory_summary())

输出里我最关注的是这几项:

  • Allocated memory:实际使用的显存
  • Cached memory:PyTorch缓存占用的显存
  • Peak memory:历史峰值显存

核心逻辑:Allocated + Cached = 你在nvidia-smi里看到的总显存。如果Cached占比过高,说明缓存没及时清理。

2.3.2 torch.cuda.memory_stats()

想要更细粒度的数据?用这个:

stats = torch.cuda.memory_stats()
print(f"当前分配: {stats['allocated_bytes.all.current'] / 1024**3:.2f} GB")
print(f"峰值分配: {stats['allocated_bytes.all.peak'] / 1024**3:.2f} GB")
print(f"缓存大小: {stats['reserved_bytes.all.current'] / 1024**3:.2f} GB")

我一般在训练循环里每隔100步打印一次,看显存是不是在稳步增长。如果峰值和当前值差距越来越大,那八成有内存泄漏。

2.3.3 显存快照与可视化

PyTorch 1.8+支持生成显存快照,用Chrome的tracing工具查看:

# 记录快照
torch.cuda.memory._record_memory_history()
# ... 跑你的代码 ...
torch.cuda.memory._dump_snapshot("snapshot.pickle")

# 然后上传到 https://pytorch.org/memory_viz 查看

这个工具能显示每个张量的生命周期。我曾经用它发现一个巨大的中间变量没被释放——原来是我忘了把某个计算结果从计算图中detach出来。

注意:记录快照会带来性能开销,生产环境慎用。我一般只在调试阶段开,上线前关掉。

2.4 三件套配合使用指南

这三个工具各有侧重,我一般这样搭配:

场景 首选工具 辅助工具
快速查看显存占用 nvidia-smi nvtop
定位哪个进程在吃显存 nvtop nvidia-smi
代码级显存泄漏排查 PyTorch内存跟踪器 nvtop
长期监控与告警 nvidia-smi + 脚本 PyTorch memory_stats
我的建议:日常开发用nvtop就够了,出问题时再用PyTorch跟踪器深挖。别一上来就开快照,那玩意儿数据量太大,容易把自己搞晕。
显存监控工具知识体系 nvidia-smi nvtop PyTorch内存跟踪器 基础监控 CSV导出 持续刷新 进程视图 历史曲线 进程过滤 memory_summary memory_stats 显存快照 三件套配合使用,显存问题无处遁形

好了,这三个工具够你应付90%的显存问题了。记住一个原则:先粗后细,先看整体再查局部。别一上来就开快照,那玩意儿数据量太大,容易把自己搞晕。

想要更多资料,联系可可