LM Studio 加载模型时报 out of memory

LM Studio 加载 GGUF 模型时崩溃或报 out of memory。先降 Context Length、开 Flash Attention、调 GPU offload 即可解决,附按显存分级的选型表。

你在 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 命令行均按该版本描述)。

先判断你属于哪一类

现象最可能的原因对应步骤
模型大、内存大,加载就 OOMContext Length 撑大了 KV cache原因 1、Step 1
模型文件比显存还大量化对这张卡太重原因 2、Step 2
能加载,发第一条消息时 OOMKV 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。如果显示 3276865536131072,那基本就是根因。降到 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(模式有 StrictBalancedRelaxedOff)下,过于保守的估算可能用类似 “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 GB7B/8B Q4_K_M2048-4096
16 GB13B Q4_K_M 或 13B Q5_K_M4096-8192
24 GB34B Q4_K_M 或 13B Q8_08192-16384
48 GB70B Q4_K_M 或 IQ4_XS8192-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

三个加载设置的开关,按影响从大到小:

  1. Flash Attention → 开启(当前版本默认开)。省出约 20-30% 显存,同时加快解码。
  2. KV Cache Quantization → 从 fp16 改为 Q8_0,每 token 的缓存显存大致减半,质量损失可忽略。
  3. 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 调向 BalancedRelaxed,或在加载器里点 Load anyway。务必在自己的估算(或 --estimate-only)确认配置真的放得下之后再这么做——guardrails 的存在就是为了防止你把机器卡死。

Step 6(Windows):把页面文件调大,作为溢出缓冲

控制面板 → 系统 → 高级系统设置 → 性能 → 设置 → 高级 → 虚拟内存 → 更改。设自定义大小,最小值 ≈ 模型文件大小的 1.5 倍,最大值 ≈ 3 倍,应用后重启。页面文件被禁用或过小,会让大块 mmap 区域在 Windows 上提交失败。

怎么确认已经修好

  1. 加载模型,观察加载器的实时显存读数,应稳定在总量以下,而不是顶在 100%。
  2. 用完整上下文发一条真实 prompt。首 token 才惰性分配 KV cache;如果能正常流式输出不崩,说明缓存放得下。
  3. 生成过程中监控显存:
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 设为 RelaxedOff。这个估算偏保守,往往高于实际占用。先用 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 来预算。

相关阅读

标签: #local-llm #lm-studio #排查