3、显存监控与Profiling工具:nvidia-smi、nvtop、PyTorch Profiler、Nsight Systems实战
显存监控,说白了就是给GPU做「体检」。我见过太多同学,模型跑崩了还不知道是显存炸了,还在那调学习率。嗯,今天咱们就把这几个趁手的工具捋一遍。
3.1 nvidia-smi:最基础的显存仪表盘
这个命令,每个搞GPU的人每天至少敲十遍。我个人习惯把它挂在终端的一个标签页里,实时盯着。
# 最常用的一行
nvidia-smi
# 只看显存,不刷屏
nvidia-smi --query-gpu=memory.used,memory.total --format=csv
# 每秒刷新一次
watch -n 1 nvidia-smi
输出里你会看到几列关键信息:
| 字段 | 含义 | 我关注的点 |
|---|---|---|
| Memory-Usage | 显存使用量/总量 | 如果超过90%,就要小心OOM了 |
| Volatile GPU-Util | GPU计算单元利用率 | 显存满了但利用率低,说明有瓶颈 |
| Processes | 占用GPU的进程列表 | 看有没有僵尸进程占着显存不放 |
3.2 nvtop:交互式显存监控
如果你觉得nvidia-smi太死板,试试nvtop。它就像Linux的htop,但专为GPU设计。
# 安装(Ubuntu)
sudo apt install nvtop
# 运行
nvtop
界面里你能看到:
- 每个GPU的显存使用曲线(历史趋势)
- 每个进程的显存占用明细
- GPU温度、风扇转速、功耗
我在项目中遇到过一个问题:两个进程同时跑,显存加起来没超,但第二个进程启动就OOM。用nvtop一看,第一个进程的显存碎片化严重,连续大块内存不够了。这玩意儿帮了大忙。
3.3 PyTorch Profiler:代码级别的显存分析
光看全局显存不够,你得知道哪行代码吃了显存。PyTorch自带的profiler就是干这个的。
import torch
from torch.profiler import profile, record_function, ProfilerActivity
with profile(
activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
record_shapes=True,
profile_memory=True, # 开启显存分析
) as prof:
with record_function("model_inference"):
output = model(input_tensor)
# 打印显存消耗排名
print(prof.key_averages().table(sort_by="self_cuda_memory_usage", row_limit=10))
输出会告诉你:
- 每个操作分配了多少显存
- 显存是在哪一步释放的
- 有没有显存泄漏的迹象
3.4 Nsight Systems:全系统视角的Profiling
这是NVIDIA的官方利器。它不光看显存,还能看CPU-GPU之间的数据传输、kernel执行时间、API调用开销。
# 命令行采集
nsys profile -o my_profile -t cuda,nvtx,osrt python train.py
# 打开GUI查看
nsys-ui my_profile.qdrep
在Nsight Systems的时间轴上,你会看到:
- CPU端的PyTorch操作(橙色条)
- GPU端的kernel执行(绿色条)
- 显存分配/释放事件(紫色标记)
- 数据传输(蓝色条)
我曾经优化一个模型,发现GPU利用率只有30%。用Nsight一看,原来是CPU预处理太慢,GPU一直在等数据。说白了,显存没炸,但数据管道堵了。加了个DataLoader的num_workers,利用率直接拉到90%。
3.5 实战:定位显存泄漏
显存泄漏是最头疼的问题。模型跑着跑着,显存一点点涨上去,最后OOM。我教你一套排查流程:
- 先确认是不是泄漏:用nvidia-smi watch模式,看显存是否持续增长不回落
- 定位泄漏点:在训练循环里加torch.cuda.memory_summary(),每100步打印一次
- 常见原因:
- loss.backward()后没清梯度
- 验证集eval时忘了torch.no_grad()
- DataLoader的pin_memory=True但没配合non_blocking
- 终极手段:用PyTorch Profiler的memory timeline,看哪个变量没释放
核心思路:显存监控不是事后诸葛亮,而是事前预防针。我建议你在训练脚本里加个显存告警,超过阈值自动发邮件或通知。
3.6 工具选择指南
| 场景 | 推荐工具 | 为什么 |
|---|---|---|
| 快速查看显存占用 | nvidia-smi | 零安装,一行命令 |
| 多进程显存监控 | nvtop | 交互式,能看到进程级占用 |
| 代码级显存优化 | PyTorch Profiler | 精确到每个操作的显存开销 |
| 全系统性能分析 | Nsight Systems | CPU-GPU联动,定位瓶颈 |
你想想看,这些工具就像医生的听诊器、CT机、核磁共振。nvidia-smi是听诊器,快速筛查;PyTorch Profiler是CT,看内部结构;Nsight Systems是核磁,看整体运行状态。别指望一个工具解决所有问题,组合使用才是王道。
最后说一句,别等到显存炸了才想起来用这些工具。我每次启动新实验,第一件事就是开nvidia-smi watch,第二件事是在代码里埋好profiler。养成习惯,能省你半天调试时间。