你在 LM Studio 里点 Load,进度条走完后应用要么直接崩溃,要么弹出 Failed to load model: out of memory。翻日志可能看到更具体的一行,比如 Error: Failed to initialize the context: failed to allocate buffer for kv cache,或者 llama_model_load: error loading model: failed to allocate ... out of memory。最让人困惑的是:模型文件才 40 GB,机器有 96 GB 内存,却还是加载不了。
最快的修复(多数人有效):打开模型的加载设置,把 Context Length 降到 4096,确认 Flash Attention 处于开启状态,然后重新加载。真正撑爆显存的几乎都是 KV cache 而不是权重本身,而 Context Length 是影响 KV cache 大小最关键的一个开关。下面的内容是给”光降上下文还不够”的情况准备的。
截至 2026 年 6 月,本文对应 LM Studio 0.3.3x(加载界面、Model Loading Guardrails 以及 lms 命令行均按该版本描述)。
先判断你属于哪一类
| 现象 | 最可能的原因 | 对应步骤 |
|---|---|---|
| 模型大、内存大,加载就 OOM | Context Length 撑大了 KV cache | 原因 1、Step 1 |
| 模型文件比显存还大 | 量化对这张卡太重 | 原因 2、Step 2 |
| 能加载,发第一条消息时 OOM | KV cache 在首 token 才惰性分配 | 原因 1、FAQ |
| 加载器提示”资源可能不足”或直接拦截 | Resource Guardrails 估算 | 原因 7、Step 5 |
| 31B+ 的 GGUF 仅在开 KV-on-GPU 时 OOM | ”Offload KV Cache to GPU Memory” 开关 | 原因 6、Step 3 |
| 切换模型没 Eject 就 OOM | 上一个模型的显存没释放 | 原因 5、Step 4 |
常见原因
按命中率从高到低排列。
1. Context Length 过大,撑爆 KV cache
LM Studio 会在推理开始之前,按你选定的上下文窗口预分配整个 KV cache,而默认值往往是模型的最大值——现代模型常见 128k token。70B 模型在 128k 上下文(fp16 KV)下,光 KV cache 就要约 50-80 GB,再加上 Q4_K_M 权重的约 40 GB,合计 90-120 GB,连 96 GB 统一内存的 Mac 都放不下。
怎么判断:在 My Models 里打开该模型,点齿轮/设置,在 Load 设置中查看 Context Length。如果显示 32768、65536 或 131072,那基本就是根因。降到 4096 再加载。
2. 量化格式对这张卡的显存太重
Q8_0 的 70B 约 75 GB,Q4_K_M 的 70B 约 42 GB。在 16 GB 显卡上,连 Q4_K_M 都超出显存,于是 LM Studio 会往 CPU/内存上 offload,而如果系统内存也紧张,照样 OOM。
怎么判断:拿 GGUF 文件大小对照显存。16 GB 的卡,权重在 ~12 GB 以内才有余量留给 KV cache(Q4_K_M 13B ≈ 8 GB,Q4_K_M 8B ≈ 5 GB)。
3. 旧配置里 Flash Attention 被关掉了
Flash Attention 能降低注意力计算时的显存占用、压缩每 token 的 KV cache 开销,在同样上下文长度下通常能省出 20-30% 显存。它在 v0.3.31 起成为 CUDA 默认,v0.3.32 起成为 Vulkan/Metal 默认;但在那之前保存的逐模型配置可能仍把它强制设为 Off。
怎么判断:在模型的 Load 设置里确认 Flash Attention 为开启或 Auto。如果被手动设成了 Off,本来该放得下的长上下文加载就会 OOM。
4. Apple Silicon 上的 Metal 显存预算
Apple Silicon 的 GPU 能寻址大部分统一内存,但 macOS 仍对 GPU 工作集设上限(历史上约为内存的 75%,由 Metal 驱动强制)。16 GB 的 M2 上,整个 GPU 工作负载大约只有 12 GB。Q4_K_M 7B(4.4 GB 权重 + KV cache)放得下;Q4_K_M 13B(8 GB 权重)一旦加上 KV cache 就可能越界。
怎么判断:打开活动监视器的 GPU 视图(或 内存 标签),把 GPU 内存和模型的预期占用做对比。
5. 上一个模型的显存没释放
如果你加载了一个模型、跑过推理,然后没 Eject 就直接加载另一个(更大的)模型,前一个的分配可能仍驻留在显存里;或者显存碎片化,导致系统报告还有 10 GB 空闲,但最大连续块只有 4 GB,新模型的 buffer 分配就失败了。
怎么判断:Eject 掉所有模型,再用 nvidia-smi(NVIDIA)或活动监视器(Mac)查看显存。如果 Eject 后显存没掉回接近空闲的水平,说明存在泄漏或碎片。
6. “Offload KV Cache to GPU Memory” 把缓存硬塞进显存
这个开关让 KV cache 存放在显存里(更快),而不是系统内存。在显存紧张的配置上,或者遇到某些大体积 GGUF(2026 年有多个 31B 模型出现此现象),开着它就会把加载推过临界点——同一个模型关掉这个开关反而能干净加载。
怎么判断:在 Load 设置里找到 Offload KV Cache to GPU Memory。如果它开着、而你又贴近显存上限,就关掉它,让缓存溢出到内存。
7. Resource Guardrails 在加载前就拦截
LM Studio 的加载器会估算”权重 + KV cache + 计算缓冲”,再和空闲内存对比。在 Settings → Model Loading Guardrails(模式有 Strict、Balanced、Relaxed、Off)下,过于保守的估算可能用类似 “not enough resources to run model with the current settings” 的提示拒绝加载,哪怕这套配置其实放得下。已知该估算相比原生 llama.cpp 偏高。
怎么判断:如果你看到的是 guardrail 提示而非硬崩溃,先降上下文;确认放得下的话,可用 Load anyway 或放宽 guardrail 模式。
最短修复路径
Step 1:把 Context Length 降到实际需要的范围
在模型的 Load 设置里设:
Context Length: 4096
4096 足够应付绝大多数对话;RAG 或长文档用 8192;只有任务确实需要时才上 32k+。KV cache 显存大致与上下文长度线性增长,所以这是单项收益最高的调整。
从终端加载前,可以先预览开销而不真正加载:
# 仅打印显存估算并退出(不加载),会按你给的参数计算
lms load <model-key> --context-length 4096 --gpu max --estimate-only
Step 2:换更省显存的量化
Q8_0 → Q6_K → Q5_K_M → Q4_K_M → IQ4_XS
Q4_K_M 通常是甜点档(多数任务上质量损失几乎察觉不到,显存却约为 Q8_0 的一半)。在 LM Studio 的下载器里搜模型名、按量化筛选即可。截至 2026 年 6 月,按显存分级的推荐:
| 显存 | 安全的模型 + 量化 | 起始上下文 |
|---|---|---|
| 8 GB | 7B/8B Q4_K_M | 2048-4096 |
| 16 GB | 13B Q4_K_M 或 13B Q5_K_M | 4096-8192 |
| 24 GB | 34B Q4_K_M 或 13B Q8_0 | 8192-16384 |
| 48 GB | 70B Q4_K_M 或 IQ4_XS | 8192-16384 |
16 GB 显卡跑 70B,即使 Q4_K_M(42 GB)也得大量 CPU offload——能完全跑在 GPU 上的 13B Q4_K_M(8 GB)通常是更划算的选择。
Step 3:开 Flash Attention、量化 KV cache、合理设置 offload
三个加载设置的开关,按影响从大到小:
- Flash Attention → 开启(当前版本默认开)。省出约 20-30% 显存,同时加快解码。
- KV Cache Quantization → 从
fp16改为Q8_0,每 token 的缓存显存大致减半,质量损失可忽略。 - Offload KV Cache to GPU Memory → 显存吃紧就关掉,让缓存溢出到系统内存(慢一些,但能加载)。
对于完全放不进显存的模型,设置部分 GPU Offload,让一部分层跑在 GPU、其余跑在 CPU 内存:
GPU Offload: 20 (从低往上加,加到刚好不 OOM 为止)
或者用命令行按比例 offload:
lms load <model-key> --gpu 0.5 --context-length 4096 # 50% 的层放到 GPU
lms load <model-key> --gpu off # 纯 CPU,不占显存
Step 4:Eject 其他模型并清理显存
# NVIDIA:加载前确认显存已释放
nvidia-smi --query-gpu=memory.used,memory.free --format=csv,noheader
# Apple Silicon:在活动监视器 > GPU 查看
在 LM Studio 里打开 My Models(或服务器/高级用户面板),对每个已加载模型点 Eject,再加载新模型。开启 Auto-evict 和”only keep last JIT-loaded model”能避免不知不觉叠加多个模型。
Step 5:放得下却被 guardrails 拦时,有意识地放宽它
如果加载器是用资源提示拒绝、而不是硬崩溃,进 Settings → Model Loading Guardrails,从 Strict 调向 Balanced 或 Relaxed,或在加载器里点 Load anyway。务必在自己的估算(或 --estimate-only)确认配置真的放得下之后再这么做——guardrails 的存在就是为了防止你把机器卡死。
Step 6(Windows):把页面文件调大,作为溢出缓冲
控制面板 → 系统 → 高级系统设置 → 性能 → 设置 → 高级 → 虚拟内存 → 更改。设自定义大小,最小值 ≈ 模型文件大小的 1.5 倍,最大值 ≈ 3 倍,应用后重启。页面文件被禁用或过小,会让大块 mmap 区域在 Windows 上提交失败。
怎么确认已经修好
- 加载模型,观察加载器的实时显存读数,应稳定在总量以下,而不是顶在 100%。
- 用完整上下文发一条真实 prompt。首 token 才惰性分配 KV cache;如果能正常流式输出不崩,说明缓存放得下。
- 生成过程中监控显存:
nvidia-smi --query-gpu=memory.used,memory.free --format=csv -l 2
显存占用应趋于平稳,而不是持续往上限爬。Mac 上长时间生成时,活动监视器的 GPU 视图应保持稳定。
预防建议
- 下载前先估算:GGUF 大小 +
(context_length × 2 × num_kv_heads × head_dim × num_layers × 2 字节 / 1e9)GB(fp16 KV);若用 Q8_0 KV cache,把 KV 这项减半。 - 新模型默认设
4096上下文,按需再逐次调高。 - Flash Attention 常开,优先 Q4_K_M,除非任务明显对量化敏感。
- 关掉 Auto-load last model on startup,避免开机时还没评估就先加载大模型。
- Eject 模型后等几秒,确认
nvidia-smi显示显存已归还,再加载下一个。 - Windows 上在最快的 SSD 上保留至少 32 GB 的手动页面文件。
- 把 LM Studio 的模型目录加入杀毒软件白名单,避免 mmap 时 I/O 卡顿。
常见问答 (FAQ)
Q: 模型能加载,但一发第一条消息就崩溃,是同一个问题吗? A: 是的。你这条 prompt 的 KV cache 是在首次前向时惰性分配的,不在加载时。128k 上下文下,这个分配可能在首 token 失败,于是崩溃发生在推理而非加载。降 Context Length 再加载即可。
Q: 一个 31B 模型只在开着 “Offload KV Cache to GPU Memory” 时 OOM,为什么? A: 这个开关把缓存硬塞进显存。有些大体积 GGUF 本就贴着显存上限,缓存一加上去就溢出;关掉它,缓存留在系统内存里就能加载。同时开 Flash Attention 和 Q8_0 KV cache 也有帮助。
Q: IQ4_XS 是什么,值得用吗? A: 这是一种 importance-matrix 量化,目标约 4.25 bit/权重、非均匀精度——比 Q4_K_M 略小、精度相当,常是把 70B 塞进约 40 GB 的最佳选择。LM Studio 原生支持 IQ4_XS 的 GGUF。
Q: 加载器说我”资源可能不足”,但我确定放得下,能强制加载吗?
A: 能。图形界面用 Load anyway,或把 Settings → Model Loading Guardrails 设为 Relaxed 或 Off。这个估算偏保守,往往高于实际占用。先用 lms load <model> --estimate-only 确认一下。
Q: 同一个模型在 Ollama 里能加载,在 LM Studio 里却 OOM,为什么? A: 两者的 KV cache 默认值不同。Ollama 常默认较小上下文(如 2048),而 LM Studio 可能默认用模型最大值。在 LM Studio 里手动降低 Context Length,通常就能对齐。
Q: 它显示”有 16 GB 显存可用”,却在 10 GB 的模型上 OOM? A: 标称数字包含了系统可能为显示和系统占用回收的那部分。可靠可分配的显存大约只有标称的 80-85%,所以 16 GB 的卡,给”权重 + 缓存 + 计算缓冲”留大约 13 GB 来预算。
相关阅读
- llama.cpp 换更激进量化后质量明显下降
- Ollama 探测不到 GPU,全跑在 CPU
- 多 GPU 没分配上,模型只跑在卡 0
- 本地模型冷启动后首 token 极慢
- vLLM 报 context length exceeded
标签: #local-llm #lm-studio #排查