Google Colab剩余显存充足时仍报CUDA out of memory如何解决
问题诱因
- 显存碎片化:报错中显示的21.75MiB空闲显存为零散非连续空间的总和,CUDA分配显存需要使用连续内存块,因此即使总空闲量大于请求的2MiB,依然会触发OOM,这是该现象的核心诱因。
- 已分配显存无法释放:
torch.cuda.empty_cache()仅能释放PyTorch预留的、未被任何张量引用的空闲缓存块。报错信息显示PyTorch已预留14.98GiB显存,其中14.96GiB被有效张量引用(包括模型参数、梯度、优化器状态、计算中间张量等),这部分内存在未解除引用的前提下,缓存清理操作无法生效。 - 总计算开销超过显存上限:即使batch size设置为1,大尺寸模型的参数、梯度、优化器状态以及前向传播产生的中间激活值叠加后的总占用,已经接近GPU的15.9GiB总容量,没有足够的连续空间容纳新的计算请求。
解决方法
- 先解除无效张量引用再清理缓存:先执行
del 不需要的CUDA张量变量解除所有无用张量的引用,再调用torch.cuda.empty_cache()清理缓存,可释放部分被占用的连续显存。 - 降低模型显存占用:优先改用参数量更小的模型,也可通过量化降低单参数显存占用,比如开启FP16混合精度训练/推理,可直接调用
torch.cuda.amp相关接口实现,或使用INT4/INT8量化进一步压缩显存占用。 - 减少中间张量占用:如果是推理场景,全程用
with torch.no_grad():包裹推理代码,无需存储反向传播所需的中间激活值,可降低近半数显存占用。如果是训练场景,可开启梯度检查点(gradient checkpointing),用计算开销交换显存占用,通过torch.utils.checkpoint.checkpoint包装模型层即可实现。 - 调整PyTorch显存分配策略:在代码入口处添加配置
import os; os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128',可减少显存碎片化的产生,缓解小内存块分配失败的问题。 - 更换更高显存的运行时:如果上述优化都无法满足需求,可断开当前Colab运行时后重新连接,选择显存更大的GPU运行时。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

