cache reuse is not supported for Gemma 4 models despite -fa enabled and –swa-full

在 llama.cpp / llama-server 上加载 Gemma 4 系列 GGUF 模型并启用前缀缓存复用时,即使已经加了 -fa on 和 --swa-full ,服务端仍会打印 cache reuse is not supported 并退化为每次请求全量重算 prompt(例如 46

快速结论:在 llama.cpp / llama-server 上加载 Gemma 4 系列 GGUF 模型并启用前缀缓存复用时,即使已经加了 -fa on 和 --swa-full,服务端仍会打印 cache reuse is not supported 并退化为每次请求全量重算 prompt(例如 46K token 约 96 秒)。优先排查两件事:--swa-full 是否真的生效让相似度检查通过,以及模型是否带有 shared KV cache(shared_kv_layers)导致复用执行被阻塞。

适用环境:Issue 中已确认的环境为 Windows x86_64、使用 Clang 19.1.5 构建的 llama.cpp version 8660 (d00685831),后端涉及 CUDA 与 Vulkan,硬件为 RTX 2000 Ada Generation Laptop GPU(Vulkan1)。另有用户在 Debian 13、CPU-only 环境、llama-b8672 上复现同类“每轮重算整个上下文”的现象。Issue 未提供 Python、PyTorch 版本信息。

最快修复方案:暂无确认的一步修复方案。可以优先尝试的做法是确保 --swa-full 已启用(评论确认这是相似度检查能正常工作的前提),但评论同时指出 shared KV 层问题仍会阻塞复用执行,因此该做法只能解决“相似度恒为 0”的那一半,不能保证缓存复用真正落盘生效。

注意事项:--swa-full 只解决了 SWA 缓存与相似度匹配,Issue 汇总里明确把 shared_kv_layers = 20 列为尚未解决的阻塞点,属于 unconfirmed bug,后续版本行为可能变化。上述建议均未经上游正式确认,不要当作官方修复步骤。

问题场景

用户通过 llama-server 加载 Gemma 4 系列 GGUF 模型(如 ggml-org/gemma-4-E2B-it-GGUF、ggml-org/gemma-4-E4B-it-GGUF,另有用户在 google_gemma-4-26B-A4B-it-Q5_K_S.gguf 上复现同类现象),并开启前缀缓存复用相关参数:llama-server -hf ggml-org/gemma-4-E2B-it-GGUF -fa on --cache-reuse 256 --swa-full。即使在连续请求中 prompt 几乎相同,服务端日志仍显示缓存复用被忽略,每次都要重新评估整个 prompt。在使用 Claude Code 这类会在用户消息之上附带 system prompt、system tools、MCP servers 等 30K–40K token 的场景下,用户每轮要等待 60–90 秒才能看到首批输出。

报错原文

slot update_slots: id  1 | task 314 | cache reuse is not supported - ignoring n_cache_reuse = 256
slot update_slots: id  1 | task 314 | n_tokens = 0, memory_seq_rm [0, end)
srv  load:  - looking for better prompt, base f_keep = -1.000, sim = 0.000

原因分析

根据 Issue 讨论,这实际上是两个相互独立的问题叠加:

  • SWA 缓存与相似度检查:未加 --swa-full 时,srv load 阶段的相似度恒为 sim = 0.000,前缀匹配代码根本没有机会尝试复用。评论指出该问题可由 --swa-full 修复(关联 #15082),启用后相似度检查恢复正常并能找到共享前缀。
  • 缓存复用执行:即便找到了良好的前缀匹配,仍无法真正应用复用,原因是 Gemma 4 的 shared KV cache 架构(shared_kv_layers = 20)。Issue 正文的 hypothesis 也指出,Gemma 4 最后 num_kv_shared_layers 层复用最后一个非共享层的 K/V 张量,这会破坏现有缓存复用 / 前缀匹配代码的假设,从而显式退出并打印 “cache reuse is not supported”。

需要注意的是,该 Issue 被标记为 bug-unconfirmed,上述 shared KV 层为阻塞点的判断来自讨论中的分析,属于可能原因而非上游已确认的定论。

环境排查

  • 确认 llama.cpp 构建版本号与 build_info(如 Issue 中的 version: 8660 (d00685831)、b8672-25eec6f32),不同版本行为可能不同。
  • 确认运行参数中是否包含 --swa-full,以及 -fa on、--cache-reuse 的实际取值。
  • 查看启动日志中是否打印 general.architecture = gemma4 以及 notice about shared KV layers/gemma4.attention.head_count_kv 等相关元数据。
  • 确认后端类型(CUDA / Vulkan / CPU)、GPU 型号与显存情况;CPU-only 环境下同样出现该问题。
  • 确认 n_parallel、kv_unified 等缓存相关运行时设置。
  • 如需更详细日志,可按日志提示使用 --verbose 或 -fit off 复现。

解决步骤

  1. 先确认相似度检查是否正常:在启动命令中加入 --swa-full,观察日志中 srv load: ... sim = ... 是否不再是 0.000。根据评论,这是缓存复用能够被尝试的前提。
  2. 若加入 --swa-full 后相似度已能命中,但日志仍出现 cache reuse is not supported - ignoring n_cache_reuse = ...,则可判断剩余阻塞来自 shared KV 层架构,此时可优先尝试升级到最新的 llama.cpp 构建,关注上游是否修复了 shared KV 与缓存复用的兼容性。
  3. 若暂时无可用修复版本,可在依赖缓存复用的场景下通过减少每轮 prompt 体积、缩短上下文、或使用非 Gemma 4 shared KV 架构模型来规避全量重算带来的等待。
  4. 如需跟踪进展,可关注 Issue 讨论中提到的关联 PR/Issue(#15082、#16382、#20225)的关闭与合并状态。

验证方法

在相同 prompt 连续发起两次请求后,检查 llama-server 日志:应不再出现 cache reuse is not supported - ignoring n_cache_reuse,且 srv load 中的 sim 为合理的非零值;同时可以对比第二次请求的首个 token 延迟,若缓存复用真正生效,其延迟应明显低于首次请求(而不是每次都接近首次的 60–90 秒)。

参考来源

ggml-org/llama.cpp #21468

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 26569

发表回复

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