显存明明够却 OOM:先看报错里 reserved but unallocated 是不是大于 1GB

排障 · 4 步 / 5 分钟L1整理于 2026-10-06 有效期 180d

按计算显存明明够,还是报 CUDA out of memory —— 但报错里那句「If reserved but unallocated memory is large」暴露了真相:显存被缓存分配器预留成碎片了,空闲总量够、却没有连续的一大块。这和「真显存不足」的处置方向不同:真不足要降负载,碎片要调分配器(expandable_segments)或重启进程。判据是报错里 reserved but unallocated 的数值,大于 1GB 就是碎片。

显存排错推理优化长跑服务PyTorch

这条适用于

版本指纹

PyTorch 报错原文判据;expandable_segments 需 PyTorch 2.1+

具体做法

# —— ① 判据:读报错全文,找这一句 ——
# CUDA out of memory. Tried to allocate ...
# If reserved but unallocated memory is large try setting
#   PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation.
# 关键看 reserved but unallocated 的数值:> 1GB = 碎片,不是真不够
$ python -c "import torch; print(torch.__version__)"   # 需 2.1+ 才支持该选项
# —— ② 修法 A:开可扩展段(缓解碎片,官方推荐)——
$ set PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True     # Windows
$ export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True  # Linux/macOS

—— ③ 修法 B:重启进程(最直接,清空显存池)——

长跑服务建议加定期重启,或把「加载模型」与「推理」拆成常驻 + 重载两级

# —— ④ 减少碎片产生的习惯 ——
# · 模型一次加载、多次推理,别来回切模型
# · 避免忽大忽小的 batch(固定 batch 更利于分配器复用)
$ nvidia-smi -l 1        # 实时观察:Used 是否反复在某个水位抖动
失效边界
适用边界:本机实测多见于长跑推理服务与反复加载/卸载模型的场景;短任务、一次性出图一般不会碎片化。判据(reserved but unallocated 大于 1GB)来自 PyTorch 官方报错提示原文。expandable_segments 需 PyTorch 2.1+ 才支持,老版本设了无效——这种情况下重启进程是更可靠的解法。换环境请以报错原文与 torch.__version__ 为准。
← 多机推理先认清拓扑:环上 rank 顺序就是物理顺序,加机器不加带宽本地服务起来了、API 却调不通:先 curl,curl 通就是客户端的事 →

← 返回全部排错方案