Ollama 与 LM Studio 加载同一个 GB200 Q4_K_M(GGUF 量化)模型时,两者对“上下文长度”的处理方式不同。通常,Ollama 默认将 num_ctx 设为 2048,而 LM Studio 在加载模型时会读取模型的训练上下文参数,也可能沿用内部的默认值,往往会更高一些。由于 KV cache(键值缓存)在模型加载时按最大上下文长度一次性预分配,所以上下文设得越高,显存占用就越大。当模型权重本身已经接近显存上限时,更长的上下文窗口就会触发 OOM。
处理方向:先通过日志和显存占用确认 OOM 是否来自 KV cache,然后分别检查 Ollama 与 LM Studio 当前使用的上下文长度。两者都可以通过配置文件、环境变量或界面参数调整为同一数值。调整后重新加载模型,再发起生成请求验证。操作前后以 nvidia-smi 和日志中的 KV cache 大小为判断依据。先定位 OOM 来自哪一段缓存
Ollama 的日志文件通常位于 ~/.ollama/logs/server.log,加载模型时会输出类似 KV self size = 256.00 MiB 或 llama_context: kv_cache_n = ... 的信息。LM Studio 的日志需要在设置中打开“日志/调试”面板查看。如果在日志中看到 llama_new_context_with_model 以及对应的 n_ctx 值,就能确认原始上下文大小。
接着使用 nvidia-smi 查看显存占用。加载模型后记录一次占用,然后向模型发送一个长生成请求(如请求生成 512 个 token),观察显存是否继续增长并最终 OOM。如果增长出现在生成后半段,基本可以判断是上下文缓存分配不足导致。
Ollama 与 LM Studio 的上下文设置入口
| 工具 | 默认上下文 | 设置位置 | 验证方法 |
|---|---|---|---|
| Ollama | 通常 2048 | Modelfile 中的 PARAMETER num_ctx;或 API 请求 options.num_ctx;或环境变量 OLLAMA_CONTEXT_LENGTH | 日志中查询 KV cache 大小 |
| LM Studio | 取决于模型元数据,常见高于 2048 | 加载模型界面中的 Context Length 输入框 | 界面模型信息中查看上下文长度 |
注意,Ollama 的服务端环境变量 OLLAMA_CONTEXT_LENGTH 会作用于所有通过该服务加载的模型;API 请求中的 num_ctx 只影响当前请求。LM Studio 则通过界面在模型加载前设定,一旦加载完成,后续请求都不能再改动上下文长度。
统一上下文长度,消除差异
下面以 2048 为例,给出两套工具的设置动作。
Ollama 端:
# 方法1:修改 Modelfile,然后重建模型
FROM /path/to/gb200-q4_k_m.gguf
PARAMETER num_ctx 2048
# 采用新配置创建模型
ollama create gb200-2048 -f Modelfile
# 方法2:临时环境变量
export OLLAMA_CONTEXT_LENGTH=2048
ollama serveLM Studio 端:在模型加载页面找到“Context Length”输入框,填 2048,然后点击“Load model”。部分版本中该输入框位于右侧参数区。
验证动作:重新加载模型后,发送一次正常的生成请求。建议先用较小的 max_tokens(例如 128)确认服务正常,再尝试 512 或更大值,观察是否还会触发 OOM。
如果 OOM 仍发生:逐步降低上下文
如果两套工具都设置为 2048 后依然 OOM,说明显存余量不足,需要继续往下调整:依次尝试 1024、512。每次调整后都重复上面的验证步骤。这个过程不是线性关系,所以不要跳过中间值。
修改模型权重在显卡的层数也能腾出显存。Ollama 中可以通过环境变量 OLLAMA_GPU_LAYERS 控制加载到 GPU 的层数,LM Studio 中则在“GPU Offload”滑块中调整。将更多层放到系统内存,虽然会降低推理速度,但能避免纯显存 OOM。
同时检查是否同时运行了其他占用显存的程序。例如浏览器硬件加速、其他推理服务,都会压缩可用显存。释放后重新测试。
常见问题
问:我已经在两个工具里设置了相同的上下文,为什么 Ollama 仍然比 LM Studio 更早 OOM? 答:请再检查日志中的 KV cache 实际数值。Ollama 在加载时可能还会为后台任务保留额外的显存,或者使用不同的 GPU 层数分配策略。如果日志中 KV cache 相同而 OOM 行为不同,重点检查两套软件的 GPU 层数设置。
问:生成时请求的 max_tokens 和上下文长度有什么关系? 答:上下文长度是预分配的最大缓存,max_tokens 是单次生成的最大输出 token 数。max_tokens 不能超过上下文长度,但 KV cache 已经按上下文长度全部预分配,所以降低 max_tokens 不能减少显存占用。