nvidia-smi不能直接画显存曲线,因其仅提供静态快照,无法与训练步骤同步;而torch.cuda.memory_allocated()可获取细粒度、实时、严格对齐代码执行点的显存分配量,适合绘制成动态曲线。

为什么 nvidia-smi 不能直接画出训练过程中的显存曲线?
因为 nvidia-smi 是快照式命令,执行一次只返回当前时刻的显存占用(如 Memory-Usage 字段),而 PyTorch 训练是连续过程,GPU 显存会随 batch 加载、前向/反向传播、优化器更新等动态涨落。直接轮询 nvidia-smi 会有采样延迟、时间戳对齐困难、无法关联到具体 epoch/batch 的问题。
用 torch.cuda.memory_allocated() 获取训练中真实显存分配量
PyTorch 提供了运行时显存统计接口,比 nvidia-smi 更细粒度、更及时、且与代码执行点严格同步。关键区别:
-
torch.cuda.memory_allocated()返回当前已由 PyTorch 分配器“分配出去”的显存(单位字节),不含缓存碎片或 driver 占用,最贴近模型实际使用量 -
torch.cuda.memory_reserved()是 PyTorch 缓存的显存池大小(即cudaMalloc已申请但未释放的部分),通常远大于 allocated,不适合监控“瞬时压力” - 必须在目标 GPU 上调用(如多卡时指定
device=torch.device('cuda:1')),否则默认返回当前 default device
示例:在训练 loop 中插入
import torch
...
for epoch in range(num_epochs):
for batch in dataloader:
optimizer.zero_grad()
loss = model(batch).loss
loss.backward()
optimizer.step()
if batch_idx % 10 == 0:
mem_mb = torch.cuda.memory_allocated() / 1024 / 1024
print(f"Epoch {epoch}, Batch {batch_idx}: {mem_mb:.1f} MB")
如何把显存数据实时绘制成曲线?
不需要开新进程或依赖 nvidia-smi,直接用 Python 内存数据 + 轻量绘图即可。推荐两种方式:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 训练中实时刷新:用
matplotlib.pyplot.ion()开启交互模式,每 N 个 batch 更新一次折线图,避免阻塞训练;注意频繁绘图会影响性能,建议每 50–100 batch 刷新一次 - 训练后回放分析:把
mem_mb和对应step存入 list 或 CSV,训练结束后用plt.plot(steps, mems)绘图,更稳定、支持导出 - 若用 TensorBoard,可调用
tensorboardX.SummaryWriter.add_scalar('gpu_mem_mb', mem_mb, step),自动聚合并可视化
注意:torch.cuda.memory_allocated() 在 .backward() 后达到峰值,optimizer.step() 后可能不立即下降(因梯度 tensor 仍被引用),需确保变量作用域结束或手动 del loss, outputs 才能触发释放。
为什么有时曲线看起来“不平滑”甚至突降?
这不是监控误差,而是 PyTorch CUDA 缓存机制的真实表现:
- 显存不会在 tensor
del后立刻归还给系统,而是留在 PyTorch 缓存池中供下次分配复用,所以memory_allocated()可能突然回落(缓存池收缩)或阶梯上升(缓存池扩容) - 启用
torch.backends.cudnn.benchmark = True时,首次运行卷积会尝试多种算法并缓存最优配置,导致初始几轮显存波动剧烈 - 混合精度训练(
torch.cuda.amp.autocast)会额外引入 scale state、grad scaler 等小对象,造成高频小幅抖动
真正值得关注的是:同一 batch size 下,连续 epoch 的 peak memory 是否稳定上升——这往往意味着 tensor 引用泄漏(比如把中间结果 append 到全局 list)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










