torch.cuda.memory_summary()打印PyTorch显存分配全貌,含allocated、reserved等细节,不返回值;需GPU可用且仅对默认device生效,abbreviated=True可压缩输出。

直接看显存占用用 torch.cuda.memory_summary()
这个函数不是返回一个数字,而是打印一段结构化文本,告诉你当前 GPU 上内存分配的全貌:已分配、保留、缓存、碎片情况,甚至每个 tensor 的来源(比如来自哪个模块或哪行代码)。它不返回值,调用即输出,适合调试时快速定位显存大户。
- 必须在 GPU 可用时调用,否则报错
AssertionError: CUDA is not available - 只对当前默认 device 生效(
torch.cuda.current_device()),多卡需先torch.cuda.set_device(n) - 输出里
allocated是你代码真正“持有”的显存(tensor.data 占用),reserved是 PyTorch 缓存的显存池(可能远大于 allocated),别误以为 reserved 就是“被占满” - 加参数
abbreviated=True可压缩输出长度,适合 CI 或日志中快速扫一眼
torch.cuda.memory_allocated() 和 torch.cuda.max_memory_allocated() 才返回具体数值
如果你要写监控逻辑、打点告警或做前后对比(比如测某个模型前后的显存差),得用这两个函数。它们返回字节数,可直接参与计算。
-
torch.cuda.memory_allocated()返回当前已分配的显存(单位 byte),常用写法:round(torch.cuda.memory_allocated() / 1024**3, 2)换算成 GB -
torch.cuda.max_memory_allocated()返回自程序启动以来的历史峰值,调用后不会自动清零;如需重置峰值,用torch.cuda.reset_max_memory_allocated() - 注意:这些函数返回的是「PyTorch allocator 管理的」显存,不包括 CUDA context、driver 开销等底层占用,所以和
nvidia-smi显示的Memory-Usage通常不一致——后者更大
为什么 nvidia-smi 和 memory_summary() 显存数值对不上
这是最常让人困惑的点。根本原因是二者统计口径完全不同:
-
nvidia-smi显示的是 GPU 显存的物理占用总量,含 PyTorch allocator、CUDA driver、其他进程(如 X server)、未释放的 context 等 -
torch.cuda.memory_summary()只反映 PyTorch 自己内存管理器的状态,且reserved部分会复用,不会立刻还给系统 - 典型现象:模型跑完,
nvidia-smi还显示 5GB,但memory_summary()里allocated是 0 ——说明 PyTorch 把显存还回了 reserve pool,但没还给 driver - 真要彻底释放给系统?只能退出 Python 进程,或用
torch.cuda.empty_cache()清空 reserve pool(但 driver 层仍可能不释放)
调试显存泄漏时,别只盯着 memory_summary() 打印结果
它能帮你看到“谁占得多”,但看不出“为什么没释放”。常见陷阱是 tensor 意外留在 global scope、闭包里、或 logging/print 中隐式保留引用。
- 加一句
torch.cuda.memory_summary(device=None, abbreviated=False)在可疑位置前后各打一次,重点关注allocated增量和 “Objects” 表格里的 tensor 数量变化 - 如果发现
allocated持续上涨但 tensor 没明显增加,大概率是 autograd graph 没断开(漏了.detach()或with torch.no_grad():) - 用
gc.collect()+torch.cuda.empty_cache()组合强制触发清理,再对比 —— 能缓解但不能根治泄漏,只是帮你确认是否是 Python 引用问题
memory_summary() 只暴露最上层的一小块视图。


















