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会降频,显存占用可能异常 |
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切换)
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 |
好了,这三个工具够你应付90%的显存问题了。记住一个原则:先粗后细,先看整体再查局部。别一上来就开快照,那玩意儿数据量太大,容易把自己搞晕。
想要更多资料,联系可可