显存明明够却 OOM:先看报错里 reserved but unallocated 是不是大于 1GB
按计算显存明明够,还是报 CUDA out of memory —— 但报错里那句「If reserved but unallocated memory is large」暴露了真相:显存被缓存分配器预留成碎片了,空闲总量够、却没有连续的一大块。这和「真显存不足」的处置方向不同:真不足要降负载,碎片要调分配器(expandable_segments)或重启进程。判据是报错里 reserved but unallocated 的数值,大于 1GB 就是碎片。
显存排错推理优化长跑服务PyTorch这条适用于
- 长跑推理服务 / 反复加载卸载模型(短任务一般不碎片化)
- 显存显示还有空余却 OOM
版本指纹
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__ 为准。
适用边界:本机实测多见于长跑推理服务与反复加载/卸载模型的场景;短任务、一次性出图一般不会碎片化。判据(reserved but unallocated 大于 1GB)来自 PyTorch 官方报错提示原文。expandable_segments 需 PyTorch 2.1+ 才支持,老版本设了无效——这种情况下重启进程是更可靠的解法。换环境请以报错原文与 torch.__version__ 为准。