GPUFits

第 5 步

第 5 步:跑不快或装不下怎么办:五步排查法

更新于 2026-09-11 · 核实于 2026-09-11

模型装好了,第一次运行,结果不是报错就是慢得离谱——这是新手期几乎必踩的一关。先分清你遇到的是哪种症状:

  • 装不下:加载时报错、崩溃,或者干脆启动不了。原因是显存不够——显存就是显卡上那块高速内存,模型运行时整个都要住进去。
  • 跑不快:能跑,但一个字一个字往外蹦。

两种症状共用同一套排查顺序。原则只有一个:从损失最小的开关拧起,拧到能用为止。下面五个阀门按顺序来(文中速度均为本站公式的理论估算,实际 ±30%)。

第 1 招:降一档量化

量化是把模型「压缩打包」的技术:Q4、Q3 这些档位,每降一档,体积大约缩小 20%,质量轻微下降。

什么时候用:总需求超显存 1–4GB 的时候,这是第一选择。举例:24B 模型 Q4 档总共需要约 17.5GB,16GB 显卡装不下;降到 Q3 只要约 14.8GB,装下了,而且全量在显卡上跑理论约 42 tok/s——比任何「硬塞」方案快一个数量级。

Ollama 里切换量化档只需换模型标签,比如 ollama run qwen3:32b-q3_K_M

第 2 招:缩短上下文

上下文是模型一次能「记住」的对话长度。它吃的显存(叫 KV 缓存)和模型本体是两笔独立的账,长度翻倍,占用就翻倍。

什么时候用:日常聊天、写作、翻译,4–8K 绰绰有余,主动调小是纯赚——省显存还提速,不伤质量。改法:Ollama 里输入 /set parameter num_ctx 8192,llama.cpp 加 -c 8192

注意反向问题:Ollama 默认只有 4096,如果你要做长文档总结却发现模型「忘得飞快」,那是要调大它。

第 3 招:开 q8 KV 缓存

如果确实需要长上下文、但显存因此告急,别急着动模型——先给 KV 缓存本身做压缩。q8 KV 让这部分占用直接减半,对回答质量的影响小到大多数人感觉不到。

什么时候用:上下文在 16K 以上、且总需求超显存不多时,它是免费午餐。实例:24GB 显卡跑 32B 模型,16K 上下文总需求 25.9GB 装不下;开 q8 KV 后回到 23.7GB,刚好塞下,速度一点不掉。开法:Ollama 设环境变量 OLLAMA_KV_CACHE_TYPE=q8_0,llama.cpp 加 --cache-type-k q8_0 --cache-type-v q8_0

机制细节见深入阅读里的 KV 缓存详解

第 4 招:CPU 部分卸载

还差一点?llama.cpp 可以把放不下的几层挪到普通内存里用 CPU 跑(-ngl 参数,Ollama 装不下时会自动这么做)。

代价要提前知道:速度是断崖,不是线性变慢。只要有一部分层落在内存里,生成节奏就被内存带宽拖住——24B 模型在 RTX 4090 上全量理论约 51 tok/s,部分卸载的下限只剩约 4 tok/s,从「即时」掉到「阅读速度」。

什么时候用:只差 1–2GB、且不是交互聊天——比如离线评估一个模型行不行、夜里批量处理文档。日常聊天别用它硬撑。一个大例外:MoE 模型(下篇会讲)每个 token 只读一小部分权重,卸载后仍可能有 30 tok/s 级别,完全可用。完整的数字推导见 CPU 卸载值不值

第 5 招:多卡

最后的大杀器:显存可以直接相加,两张 12GB 就是 24GB。两张二手 RTX 3060 12GB 跑 24B 的 Q4 模型,理论约 31 tok/s——完胜任何卸载方案。

什么时候用:你确定要长期跑 24GB 装不下的模型(比如 70B 级别),而且使用频率高到值得投入硬件。偶尔跑一次?那可能是租云 GPU 的事,下一篇展开。

一句话记住顺序

量化降一档 → 上下文缩短 → q8 KV → 部分卸载 → 多卡。前三个几乎不伤体验,第四个用速度换容量,第五个用钱换容量。

每一招到底能省多少、你的组合落在哪一档,不用手算——打开下面的兼容性查询器,把模型和显卡排列组合试一遍:

深入阅读:CPU 卸载值不值 · KV 缓存详解

常见问题

怎么看自己现在每秒生成多少 token?

Ollama 里运行 ollama run 模型名 --verbose,每段回答结束会打印 eval rate(tok/s);llama.cpp 启动后也会直接在终端打印。低于 8–10 tok/s 的聊天体验就会明显烦躁。

量化降到 Q3,模型会变笨吗?

会损失一点,但 Q4 到 Q3 在日常聊天里感知不强,Q2 以下才明显变笨。和「装不下被迫卸载到只剩 4 tok/s」相比,降一档量化几乎总是更划算的交易。

为什么我的 Ollama 显存占用比文章里算的小?

Ollama 默认上下文窗口只有 4096 token,远小于模型标称上限,KV 缓存自然小。你手动调大 num_ctx 之后,占用就会向估算值靠拢——这正是第二招要管的事。