随机保留 KV Cache 竟不输精心设计的 eviction 策略?新研究重新审视推理中的显存压缩

0 阅读

长推理的显存瓶颈:KV Cache 越积越多

大语言模型在处理数学证明、科学问答或复杂代码生成时,往往会输出数千甚至数万个 token 的中间推理链。每生成一个 token,模型都会将其对应的 Key-Value(KV)表示存入缓存,供后续注意力计算使用。这个 KV Cache 的大小随序列长度线性增长,在 32k token 的长生成场景中,很容易吃掉数十 GB 显存,成为部署的实际瓶颈。

图片

一种直观的应对思路是 KV Cache eviction:设定固定缓存预算(比如最多保留 K=2048 个历史位置),在推理过程中动态判断哪些历史 KV 值得留下,其余永久删除。过去几年的研究大多围绕同一个核心问题展开:如何更准确地预测一个 KV 未来是否还会被用到?

图片

有的方法累计历史注意力权重,认为被多次关注的位置更重要;有的观察最近 query 的注意力分布;还有工作引入 value magnitude 或 key 的统计特征作为信号。尽管打分方式各异,它们共享一个基本假设:只要 importance signal 更准,就能留下更有价值的信息,从而在压缩后保持推理性能。

图片

然而,来自 Salesforce AI Research 和伊利诺伊大学厄巴纳-香槟分校(UIUC)的一项新研究,却从一个近乎“反直觉”的角度切入:

图片

这些精心设计的 selection signal,本身到底贡献了多少?

图片

Random Attention:不判断重要性,只随机保留

图片

研究团队提出的 Random Attention 方法极其简单,只有两条规则:

图片

  1. 完整保护 Prompt:系统指令、对话模板和用户问题描述对应的 KV 全部保留,永不删除。
  2. 推理过程随机保留:模型自己生成的 reasoning trace 中的 KV,在每个注意力头内独立进行随机采样,只保留 Top-K 个位置。

实现上,这仅需一次随机数生成和一次 Top-K 操作。值得注意的是,“随机”并不意味着所有历史位置平等。一个较早生成的 token 若想长期留存,必须连续通过多轮 eviction,其存活概率随时间呈几何衰减。最终形成的是一种自然的 soft recency bias:新生成的内容几乎总能留下,旧信息则以稀疏、且不同 head 各异的方式散落在缓存中。

作者将 Random Attention 同时视为一种可部署方案和一个 null baseline:如果某个复杂的 selection 方法在相同缓存预算和 Prompt 保护规则下都无法稳定超越随机选择,那它的 signal 可能并没有带来实质增益。

需要说明的是,该研究主要对比 SnapKV、R-KV、VaSE、TriAttention 等无需额外训练、在 decode 阶段直接执行 eviction 的方法,并未系统评估需要蒸馏或微调的 learned selector。因此结论并非否定所有学习型策略,而是聚焦于当前主流的 training-free 方法。

实验结果:随机策略竟不输最强基线

实验覆盖 Qwen3-4B、Qwen3-14B、Qwen3-32B 和 Phi-4-reasoning 四个模型,任务包括 MATH500、GPQA-Diamond、AIME 2025/2026、HMMT 和 LiveCodeBench。主实验采用约 4× KV Cache 压缩(LiveCodeBench 约 3×),最大生成长度统一为 32k tokens。

结果显示,Random Attention 在整体准确率上并未因“随机”而明显落后。在 60 项 baseline comparison 中,它显著优于 31 项,仅 1 项显著落后。更关键的是效率优势:在 vLLM 的 32k-token serving 测试中,由于省去了 scoring pass,Random Attention 相比最强基线 TriAttention 的吞吐提升达 32%–43%。

即使在更激进的压缩设置下(compression factor 从 2× 到 16×),Random Attention 依然稳健。例如在 Qwen3-4B 和 Phi-4-reasoning 上,当 cache budget 极度紧张时,它仍与 TriAttention 保持接近,而 VaSE 的性能则明显下滑。这表明其竞争力不仅限于特定压缩率。

为什么随机删除还能奏效?

这一反直觉结果引出更深层的问题:为何完全不依赖内容相关信号的策略,能在长推理中保持高性能?

发现一:真正脆弱的是 Prompt

KV Cache 可分为两部分:用户输入的 Prompt 和模型生成的 reasoning trace。二者有本质区别:Prompt 通常只出现一次,一旦被删就无法恢复;而中间推理中的变量、公式和阶段性结论,往往会在后续步骤中被反复重述。

更重要的是,不同 baseline 对 Prompt 的处理原本就不一致。TriAttention 和 Random Attention 直接保护完整输入,而 SnapKV、R-KV、VaSE 默认仅保留开头的 sink token,依赖各自 score 决定其他位置去留。这意味着部分性能差距实际源于 protection regime 差异,而非 selection signal 优劣。

为此,作者进行了 controlled experiment:给所有方法统一加上完整 Prompt protection。结果变化显著——SnapKV 在四个设置中分别提升 12.6、12.3、4.5 和 22.5 个百分点;VaSE 提升 4.2 和 10.2 个百分点;而原本就保留较多 Prompt 的 R-KV 提升不超过 1.9 个百分点。统一保护后,三者性能差距缩小至 2.2 个百分点以内。

这说明,对某些方法而言,此前的大差距并非源于“谁更会选 reasoning KV”,而是“有没有保住原始问题”。当然,这一解释无法涵盖所有情况——TriAttention 本就与 Random Attention 采用相同 Prompt 保护,两者比较从一开始就是 matched 的。

发现二:Reasoning Trace 会“自我保护”

既然 Prompt 已安全,为何随机删除 reasoning KV 仍难造成灾难?作者指出,长推理存在两层冗余:

第一层是文本重复。模型很少只写一次关键中间量就再也不提。它通常会在推导过程中不断重述变量值、当前状态和阶段性结论。一个真正有用的信息,往往已在 trace 中留下多个副本。

第二层是跨头冗余。同一 token 在不同 KV head 中有独立表示,而 Random Attention 对每个 head 独立采样。因此一个位置并非简单的“留”或“删”:即使部分 head 丢弃了它,其他 head 仍可能保留可用信息。

为验证这一点,作者设计了 planted-fact probe:将随机事实(如 zq = 4729)插入真实 MATH500 推理链,经历多次 eviction 后再询问模型该值。实验控制哪些 head 保留此事实。

结果令人惊讶:仅单个 head 保存时,模型 retrieval accuracy 最高仅 3%;两个 head 达 60%;三个 head 达 83%;八个 head 全保留时达 99%。这表明模型并不依赖某个“关键 KV”独自承载记忆,而是能整合多个 head 中的残留信息恢复原始内容。

更有趣的是,保留信息的“形状”似乎也不重要。在真实 MATH500 trace 上,将保留位置从零散 token 改为连续 block(size 从 1 到 64),accuracy 几乎不变;仅当 block 大到 256(每个 head 仅剩极少数片段)时才明显下降。相比精确保留某一段,更重要的是让足够多的可用信息继续存活

不过,研究也发现:在真实推理中,即使强制所有 head 使用同一组随机位置,性能也几乎不变。这说明文本冗余通常已足够强,跨头冗余更像是第二道保险,在信息未被重述时才尤为关键。两层机制可相互替代,而 Random Attention 恰好同时保留了这两种可能性。

发现三:随机并非万能,selection 擅长处理“孤立事实”

如果一个信息完全没有冗余呢?作者构造了 Random Attention 最不擅长的场景:很早给出一次 passcode,此后完全不提及,经历 57 次 cache compression 后才要求输出。

此时,Random Attention 的 retrieval accuracy 直接归零。而 R-KV 能恢复 83.6%,VaSE 为 34.4%,SnapKV 和 TriAttention 接近零。这恰恰说明,当事实只出现一次、无后续重述却需长期记忆时,内容相关 selection signal 确实重要

但有趣的是,最擅长找 needle 的 R-KV 并非整体推理 benchmark 中的最强基线;主实验中表现最好的 TriAttention 在此 probe 上却很差。这表明,needle retrieval 能力与整体推理性能并非同一回事。

发现四:不做 Scoring,Serving 真的更快

Random Attention 的另一优势来自系统侧:它无需 content-dependent scoring pass。

作者将其集成进 vLLM,在单张 H200 上使用 PagedAttention,设置 K=2048、1k-token Prompt 和 32k-token generation,与 TriAttention 共享 attention kernels、paging、scheduler 和 compression trigger,仅改变 selector。

结果显示,Random Attention 在四个模型上的吞吐分别提升 37%、43%、40% 和 32%;相比 full attention,达到 1.6–2.7× 加速。

单次 eviction 中,scoring 开销其实很小(单流解码仅占几个百分点)。但在 serving 场景中,这一开销被双重放大:

  • 并发触发:128 个 request 每生成 64 token 就触发一次压缩,且发生在 batched decoding 的同步点,导致整个 batch 等待。
  • 内存访问:content-dependent selector 需额外遍历 paged KV state——依赖 statistics 的方法要读取 key/value,依赖 attention weight 的需暴露 fused kernel 本不保留的中间数据。

相比之下,Random Attention 无需读取任何内容相关信息,只执行随机选择和所有方法都必需的 cache compaction,真正省掉了一整条 scoring pass 及其在长生成中的累积开销。

从“选最重要的 KV”到“保不可丢的信息”

过去,KV Cache eviction 被自然视为 ranking problem:预测哪些 token 最重要,尽可能留下它们。

Random Attention 提出了不同视角:至少在 training-free、decode-time eviction 方法中,一旦控制 Prompt protection 一致,复杂 ranking signal 的额外收益可能有限。真正决定系统是否会崩盘的,首先是那些一旦删除就无法恢复的信息。

Prompt 是最典型的一类——它只出现一次,是推理的起点;rare、once-stated fact 是另一类,缺乏推理 trace 中的常见冗余。相反,大量模型自生成的 working state 会不断被重述,并在不同 head 中留下多个副本,因此比想象中更能承受遗忘。

这并非否定 future selection 的必要性。研究也指出边界:在 LiveCodeBench 中,Prompt 平均长达 557 tokens(约 MATH500 的 6 倍),最长输入可消耗 K=3072 预算的一半。若坚持完整保护 Prompt,长输入场景下“保护什么”本身就会挤占大量预算。

因此,未来更聪明的方法或许不是对整个 reasoning trace 做更复杂的 ranking,而是:

  • 学会压缩 Prompt 中可替代的部分
  • 识别真正不可恢复的信息并优先保护
  • 让其余 cache 尽可能简单高效地管理

Random Attention 由此提供了一个有价值的参照:在相同 budget 和 Prompt protection 下,一个更复杂的 selection signal,究竟能比随机选择多带来多少收益?

如果说过去的问题一直是“模型应该记住哪些最重要的 KV”,那么这项工作提出的另一种可能是:

也许首先应该弄清楚,模型究竟真正害怕忘掉什么。