首页 > Technology > 正文

本地大模型显存爆了?OOM 排查实录

fenij 2026-08-19 40 Technology

本地跑大模型,最扫兴的莫过于刚加载到一半,终端蹦出一行「CUDA out of memory」,或者容器里 Pod 状态直接显示 OOMKilled 把进程杀掉。显存爆了不等于显卡不行,十有八九是量化、上下文长度、并发这几个旋钮没调好。下面按真机排障顺序过一遍。

先确认是「真 OOM」还是「假爆」

分清两类报错,方向差很远:Python 抛 CUDA out of memory,是推理时显存不够;容器里 Pod 显示 OOMKilled,是 K8s/Docker 的内存 limit 太小。前者调模型,后者调 limit,别搞反。

报错 本质 该调什么
CUDA out of memory 推理时显存不够 量化、砍上下文、降并发
OOMKilled 内存 limit 太小 K8s/Docker memory limit

显存都去哪了

14GB
7B 模型 BF16 权重

📊
26GB
13B 模型 BF16 权重

🔧
线性
KV Cache 随上下文增长

⏱️
+框架
CUDA 上下文/激活值开销

四步把显存压下来

1开量化

2砍长度

3降并发

4换引擎
# 1. transformers 4bit 量化,显存直接砍到约 1/4
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-7B", load_in_4bit=True,
    quantization_config=BitsAndBytesConfig(
        load_in_4bit=True, bnb_4bit_compute_dtype="bfloat16"))

# 2. vLLM 控制上下文长度,显存省约 30%
--max-model-len 4096 --gpu-memory-utilization 0.85

踩坑实录

一次在双卡 A100 上部署 DeepSeek-V4,Pod 起来几十秒就被 OOMKilled。kubectl describe pod 显示 Reason: OOMKilled。我以为是显存不够,忙着换小模型,结果 df 看内存才发现 K8s 的 memory limit 只给了 64Gi,而 BF16 权重 140GB 加载时要先过 CPU 内存。把 limit 拉到 128Gi 才稳住。教训:OOMKilled 先看 limit,别急着动模型。

显存估算速查

参数量 BF16 权重 4bit 量化后
7B 约 14GB 约 4GB
13B 约 26GB 约 8GB
70B 约 140GB 约 35GB

常见问题

量化会不会让模型变笨?
4bit 对 7B/13B 这类小模型几乎无感,对 70B 以上精度损失才明显。日常本地助手用 4bit 性价比最高。

显存够但还报 OOM 怎么办?
查 K8s/Docker 的 memory limit,以及 /dev/shm 是否太小(容器默认 64MB),后者会触发莫名其妙的崩溃。

如果你在本地部署大模型时还遇到别的显存怪事,欢迎到 fenij.com 留言,我可以专门写一期你遇到的那类坑。

延伸:量化等级到底怎么选

压显存最先动的就是量化。7B 模型用 Q4_K_M 最省显存,但会掉一点精度;想要更稳就上 Q5_K_M,显存多占约 1–2G。长上下文场景别忘了开 KV Cache 量化,开启后 32k 以上的上下文显存能再降一截。引擎方面,llama.cpp 显存控制最细,vLLM 吞吐高但更吃显存,Ollama 最省事但可调项少,按机器情况换。

量化7B 显存取舍
Q4_K_M约 4.5G最省,略掉精度
Q5_K_M约 5.5G质量更稳
Q8 / BF1613G+近无损,吃显存

实操速查清单

显存爆了别慌,按这条顺序压,基本都能救回来:① 先确认是真 OOM 还是 limit 太小;② 开量化,7B 从 BF16 降到 Q4_K_M 能省下大半显存;③ 砍上下文长度,日常 4k–8k 足够,别留 32k 余量;④ 降并发,同时只跑一个会话;⑤ 换更省显存的引擎或开 KV Cache 量化。五步走完通常就能从「一加载就崩」变成「稳稳跑起来」,实在还不够再考虑上更大显存的卡。

常见问题

问:CUDA out of memory 和 OOMKilled 有什么区别?
答:前者是推理时显存不够,调量化、砍上下文、降并发;后者是容器内存 limit 太小,去调 K8s/Docker 的 memory limit。

问:Q4 和 Q5 怎么选?
答:显存紧张选 Q4_K_M,追求回答质量选 Q5_K_M,别一上来就 BF16。

问:上下文长度砍到多少合适?
答:日常 4k–8k 足够,超过 32k 显存会飙升,按需设,别留太大余量。

问:显存看着够怎么还 OOM?
答:可能是 KV Cache 或激活值峰值超过了预算,尤其在长输出时;试着再砍上下文长度或降 batch,必要时打开 KV Cache 量化,往往能再挤出一截空间。

相关完整手册

系统化的排查与配置思路,建议顺手收藏这几篇完整手册: