Random Attention:随机丢 KV 缓存,精度不输打分式淘汰

一个推理模型(reasoning model)做数学题时,不会直接给答案。它先自言自语上万 token:列公式、走弯路、折返修正、把中间结论复述一遍又一遍。它每写下一个词,显存里就多一份这个时刻的 K/V 向量,供后面的 token 做 attention(注意力)时直接取用,省得从头重算。这套缓存叫 KV cache,通俗说就是模型随身背的账本:写一个字,记一笔。而长思维链正在把这本账本撑到显存放不下。

2026 年 9 月挂上 arXiv 的论文《Random Attention: Rethinking KV Cache Eviction for Efficient Reasoning》给出了一个近乎挑衅的回答:缓存超预算要丢东西时,别打分、别排序、别挑挑拣拣,直接均匀随机地丢。所谓打分式淘汰,就是给缓存里每个 token 按预测的未来重要性打分、只留高分,过去几年里几乎所有淘汰器都长这样。这篇论文一步都不打,结果是与最强的打分式淘汰器精度持平,vLLM 部署里的吞吐反而高出 32–43%。Random Attention

这篇解读要讲清楚三件事:长思维链为什么把 KV cache 逼进死角;「打分式淘汰」这个所有既有方案共享的范式为什么值得怀疑;以及一个什么都不算的基线,凭什么能跟最聪明的淘汰器打平。

长思维链如何把 KV 缓存逼进显存死角

Transformer 每生成一个 token,都要让当前的 query 与历史上所有 key 做一次 attention,再按权重把 value 加权求和。如果不缓存,就得把整段历史从头再算一遍。所以工程上把每个已生成 token 的 K/V 向量存在显存里,这就是 KV cache 的由来。它换来的是算力,付的是显存,而且这笔显存随序列长度线性增长。

推理模型把这个问题放大了。普通对话的输入输出通常只有几百到几千 token,而推理模型面对一道数学题或代码题,会先吐出超过一万 token 的中间推理过程(reasoning trace)。输入端是一次性读完的 prefill 阶段,输出端是逐 token 生成的 decode 阶段;prefill 的缓存压力是固定的,decode 却每生成一个新 token 就给缓存续一笔账,越写越贵。

vLLM 论文里的显存账本把这个直觉钉成了数字。PagedAttention 在一张 A100 上服务 13B 参数的模型,大约 65% 的显存被模型权重静态占住,30% 属于 KV cache,其余是临时的 activation。权重动不了,KV cache 就成了决定一块 GPU 上能挤下多少并发请求、进而决定吞吐的那个变量。

图注:左半是 13B 参数的 LLM 在 A100 上的显存构成,约 65% 被模型权重静态占用(灰色),约 30% 属于随请求动态分配和释放的 KV cache(红色);右半是 KV cache 显存随 batch size 增长的曲线,连续预分配方案提前撞顶,PagedAttention 分页之后增长平缓得多。PagedAttention

缓存迟早超预算,超了就得把一部分 KV 永久丢掉,这个动作叫驱逐(eviction):被丢掉的 key 再也不会被任何未来的 token 看到,这是不可逆的。vLLM 用分页管理把逻辑上连续的 KV 序列切成物理上不连续的块,像操作系统管虚拟内存一样管缓存,这个细节在后面会回来。眼下先记住问题:超预算的那一刻,由谁、按什么标准决定保留谁?

所有人都用同一招:给每个 token 打分,只留高分

从 2023 年起,答案惊人地一致:打分式淘汰。打个比方,这像是让一个图书管理员在书架放不下时决定扔掉哪些书,而管理员们不约而同地先给每本书评一个「未来被借阅概率」,再只留评分最高的那几本。打分式淘汰=按预测的未来重要性给每个 token 打分、只留高分。

H2O 是这套范式的原型。它观察到注意力分数呈幂律分布:极少数的 token 拿走了绝大部分累积注意力,这些 token 被命名为 heavy hitter(重击者)。于是 H2O 的分数就是「进入缓存以来累计收到的注意力分数」,保留它的 top-K,再混上一段最近的 recent token,因为紧跟当前生成的 token 天然最相关。H2O

图注:上半是四种 attention pattern 的示意对比(完整缓存、滑动窗口、window + sink、H2O),下半左侧是 H2O 框架的结构,固定预算内 heavy hitter 与 recent token 并存;右侧是精度与内存的权衡曲线。H2O

这条谱系的另一端是 StreamingLLM,几乎不算分:只保留最开始的 4 个初始 token,外加一个最近滑动窗口,就能在超长文本上稳定生成。为什么初始 token 这么重要?softmax 要求注意力权重之和必须等于 1,当 query 不需要看太多历史时,多出来的注意力就被「倾倒」在最容易看到的初始 token 上,这个现象叫 attention sink。StreamingLLM

模板本身没有变:无论是精细打分(H2O、SnapKV),还是位置触发(StreamingLLM),大家都必须回答同一个问题:留谁。到了推理模型时代,这个范式还被越做越精细。R-KV 给分数加了第二个维度,把 key 向量的余弦相似度当冗余分:同一个事实复述两遍,就不该占两个缓存位,于是「重要性 + 冗余」联合打分。R-KV

打分越做越重,可它到底买到了什么?这个问题先悬在这里。下一章,一个完全不算分的反答案登场。

能不能完全不挑不拣?——保住问题,剩下的交给骰子

Random Attention 的方法只有两个结构选择。

第一,保住 prompt。系统提示、对话模板、题目本身所在的 prefill 区间,驱逐时强制保留,分数直接置为 +∞,永不参与淘汰。第二,其余位置,每个注意力头(attention head)内部各自掷一次均匀骰子:给每个候选位置抽一个 Uniform(0,1) 的随机分数,每个头独立保留自己的 top-K。除此之外什么都不做:不读缓存内容,不算注意力分数,不做任何校准。

驱逐的节奏沿用业界惯例:一个持久预算 K 加上最近的一段缓冲 B,缓冲每攒满 B 个 token 触发一次驱逐,候选里分数最低的被清走。Random Attention 与所有打分式淘汰器共享这个协议,唯独把「打分」这一整步拿掉了。

图注:左侧是打分式淘汰的统一流程:给每个缓存位置算重要性分数,排序后保留高分、驱逐其余;右侧是 Random Attention:prompt 区间整体保留,其余位置由每个注意力头独立抽均匀随机分数并各自保留 top-K,全程没有打分环节。

工程实现上,「零打分」省掉的是一整条管线。官方仓库里 random_pp 模式的全部逻辑浓缩成三行:torch.rand(batch, n_heads, n_cand) 为每个 KV 头独立掷骰子,把 prompt 区间的分数置为 +∞,然后各自 topk(K) 得到保留集合。Random-Attention 仓库 触发频率也有具体值:HuggingFace 评测框架默认每 64 个 decode 步驱逐一次,vLLM 端口是 128。

打分式淘汰省不掉的步骤它全省了:不额外遍历一遍缓存,不需要物化 fused kernel 里根本没保存的注意力分数,不需要按内容做 top-K 扫描,只剩所有淘汰器都要付的 compaction,也就是把保留下来的 KV 收拢回预算内。论文的全部聪明之处就是不去聪明:保住题目,剩下的交给骰子。

当然,「不挑不拣却不输」目前只是断言。下一章上证据。

不打分,凭什么不输?——精度持平,吞吐高 32–43%

先看精度,再看吞吐。顺序不能反:精度塌了,吞吐再高也没有意义。

论文在四个推理模型(Qwen3-4B、Qwen3-14B、Qwen3-32B、Phi-4-reasoning)和六类推理任务(MATH-500、GPQA-Diamond、AIME 2025+2026、HMMT、LiveCodeBench-v6)上,与 SnapKV、R-KV、VaSE、TriAttention 四个淘汰器逐格对比,每个格子的优势都用成对 bootstrap 检验把关。主表 60 个 baseline 格子里,Random Attention 显著领先 31 个,显著落后 1 个:Qwen3-32B 的代码推理任务,TriAttention 领先约 3 分,长 prompt 吃掉了预算。这一格论文没有藏着,读者也不该忽略。综合主表与消融,论文把 TriAttention 认作最强的先前淘汰器。

图注:(a) 是约 4× 压缩下四个模型的六任务平均精度,红色(Random Attention)与深蓝(TriAttention)在每个模型上都贴得很近;(b) 是 vLLM 在 32k 生成长度下的服务吞吐,红色标注写出 Random Attention 相对完整注意力的倍数与相对 TriAttention 的增幅:+37% / +43% / +40% / +32%,对应 1.58× / 2.23× / 1.97× / 2.67×。Random Attention

压缩率扫描展示了全貌:从 2× 一路收紧到 16×,Random Attention 与 TriAttention 在 8× 前始终贴近,16× 才出现轻微分化,而 VaSE 掉队最快。预算越紧,随机方案与最强打分器越是难分伯仲。

吞吐优势的完整口径必须跟数字一起走:NVIDIA H200 单卡、vllm==0.19.0、K=2048、约 1k token 的 prompt、32k token 的生成、128 个并发请求(Qwen3-32B 因权重更大降到 96)。vLLM 的对比只在 Random Attention 与 TriAttention 之间进行,因为只有这两家有 vLLM 端口。在这个设定下,随机方案比 TriAttention 的吞吐高 32–43%,是完整注意力(full attention)的 1.58–2.67 倍。换个硬件、换个 vLLM 版本,这些数字都不保证成立。

这些数字该怎么读,另一篇基准评测提供了方法论镜片:压缩率本身不能预测端到端性能。KV-Benchmark 真正该看的是服务吞吐这类端到端数字,而 32–43% 恰恰是这么算出来的。

但这里冒出一个绕不开的问题:就算实验反复证实「随机能打平」,它凭什么能打平?骰子没有脑子,为什么丢不掉关键信息?下一章进入机理。

随机为什么够用:prompt 易碎,轨迹自带两层冗余

论文用两个受控实验回答「为什么随机够用」。

第一个实验指向一个此前被低估的事实:prompt 是缓存里最易碎的部分。做法很干净,给所有方法加上同一条保护规则(保住 prompt),然后看谁受益最大。结果:SnapKV 加了保护后最高涨了 22.5 分(Phi-4-reasoning 的 GPQA-Diamond),因为它原本的分数最保不住 prompt;R-KV 最多只涨 1.9 分,因为它本来就保得多。一旦所有方法都保住 prompt,三个打分式基线之间的差距收敛到 2.2 分以内。换句话说,不少淘汰器之间的精度差距,主要来自「是否碰巧保住了 prompt」,而不是打分打得有多聪明。Random Attention 反方向的证据同样成立:一个纯 recency 窗口(完全不算分)如果丢了 prompt,只能拿到 0.09 分,保住 prompt 后立刻逼近最好的基线。

这与 StreamingLLM 的 attention sink 观察是同一直觉:初始 token 被所有层所有头强关注,丢不得。差别在归因深度:StreamingLLM 停在注意力分布的现象层,这里的结论来自受控实验。

第二个实验回答:prompt 保住了,剩下的轨迹为什么随机丢也丢不坏?答案是两层冗余。

第一层是文本层冗余,由 R-KV 先确立:推理链会边推边复述自己仍然需要的中间结论,一个重要的值很少只存在于一个位置,丢掉一处,别处还有。第二层是跨头层冗余,这是本文的新贡献。论文做了一个植入事实的实验:在题目之前 1536 个 token 处埋入一个新变量(比如「设 zq = 4729」),在它和题目之间执行 15 轮随机驱逐,再检查模型能否取回这个值。

图注:(a) 一个事实只存在于单个注意力头时几乎取不回(单头 0.01–0.03),被 3 个头持有就有 0.83,8 个头全持有则是 0.99;(b) 两个需要同时用到的值分别放在不同头里,单独取回率 0.10 和 0.16,放在一起联合取回 0.31,高于两者之和(虚线);(c) 真实 MATH-500 上连续块从 1 个涨到 64 个 token 精度零损失,掉点只发生在每头剩下的块数太少时。Random Attention

面板 (a) 讲得很直白:Qwen3-4B 的 8 个 KV 头里,一个事实只存在于某个单头时几乎取不回,被 3 个头持有就能取回 83%,8 个头齐了就是 99%。这里藏着理解随机方案的关键:每个注意力头是独立掷骰子的,所以同一段轨迹会在不同头里各自留下随机的一份副本。这就像一份重要信息被抄进了好几本互相独立的笔记本,随机撕掉任何一本的若干页,总还有别的本子留着完整的句子。面板 (b) 进一步说明副本的价值是超加性的:两个需要同时用到的值分居不同头,联合取回的收益大于各自单独取回之和,跨头的副本池子比单独任何一个头都值钱。

顺带解决一个工程问题:随机抽样不必逐 token 抽。面板 (c) 显示,块状随机采样(连续块从 1 个涨到 64 个 token)在真实 MATH-500 轨迹上零损失,掉点只发生在每头剩下的块数太少时(K=1024 剩 4 块,K=512 剩 2 块)。形状是免费的,这让实现可以跟分页的内存布局配合得更自然。

两个实验拼出的结论:一旦 prompt 被保住,随机抽样仍然够用,是因为推理轨迹自带两层冗余。文本层保证「丢了这处、别处还有」,跨头层保证「每个头各留一份」。

这套结论意味着什么?——一条设计判断与三条边界

先看吞吐优势的机制。论文用 CUDA events 测过单次驱逐的开销:Random Attention 只有 0.30 毫秒(compaction 而已),TriAttention 要 1.47–1.64 毫秒(打分加 compaction)。单看很小,但服务场景把这个差距乘了起来:128 个并发请求,一次 workload 大约 6.2 万次压缩,而且压缩发生在批处理步骤之间的同步点,所有请求都在等这一次驱逐跑完。差距就这么被放大了。

于是论文立起一条系统设计判断:淘汰模块的设计目标,应该从「更准的估计」转向「更低的开销与更好的 kernel/分页兼容性」。内容无关的随机淘汰在分页缓存上格外划算:它不需要额外遍历分页状态,也不需要物化 fused attention kernel 没有保存的注意力统计。工程上最干脆的证据,是 vLLM 的 selector 实现自称「从不读 KV 内容」。把驱逐放回全景坐标系里看,它只是 KV 缓存优化地图上的一片叶子,而这片叶子的设计目标被这篇论文改写了。Random Attention 的价值不是「更聪明的淘汰器」,而是一个零假设(null hypothesis)加上一个可部署的默认值。KV 综述

诚实地说,论文同时划出了三条边界。

图注:低预算强驱逐下淘汰失效的两种真实形态:(a) 一段本应连贯的 Heron 公式推导退化成 LaTeX 符号碎片;(b) 一段几何级数讨论之后单词 may 被反复重复,两者都一路输出到长度上限才停。样本来自 Qwen2.5-Math-7B 的逐轮 best-of-N 解码轨迹。KV-Rescue

第一条是 needle-finding:一个只陈述一次、从不复述、很久之后才要用到的事实,随机方案救不回来。论文把一串口令种进轨迹,隔 57 轮压缩后再问模型,R-KV 能找回 84%,Random Attention 约等于 0。有意思的是,needle-finding 能力与整体精度并不挂钩:R-KV 是最强的 needle-finder,在主表里却只领先一列。对症下药仍然是开放问题。Random Attention

第二条是低预算:预算绷得太紧,任何淘汰器都会失控。KV-Rescue 的消融数据显示,R-KV 在 B=64 的预算下,best-of-N 的退化率从完整缓存的 2.4% 飙到 13.4%,平均解题轨迹从 27 步膨胀到 114 步,多烧了近一倍 token;预算提到 B=128,退化率就回落到 6.0%。KV-Rescue 13.4% 是 R-KV 加 7B 模型的口径,不能直接安在 Random Attention 头上,但它划出了「随机够用」的适用区间:缓冲至少要到 128。

第三条是 workload:没有放之四海皆准的答案。基准评测发现,同为压缩,CaM 在 GovReport 长文本上压缩了 14.2×,在 NarrativeQA 上压缩率却只有 1.0×,而精度走势与压缩率并不相关。压缩率不预测端到端性能,选型必须跟着 workload 走。KV-Benchmark

回到那张显存账本。几年里,打分式淘汰把所有聪明都押在「估计未来重要性」上,而这篇论文把这个押注拧成了一个问题:那些分数真买到了精度吗?答案几乎是零。真正该被优化的,也许不是留下谁,而是怎么丢得更便宜。

想深入可以读原文:Random Attention: Rethinking KV Cache Eviction for Efficient Reasoning — arXiv:2609.03430

参考文献

  1. Random Attention: Rethinking KV Cache Eviction for Efficient Reasoning(锚论文,arXiv 预印本)— https://arxiv.org/abs/2609.03430
  2. H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models(NeurIPS 2023)— https://arxiv.org/abs/2306.14048
  3. Efficient Streaming Language Models with Attention Sinks(ICLR 2024)— https://arxiv.org/abs/2309.17453
  4. Efficient Memory Management for Large Language Model Serving with PagedAttention(SOSP 2023)— https://arxiv.org/abs/2309.06180
  5. Towards Efficient Large Language Model Serving: A Survey on System-Aware KV Cache Optimization(ACL 2026 Findings)— https://arxiv.org/abs/2607.08057
  6. R-KV: Redundancy-aware KV Cache Compression for Reasoning Models(NeurIPS 2025)— https://arxiv.org/abs/2505.24133
  7. KV-Rescue: Recovering Reasoning Language Model KV Eviction Loss via Stepwise Interleaving(arXiv 预印本)— https://arxiv.org/abs/2608.15797
  8. Benchmarking KV-Cache Optimizations across Task Quality and System Performance for Long-Context Serving(arXiv 预印本)— https://arxiv.org/abs/2607.05399
  9. SalesforceAIResearch/Random-Attention(官方代码仓库)— https://github.com/SalesforceAIResearch/Random-Attention
Random Attention:随机丢 KV 缓存,精度不输打分式淘汰