1、显存溢出概述:什么是显存溢出(OOM)
显存溢出,圈里人常叫它OOM(Out of Memory)。说白了,就是你的GPU显存放不下你喂给它的数据了。
我刚开始做深度学习那会儿,第一次遇到OOM,还以为是显卡坏了。后来才发现,这其实是每个AI工程师都会遇到的"老朋友"。你想想看,显存就像个仓库,模型参数、中间激活值、优化器状态、梯度……这些东西全都要往里塞。仓库就那么大,塞不下自然就爆了。
OOM的常见表现
OOM不是悄无声息发生的。它通常会给你几个明显的信号:
- 直接报错:最常见的是
CUDA out of memory或者RuntimeError: CUDA error。我见过不少新手看到这个直接慌了,其实不用怕,这是GPU在告诉你"我装不下了"。 - 训练突然中断:跑了好几个小时的训练,啪一下停了。嗯,这种最让人崩溃。我在项目中遇到过,凌晨三点爬起来看日志,发现就是OOM。
- 系统卡死或黑屏:严重的时候,整个桌面都会卡住。这是因为显存被占满后,连显示输出都受影响。
- 进程被kill:Linux系统下,OOM Killer会直接干掉你的进程。你甚至看不到错误日志,进程就没了。
⚠️ 注意: 有一种情况容易被忽略——训练时没报错,但loss突然变成NaN。这往往是因为显存不足导致数据损坏。我曾经排查了三天,最后发现是batch size设太大,显存边缘溢出。
OOM对训练/推理的影响
OOM的影响,我分训练和推理两个场景来说:
| 场景 | 影响 | 严重程度 |
|---|---|---|
| 训练 | 训练中断,浪费算力。大模型训练一次可能几万块,OOM一次就白烧了 | ⭐⭐⭐⭐⭐ |
| 训练 | 被迫减小batch size,影响模型收敛速度和精度 | ⭐⭐⭐⭐ |
| 训练 | 无法使用更大的模型,限制模型能力上限 | ⭐⭐⭐⭐ |
| 推理 | 服务不可用,用户请求失败 | ⭐⭐⭐⭐⭐ |
| 推理 | 推理延迟飙升,因为系统在频繁做内存交换 | ⭐⭐⭐ |
| 推理 | 无法处理长序列输入,比如长文本生成 | ⭐⭐⭐ |
我个人习惯把OOM分成两类:显性OOM和隐性OOM。显性OOM就是直接报错,好排查。隐性OOM最坑——它不报错,但训练速度越来越慢,因为GPU在偷偷把数据往CPU内存搬。我踩过这个坑,当时还以为模型变强了,结果发现是显存不够在"借内存"。
核心观点: OOM不只是个报错,它会影响你的模型设计、训练策略、甚至业务上线。理解OOM的本质,是AI工程师的必修课。
💡 小技巧: 刚开始一个新项目时,我建议先用小batch size跑通流程,再逐步增大。这样能快速摸清显存的上限在哪里。
为什么会发生OOM?说白了就是三个原因:模型太大、数据太多、或者代码写得不够高效。后面几章我会详细讲怎么排查和解决。但今天先记住一点——OOM不可怕,可怕的是你不知道它为什么发生。
📌 我的经验: 刚开始接触大模型时,我总觉得OOM是硬件问题。后来才发现,很多时候是代码写得不够好。比如忘记释放中间变量、用了太多显存缓存……这些后面都会讲到。