一、显存溢出(OOM)概述:什么是显存溢出、OOM的典型表现、OOM对训练/推理的影响
大家好,我是你们的老朋友。今天咱们正式开讲《显存溢出诊断与解决实战课程》的第一章。
说实话,做深度学习这几年,我遇到最多的报错不是模型不收敛,而是这个——CUDA out of memory。嗯,就是显存溢出了。你想想看,模型跑了两天两夜,眼看就要出结果了,突然给你弹个红字,然后进程直接挂掉。那种感觉,啧,我到现在都记得。
所以这一章,咱们先把显存溢出这事儿彻底聊透。说白了,就是搞清楚它到底是什么、长什么样、以及为什么这么要命。
核心一句话:显存溢出(OOM)就是GPU上的显存被占满了,新的数据或模型参数放不进去了,程序直接崩溃。
1.1 什么是显存溢出?
显存,全称是GPU显存。你可以把它理解成GPU的“工作台”。模型参数、中间激活值、梯度、优化器状态、输入数据……这些东西全都要摆在这个工作台上才能计算。
工作台就这么大。你摆的东西太多了,它就放不下了。这时候就会报OOM。
我习惯把显存比作一个仓库。模型参数是货架,激活值是正在搬运的货物,梯度是退货单。仓库满了,新货进不来,整个流水线就得停。
为什么会满?无非两个原因:
- 你放的东西太多了——模型太大、batch size太大、序列太长
- 仓库本身太小了——GPU显存不够用
在实际项目中,我遇到过最离谱的一次,是有人把batch size设成了1024,用的还是24G显存的卡。结果呢?还没开始训练就OOM了。我当时就说,兄弟,你这哪是训练模型,你这是给GPU上刑啊。
1.2 OOM的典型表现
OOM不是悄无声息的。它会用各种方式告诉你“我不行了”。我总结了最常见的几种表现:
| 表现类型 | 具体现象 | 常见场景 |
|---|---|---|
| 直接崩溃 | 程序直接退出,终端打印红色错误信息 | 训练刚开始、加载数据时 |
| 训练中断 | 训练到一半突然报错,之前的进度白费 | 大模型训练、长序列推理 |
| 显存泄漏 | 显存占用持续增长,直到撑爆 | 循环中未释放变量、DataLoader问题 |
| 推理失败 | 推理时显存不够,模型无法加载或推理卡死 | 大模型部署、批量推理 |
我给大家看一个典型的报错信息长什么样:
RuntimeError: CUDA out of memory. Tried to allocate 2.00 GiB
(GPU 0; 8.00 GiB total capacity; 6.12 GiB already allocated;
1.88 GiB free; 5.88 GiB reserved in total by PyTorch)
看到没?它告诉你:你想申请2GB,但只剩1.88GB了。这就是典型的“仓库满了,新货进不来”。
注意:有时候你看到显存还剩不少,但依然报OOM。这是因为显存碎片化导致的。就像仓库里有很多小空位,但放不下一个大箱子。这种情况在长时间训练后特别常见。
1.3 OOM对训练/推理的影响
OOM不是小事。它带来的影响,我分训练和推理两方面说。
训练阶段的影响
- 训练中断,前功尽弃:跑了几十个小时的训练,因为OOM直接挂掉。没有checkpoint的话,全白干。我曾经有一次跑BERT预训练,跑了三天,结果因为一个DataLoader没处理好,显存泄漏,第四天早上起来一看,进程没了。那种心情,唉。
- 无法扩大规模:你想用更大的batch size、更长的序列、更大的模型,但显存卡着脖子。说白了,OOM就是模型规模的天花板。
- 调试成本高:每次OOM都要排查原因,是模型太大?数据太多?还是代码有泄漏?排查一次少则半小时,多则一整天。
推理阶段的影响
- 服务不可用:线上推理服务如果OOM,直接导致服务崩溃,用户请求失败。这在生产环境是重大事故。
- 吞吐量受限:为了不OOM,你只能减小batch size,推理速度就慢了。我见过一个项目,本来可以一次推理32条,因为显存不够,硬生生降到一次4条,吞吐量掉了8倍。
- 模型部署困难:大模型部署到边缘设备上,显存本来就小,稍不注意就OOM。很多模型在服务器上跑得好好的,一上手机就崩。
我的经验:在项目初期,我建议先做一次显存预算。算清楚你的模型参数、激活值、梯度、优化器状态各占多少显存。这样你就能提前知道,你的GPU到底能不能跑得动。别等到训练开始了才发现显存不够,那就晚了。
1.4 本章知识体系
为了让大家更直观地理解显存溢出的全貌,我画了一张图。这张图把OOM的成因、表现、影响串在了一起。你一看就明白。
这张图把OOM的三大核心问题串起来了。左边是“是什么”,中间是“表现”,右边是“影响”。底部是我们后续课程要讲的核心流程:诊断→定位→解决→预防。
我个人习惯,遇到OOM问题,先看表现,再判断类型,最后对症下药。别一上来就瞎调batch size,那跟头痛医脚没啥区别。
本章小结:
- 显存溢出就是GPU显存不够用了,程序崩溃
- 典型表现有直接崩溃、训练中断、显存泄漏、推理失败
- OOM对训练的影响是中断和规模受限,对推理的影响是服务不可用和吞吐量下降
- 解决OOM需要系统性的诊断思路,而不是盲目调参
好了,第一章就到这里。记住,OOM不是世界末日,它只是告诉你——你的模型和GPU之间需要好好沟通一下。后面的章节,我会手把手教你如何诊断、定位、解决各种OOM问题。
想要更多资料,联系可可