VRAM Accounting and GPU Splitting Fixes

这类问题通常出现在 Ollama 加载模型或调度多 GPU 时:模型被错误驱逐、明明显存放得下却拒绝加载,或本可单卡运行却被拆分到多张 GPU。优先排查 Ollama 版本是否已包含这批 VRAM 核算与 GPU 拆分修复,再核对显存相关环境变量(如 OLLAMA_GPU_OVERHEAD 、 OL

快速结论:这类问题通常出现在 Ollama 加载模型或调度多 GPU 时:模型被错误驱逐、明明显存放得下却拒绝加载,或本可单卡运行却被拆分到多张 GPU。优先排查 Ollama 版本是否已包含这批 VRAM 核算与 GPU 拆分修复,再核对显存相关环境变量(如 OLLAMA_GPU_OVERHEAD、OLLAMA_KV_CACHE_TYPE)是否生效。

适用环境:Ollama(使用 llama-server 后端);Issue 涉及多 GPU 配置以及带 recurrent/SSM 块的混合模型(hybrid models)。Issue 未给出具体的操作系统、Python、CUDA、显卡型号与依赖版本,此处不补充。

最快修复方案:暂无确认的一步修复方案。该 Issue 为问题汇总与修复说明,修复包含 6 个提交(涉及 server 调度器与 llm 显存预测逻辑),需升级到包含这些提交的 Ollama 版本;Issue 未提供可直接执行的单一命令。

注意事项:Issue 的测试结果只覆盖代码层单元测试(llm/... 323 项、server/... 17 项全部通过),并声明已用真实模型加载日志、多种 GPU 配置和混合模型做过验证,但未给出面向用户的具体版本号或操作步骤。升级后若仍复现,需结合本机 llama-server 日志进一步确认。

问题场景

用户在 Ollama 中加载或调度模型时触发以下一类问题:模型显存预测明显偏高(混合模型的 KV cache 被高估 4-8 倍,#19463);OLLAMA_GPU_OVERHEAD 被 llama-server 后端忽略(#18679);多卡显存核算使用发现阶段的设备名而非子进程日志中的名称(#18349);以及单卡显存本已足够,模型却被拆分到多张 GPU(#16599)。最终表现为模型被不必要地驱逐、拒绝加载、上下文被压低到请求值以下,或跨卡拆分导致性能下降。

报错原文

VRAM Accounting and GPU Splitting Fixes
VRAM prediction over-counts KV cache 4-8x for hybrid models
OLLAMA_GPU_OVERHEAD is ignored by the llama-server backend
Multi-GPU VRAM accounting uses discovery device names instead of child's log names
0.30.6 spreading model across GPUs even though one GPU has enough VRAM

原因分析

根据 Issue 说明,可能原因分为四类:

  • KV cache 预测逻辑错误:把每个 block 都按持有缓存计算(例如 65 个 block 而非实际持有 KV cache 的 16 个);对滑动窗口 block 按完整上下文计算,而不是取 min(n_ctx, n_swa + n_ubatch);对 f16 硬编码乘 2,忽略 OLLAMA_KV_CACHE_TYPE;head dimension 用 embedding_length / head_count 推导,而非使用 attention.key_length。
  • GPU overhead 未生效:层放置忽略 overhead 设置,空闲显存计算未扣除 overhead,LLAMA_ARG_FIT_TARGET 未包含 overhead 余量。
  • 设备名映射错误:过滤后的设备会被重新编号(例如单独一块 CUDA1 在日志中显示为 CUDA0),导致多卡核算对应错误设备。
  • 调度器拆分策略问题:能放进单卡的模型被拆分;同时 pinned num_gpu 的放不下判断可能基于过期的调度快照,导致误拒加载。

环境排查

  • 确认 Ollama 版本是否已包含 Issue 中列出的修复提交(b4848cb13、6b4be0c16、d2ecb7642、e842ac319、2493a1011、8be4fc98);旧版本(如 Issue 提到的 0.30.6)可能受此影响。
  • 确认是否使用 llama-server 后端,以及是否设置了 OLLAMA_GPU_OVERHEAD、OLLAMA_KV_CACHE_TYPE。
  • 多 GPU 时,检查 llama-server 日志中的设备命名(是否出现被重新编号的 CUDA0 等),并与 Ollama 发现阶段的设备名对照。
  • 确认出现问题的模型类型是否为带 recurrent/SSM 块的混合模型或使用滑动窗口注意力的模型。
  • 核对 pinned num_gpu 配置是否与当前实际空闲显存一致。

解决步骤

  1. 升级到包含上述 6 个修复提交的 Ollama 版本(具体版本号 Issue 未明确,需按发布记录确认)。
  2. 若显存被低估/高估或模型被误驱逐,重点验证新版对混合模型的 KV cache 预测是否已按实际 block 数、滑动窗口上限和 OLLAMA_KV_CACHE_TYPE 计算。
  3. 若设置了 OLLAMA_GPU_OVERHEAD,确认该余量已参与层放置、空闲显存计算和 LLAMA_ARG_FIT_TARGET。
  4. 若为多卡环境,确认显存核算使用的是 llama-server 日志中的过滤后设备名(即发现设备 ID 到日志名的映射)。
  5. 若 pinned num_gpu 被误拒,新版会在拒绝前重新读取各设备实时空闲显存,仅在确认放不下时快速失败;放得下则继续交给 llama-server 的 --fit 实际加载。
  6. 若单卡足够,确认新版采用驱逐而非拆分策略,模型不再被分散到多张 GPU。

验证方法

在同一模型与 GPU 配置下复测:模型应能正常加载,不再被不必要地驱逐;实际上下文长度不低于请求值;OLLAMA_GPU_OVERHEAD 设定后显存占用与预期一致;单卡可容纳的模型不再跨卡拆分;多卡显存核算与 llama-server 日志中的设备及显存数据一致。可对照 llama-server 的 --fit 测量值检查预测是否吻合。

参考来源

ollama/ollama #19631

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 33788

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注