llama.cpp 有一个加速 KV 缓存解码的巧妙技巧
摘要
llama.cpp 的 webUI 中有一个设置,它会将生成的 token 重新发送到 KV 缓存,从而显著减少提示处理延迟,提高长生成或工具调用的响应速度,且没有明显的权衡。
我使用 llama-server 作为端点来运行本地模型,并将其连接到 Open-WebUI、Hermes 和 OpenCode。但由于 llama.cpp 的 webUI 一直在更新,我查看了一下它的设置,发现开发者选项下有一个特别的设置。[就是这个设置](https://i.imgur.com/pifZ2V5.png) - 根据描述来判断(我还没看代码),它基本上就是将当前响应生成的所有 token 重新发送到 KV 缓存,而不是等待你再次提示模型开始解码。这当然是一个 hacky 的变通方法,但它确实大大提高了模型在一次对话中生成大量 token 或通过工具调用接收大量信息时的整体响应速度。**要实际启用此功能,你只需要启动 llama-server 并进入 WebUI 启用它,它就会应用于所有发送到 llama-server 的请求,而不仅限于他们的 WebUI**。例如,在 Open-WebUI 中,以前每当 Qwen 读取一个非常大的网页或类似内容时,我都需要等待 5-30 秒(看似不多,但当你的模型在一次对话中抓取多个网页时,时间就累积起来了)进行提示处理。但自从启用这个选项后,几乎是瞬间完成。我还没有注意到任何实际的权衡,我只是觉得这是一个很好的小 PSA 帖子。对于那些好奇的人,我运行的是 Qwen3.6-35B-A3B @ MXFP4,完全卸载到单个 RX 7900 XTX 上,目前没有 MTP,大约获得 ~100tps,因为 MTP 尚不兼容视觉编码器。我想这对于那些使用新 MTP 补丁的人来说会更好,尤其是引入了 MTP for PP 的那个补丁。我之前不知道这个功能存在,所以希望这能帮到别人!就像我说的,它很 hacky,但确实有效!
相似文章
KV Packet: 免重计算的上下文无关KV缓存用于大语言模型
KV Packet 提出了一种免重计算的缓存复用框架,用于大语言模型。该框架使用可训练的软标记适配器来弥合上下文不连续性,消除了开销,同时在 Llama-3.1 和 Qwen2.5 上的性能与完全重计算基线相当。
[llama.cpp] 非对称 KV q8/q4 缓存:当前注意事项及 GGML 仓库中的讨论
讨论了在 llama.cpp 中使用非对称 KV 缓存量化时的注意事项,其中不匹配的 q8/q4 类型会导致提示处理在 CPU 而非 GPU 上进行,并提出了通过编译标志进行修复的方案。
动态KV缓存量化与按需加载mmproj/MTP:我的llama.cpp愿望清单
一位开发者已为llama.cpp实现了一个概念验证的PR,通过HTTP端点添加了动态KV缓存量化功能,允许用户按需重新量化其KV缓存,而无需完全重新加载模型。该帖子还概述了一个愿望清单,包括按需加载mmproj/MTP交换以及用于上下文优化的自动--fit标志。
@pallavishekhar_: 大语言模型中的 KV Cache,阅读链接:https://outcomeschool.com/blog/kv-cache-in-llms…
本文解释了大语言模型中 KV Cache 的概念,详细阐述了其通过存储和复用键值对以避免推理过程中的冗余计算,从而优化文本生成的原理。
llama: 在 MTP 中避免在提示解码期间复制 logits · 由 am17an 提交 · PR #23198 · ggml-org/llama.cpp
此拉取请求通过避免在多令牌预测的提示解码过程中不必要地复制 logits,优化了 llama.cpp,从而提升推理性能。