首页/AI/大模型部署与运维速查/PyTorch 显存观测:allocated 与 reserved
推理环境与 GPU50 条

PyTorch 显存观测:allocated 与 reserved

torch.cuda 把显存分成 allocated(张量实际占用)与 reserved(缓存分配器持有总量):排查显存问题先看这两个数,再区分模型占用、缓存保留与被占用的差异。

两个数、一个峰值

PyTorch 把显存分成两部分:已分配(张量实际占用)与已保留(缓存分配器从驱动拿到的总量)。保留高于分配是设计行为,不是泄漏。排查显存问题时先看这两个数,再加上峰值统计,就能区分是模型本身占得多、缓存保留得多,还是长跑过程中真的在涨。

常用观测接口

常用观测接口
import torch
print(torch.cuda.memory_allocated() / 2**30)      # 张量占用 GiB
print(torch.cuda.memory_reserved() / 2**30)       # 缓存池保留 GiB
print(torch.cuda.max_memory_allocated() / 2**30)  # 峰值(自上次重置)
print(torch.cuda.memory_summary())                # 分配器分块明细
# 压测前重置峰值统计,能让峰值只反映本轮负载
torch.cuda.reset_peak_memory_stats()

观测项读法

观测项含义判读方式
已分配当前张量实际占用与模型规模对照,明显超出要查是否有多余副本
已保留分配器持有的总量高于已分配属正常,差额是缓存
分配峰值本轮负载的最高水位用于容量规划与排查偶发溢出
分块明细按大小段统计的分配情况碎片严重时小段块数量异常
设备总占用包含框架与上下文开销与保留量的差额在系统工具里核对

典型使用场景

  • 压测基线:记录峰值占用,作为容量与并发评估的输入
  • 排查显存不足:先区分是分配量高,还是缓存保留后没有释放
  • 长跑观测:定时采样分配量,判断是否存在逐步上涨
  • 调参验证:改批大小或上下文后对比峰值变化,确认收益
  • 多实例共卡:核算各实例的保留量之和是否超过卡容量
主动归还缓存可以释放保留量,但频繁调用会带来反复申请的额外开销:只在明确需要腾出连续空间时使用。
把保留量当成泄漏是常见误判:判断泄漏要看分配量是否随请求持续增长且不回落,同时比对多次采样而非单点数据。

易错点

  • 把保留量当泄漏:缓存保留是分配器的正常行为,据此处置会白折腾
  • 不看峰值只看当前值:溢出往往发生在峰值时刻,当前值正常不代表安全
  • 压测前不重置峰值:峰值统计混入历史负载,读数失去意义
  • 只看框架内部读数:与系统工具显示的占用不一致时,差额来自框架与上下文开销,要两边对照
  • 单点采样就下结论:显存随请求波动,至少观察一个完整负载周期

数据来源与参考

  • PyTorch 官方文档:torch.cuda 显存管理(pytorch.org/docs)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌