CacheBlend-高效提高KVCache复用性的方法
CacheBlend,一种用于加速 LLM 服务的高效KV缓存融合方案,特别针对检索增强生成(RAG)等需要多文本块上下文的场景,能有效提高 KVCache 的复用性。
论文:(EuroSys 2025)Fast Large Language Model Serving for RAG with Cached Knowledge Fusion
代码:https://github.com/YaoJiayi/CacheBlend
问题背景
为了确保模型高质量的一致性的响应,RAG技术常被应用于LLM服务中,在这种情况下,多个从数据库检索来的文本片段会前置于用户的查询,形成LLM输入,这些长上下文片段显著地提高了LLM的TTFT时间。
为了提高prefill的时间,现有的优化通常重复使用存储的 KVCache,以避免重复的计算。目前有以下两类 KVCache重用的方法,但它们都存在局限性。
前缀缓存
仅能重用输入前缀的KV缓存,无法处理多文本块场景。
全量KV重用
当重用的文本不在输入前缀中时,仍然通过调整其位置嵌入来重用 KV 缓存(这里用到了 Rotary Position Embedding(RoPE) 编码相对位置的特性),从而使 LLM 生成有意义的输出(Prompt cache 2023)。但这样会忽略与之前文本块之间的跨注意力(cross-attention),导致生成质量显著下降。(如果这里不理解什么是cross-attention的话,可以重新回顾一下整个prefill阶段的计算流,tensor在不同的layer前向传递过程中,上下文的内容会不断融合)
这个图表明了:
- 随着选择的文本片段数量增加,生成质量显著提高,尽管包括在太多片段时会由于lost-in-the-middle问题而降低质量。
- 随着选择的文本片段数量增加,由于交叉注意力缺失造成的性能损耗增大。
![]() |
![]() |
---|
左图表示了,由于忽略交叉注意力可能导致错误的回答。为了理解这一点,可以仔细看一下两个文本片段之间的交叉注意力。可以看到,相比于完整prefill后的结果,全量KVCache复用时两个片段之间的交叉注意力被忽略了。
这里要说明一个点,当各片段之间的交叉注意力较低时,片段内自注意力影响较高时,完全重用 KV 是可以奏效的。这种情况在 PromptCache 的主要目标应用(gim2023prompt)的提示模板中较为常见。
挑战
如何在重用非前缀文本块的KV缓存时,保持生成质量与完全预填充(full prefill)一致,同时减少计算延迟?
作者在这里做了一个trade-off,的核心思想是在 Full KV Reuse 的基础上再计算少量 token 的注意力以恢复文本块之间的交叉注意力。
核心方法:选择性KV重计算
选择性KV重计算(Selective KV Recomputation)
- 目标:仅更新对生成质量影响最大的部分token的KV缓存,避免全量预填充的计算开销。
- 实现步骤:在每一层(Layer)的输入中,通过掩码仅保留需要重计算的token(HKVD tokens),计算所需的QKV,其余token的KV值直接复用预计算的缓存。
重计算Tokens的筛选
知道了要重计算关键token,那么如何选择这些token呢?
- 定义:高KV偏差(High KV Deviation, HKVD)Token
指其预计算KV值与完全预填充(Full KV Recompute)结果的差异超过阈值的token。- 量化指标:
$$\Delta_{\text{kv}}(KV_i[j], KV_i^{\text{full}}[j]) = |KV_i[j] - KV_i^{\text{full}}[j]|$$
其中,$KV_i[j]$ 表示第i层第j个token的KV值。
- 量化指标:
筛选依据
注意力稀疏性
仅约10-15%的token的KV偏差远高于其他令牌,对跨文本块注意力贡献显著。
层间相关性
如何在不知道真实 KV 值或注意力矩阵的情况下识别 HKVD 令牌?简单来说,要识别 HKVD 令牌,首先必须知道每一层的完全重新计算的 KV,但这太过昂贵且违背了选择性 KV 重新计算的目的。相反,作者观察到不同层的 HKVD 令牌并不是独立的!
通过Spearman秩相关性分析,发现相邻层的HKVD tokens高度重叠,允许跨层渐进筛选,这是因为各层之间的 KV 缓存具有相似性。
渐进式筛选流程(Gradual Filtering)
如果平均每层想要挑选 $r$% 个 HKVD 标记:
- 首层筛选:在第一层预填充时,计算所有token的KV偏差,选择偏差最高的前$r_1$%作为候选,例如20%)。
- 逐层过滤:
- 对后续每一层,仅计算上一层的候选token的KV偏差,从中筛选偏差更高的(r_i%)(逐步逼近目标比例(r))。
- 最终每层仅重计算约10-15%的token,显著减少计算量。
系统优化:延迟隐藏与动态控制
系统架构
流水线并行(Pipelining)
- KV加载与重计算并行:
- 在GPU计算当前层的选择性KV重计算时,异步加载下一层的预计算KV缓存(从SSD/内存到GPU)。
- 若加载时间 ≥ 重计算时间,额外延迟被完全隐藏。
- 优势:支持将KV缓存存储在低速设备(如SSD)中,节省内存成本,同时不影响实时性。
动态控制器(Loading Controller)
- 动态调整重计算比例:
- 根据存储设备速度(如SSD吞吐量)和模型规模,计算最大可容忍的重计算比例(r%),使得:
$$T_{\text{recompute}}(r%) \leq T_{\text{load}}(storage_device)$$ - 确保总延迟不增加,同时质量损失可控(经验默认r = 15%))。
- 根据存储设备速度(如SSD吞吐量)和模型规模,计算最大可容忍的重计算比例(r%),使得:
- 存储设备选择:
在成本与延迟间权衡,优先选择满足延迟约束的最廉价存储设备(如SSD而非GPU显存)。
实验结果
- 性能提升:
- 服务质量:相比完全预填充,首token时间(TTFT)减少 2.2-3.3倍,吞吐量提升 2.8-5倍。
- 生成质量:与完全预填充相比,F1/Rouge-L分数下降小于 0.02,显著优于完全KV重用(质量提升最高达0.35)。
- 适用性:在多个模型(Mistral-7B、Yi-34B、Llama-70B)和任务(QA、摘要)中验证有效性,支持不同文本块长度和批量大小。
贡献与意义
- 理论价值:揭示了注意力稀疏性与KV偏差的关系,为高效缓存复用提供了新视角。
- 工程价值:通过流水线和动态控制,实现了低成本、高质量的KV缓存复用,兼容现有LLM服务框架(如vLLM)。
- 应用场景:适用于需要多上下文交互的RAG、长文本生成等任务,显著降低服务延迟与计算开销。
局限与展望
- 目前仅验证了Transformer架构,未来需适配Mamba等新型模型。
- 可进一步结合KV压缩技术(如量化、剪枝)减少存储开销。