故障排查 / 装不下
CUDA out of memory / ggml: failed to allocate
本站未复现 推导 影响:llama.cpp / Ollama / vLLM 全版本 · Windows / Linux
报错原文
CUDA out of memory. Tried to allocate 2.00 GiB | ggml_cuda_buf: ggml_backend_cuda_buffer_type_alloc_buffer: allocating ... bytes failed
这段字符串可以直接粘到 站内搜索 或外部搜索引擎里找。
现象
加载模型时报显存不足,或者加载成功但第一次生成时崩;nvidia-smi 显示显存已经顶到接近总量。
原因
权重 + KV + 框架开销三者之和超过了实际可用显存。最常见的三个具体原因是:① 按整卡容量规划而没扣系统占用的那 0.5–1.5GB ② 上下文(-c)开得比需要的大,KV 预留直接把余量吃光 ③ 浏览器/游戏/其他推理进程已经占走 1–2GB。
按这个顺序处理
- 先把上下文降到真正需要的值:聊天 8192 通常够,别默认填 32768。
- 退一档量化:Q4_K_M → IQ4_XS → Q5_K_M 之间每档差 5–15% 权重,14B 从 Q8 退到 Q6_K 能省 3.4GB。
- 加 KV 量化:llama.cpp 用 -ctk q8_0 -ctv q8_0 让 KV 减半,长上下文场景可上 q4_0。
- 关掉吃显存的程序再跑(浏览器硬件加速、其他框架的常驻服务、Ollama 的旧模型没卸载)。
- 确认 -ngl 没有把不该放内存的层留在显存之外——但这条是解决速度,不是解决 OOM。
- 以上都不够就是容量上限到了:本站口径下 16G(可用约 14.1G)跑 27B Q4_K_M 是权重本身就超容量,不是参数没调好,见 weight-does-not-fit。
怎么确认解决了
重新起一次,看启动日志里打印的 KV cache 大小与各层分配数;nvidia-smi 在生成过程中稳定低于可用水位(Windows 16G 约 14.1G)且不继续上涨,就算过了。
来源与可信度
条目性质本站依据容量与速度公式推导撰写
是否已在本站机器复现否——请把这条当线索而不是结论
- https://build.nvidia.com/playbooks/llama-cpp/troubleshooting — NVIDIA 官方排查:llama-server 报 CUDA out of memory 时先降 --ctx-size 与显存占用,对应条目'降上下文+换低量化'处置
- https://github.com/ggml-org/llama.cpp/issues/1866 — llama.cpp 社区 issue:离线层仍占显存、offload 显存记账与 OOM 的对应关系
- https://github.com/ggml-org/llama.cpp/discussions/10615 — 讨论:UVM 预热阶段 OOM,对应'部分加载到系统内存'的处置
相关条目
参数调到最低还是装不下:权重本身就超容量装不下 · 换最小量化、降上下文、关所有程序,还是加载失败或者只跑 1–2 tok/s。KV cache 是什么?为什么上下文那么吃显存?KV cache 是为了不重复计算而存下来的历史注意力数据,它随上下文线性增长,长对话和长文档的显存大户就是它。