两个数、一个峰值
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()观测项读法
| 观测项 | 含义 | 判读方式 |
|---|---|---|
| 已分配 | 当前张量实际占用 | 与模型规模对照,明显超出要查是否有多余副本 |
| 已保留 | 分配器持有的总量 | 高于已分配属正常,差额是缓存 |
| 分配峰值 | 本轮负载的最高水位 | 用于容量规划与排查偶发溢出 |
| 分块明细 | 按大小段统计的分配情况 | 碎片严重时小段块数量异常 |
| 设备总占用 | 包含框架与上下文开销 | 与保留量的差额在系统工具里核对 |
典型使用场景
- 压测基线:记录峰值占用,作为容量与并发评估的输入
- 排查显存不足:先区分是分配量高,还是缓存保留后没有释放
- 长跑观测:定时采样分配量,判断是否存在逐步上涨
- 调参验证:改批大小或上下文后对比峰值变化,确认收益
- 多实例共卡:核算各实例的保留量之和是否超过卡容量
主动归还缓存可以释放保留量,但频繁调用会带来反复申请的额外开销:只在明确需要腾出连续空间时使用。
把保留量当成泄漏是常见误判:判断泄漏要看分配量是否随请求持续增长且不回落,同时比对多次采样而非单点数据。