音乐
暂未播放
QEvict:三档可恢复 KV 缓存,对抗长上下文解码中的注意力漂移

背景:长上下文推理的 KV 缓存困境#
自回归语言模型每生成一个 token,都需要用当前 query 去”翻阅”此前全部 token 的 Key 和 Value 状态。为了避免每一步都重新计算这些状态,推理框架会把它们缓存起来,这就是 KV 缓存。它的显存占用与序列长度线性增长:
MKV=2×L×Hkv×dkv×T×bdtype其中 L 是层数,Hkv 是 KV 头数,dkv 是每个头的维度,T 是序列长度,bdtype 是每个元素的字节数,系数 2 代表 Key 和 Value 各一份。代入 Llama-3.1-8B-Instruct 的参数(32 层、GQA 下 8 个 KV 头、头维 128、FP16 存储),每个 token 的 KV 状态是 2×32×8×128×2=131072 字节,即 128 KB。于是 32K 上下文单条序列占 4 GB,128K 占 16 GB;batch 为 32 时,32K 上下文的 KV 缓存可达 128 GB,远超 8B 参数权重本身的约 16 GB。QEvict 论文的实测数据也印证了这一点:Llama-3.1-8B-Instruct 在 FlashAttention-2 后端、batch 32、256 token 预填充加 1024 token 生成的任务下,Full-KV 的峰值显存为 29.54 GB。
KV 缓存取代权重成为显存主体之后,长上下文服务的成本结构被彻底改变:显存决定了单卡能塞下多大的 batch,进而决定了吞吐和单位 token 成本。压缩 KV 缓存于是成了 2024 年以来推理优化最活跃的方向之一,目前有两条成熟的技术路线:淘汰(eviction) 和 量化(quantization)。QEvict(arXiv:2608.05326,2026 年 8 月 5 日提交)做的事情,是先用量化诊断揭示这两条路线的共同盲区,再给出一种把两者结合起来的缓存层级设计。
两条技术路线与各自的盲区#
淘汰路线:保留重要的,丢弃其余的#
淘汰方法维护一个重要性打分,周期性地把得分低的 token 从缓存中删掉,从而把缓存限制在固定预算内。这条路线的发展脉络很清楚:
- StreamingLLM 最早发现 attention sink 现象:序列开头的几个 token 会吸引异常高的注意力权重,因此保留开头若干 token 加最近的 token 窗口,即可在无限长序列上维持生成。它的缺陷是几乎不保留中段信息,检索类任务表现很差。
- H2O 用累计注意力找出 heavy hitters(重击者),保留历史上累计被关注最多的 token。
- SnapKV 用 prompt 末尾的观察窗口对前面的每个 token 投票,选出对回答最关键的 KV 对。
- Ada-KV 指出不同注意力头的重要性分布不同,把压缩预算在头之间自适应分配。
- CriticalKV 从输出扰动最小化的角度重新推导了打分函数:关键性不止取决于注意力权重,还取决于 Value 范数与投影矩阵的乘积,重要度应为”注意力权重 × 投影后的 Value 范数”。
- DefensiveKV 及其层间变体 Layer-DefensiveKV 进一步考虑未来注意力的不确定性,在打分时防御性地保留”可能变得重要”的状态,是 QEvict 论文中综合最强的淘汰基线。
StreamingLLM 发现 attention sink 现象时给出的可视化很直观:Llama-2-7B 在底层之外的所有层和所有头上,都把异常高的注意力权重投给了序列开头的第一个 token——尽管这个 token 对语言建模任务几乎没有任何语义相关性。这正是 QEvict 保留 5 个 sink token 作为受保护前缀的源头依据。

StreamingLLM 的解决方案也奠定了淘汰路线”保护前缀 + 滚动窗口”的基本范式,与 Dense Attention、Window Attention、滑动窗口加重计算三种既有做法形成对照:

这些方法的进步集中在”打分更准”和”预算分配更细”上,但共享两个结构性缺陷。第一,决策是二元且不可逆的:一个 token 要么全精度保留,要么永久删除。一旦某个状态在当前 query 下显得不重要而被删除,它就从物理上消失了——而它的相关性完全可能在之后的解码中重新出现。第二,token 级独立决策会打碎局部连贯的语境。自然语言具有局部词汇、实体与篇章层面的连贯性,指代消解、共指关系都依赖相邻 token 的状态;逐个 token 独立打分会把一个连贯的语义片段拆得七零八落:保留了孤立的高分 token,却扔掉了理解它所必需的邻近状态。
量化路线:保住全历史,但精度一刀切#
量化方法不做删除,而是把 KV 状态以低比特存储:
- KIVI 提出非对称 2bit 量化:Key 缓存按通道量化(隔离少数幅值巨大的异常通道),Value 缓存按 token 量化;同时保留最近 128 个 token 的 FP16 残差缓存。
- KVQuant 在 2/3/4bit 上引入 pre-RoPE 量化、非均匀分桶和约 1% 离群值的稀疏高精度存储,面向千万级上下文。
- ZipCache 给每个 token 分配显著性相关的精度,4bit 配置约消耗全精度缓存 22% 的显存。
量化路线的问题同样明显:全历史低比特保留固然覆盖广,但精度分配是静态的——要么全局统一,要么按显著性一次性定死。它没有一个机制去联合管理”哪些状态驻留在缓存里”和”驻留的状态以什么精度存储”,也没有能力在解码过程中动态把某个状态从低精度调回全精度。
论文把两条路线的盲区归纳成一个设计缺口:如何在激进压缩 KV 缓存的同时,保留那些”相关性尚未显现”的连贯历史区域? 要回答这个问题,先得量化一个此前很少被认真测量的现象——注意力漂移。
三个诊断:量化注意力漂移#
QEvict 论文的第一部分是一组诊断实验,目的是回答:淘汰策略的”重要性是稳定的”这一隐含假设,到底有多可靠?
诊断设置很具体:Llama-3.1-8B-Instruct,512 token 预填充加 256 token 生成,20% KV 缓存预算,保护 5 个 sink token。对照四种缓存策略:R1 是 token 级淘汰(窗口大小 Ω=1);R2 是窗口大小 Ω=8 的两档窗口淘汰;R3 与 R4 是三档策略,窗口分别为 8 和 32。R2 与 R3 窗口大小与实测缓存预算相同,构成”二元淘汰 vs 可恢复低比特保留”的受控对比。
观察一:窗口化让缓存决策稳定一个数量级#
第一个诊断指标是 Future Missed Mass(FMM,未来错失质量):在路由事件 r 时被策略丢弃的历史状态,在未来 H 步内本应获得的注意力占全部注意力的比例。形式上,用 Aτℓ,h(i) 表示 FullKV 参考模型在第 τ 步、第 ℓ 层、第 h 个头上分配给历史 token i 的注意力概率,Erℓ,h 表示路由事件 r 时被策略丢弃的位置集合,则:
FMMHℓ,h(r)=τ=r+1∑min(r+H,T)i≤r∑Aτℓ,h(i)τ=r+1∑min(r+H,T)i∈Erℓ,h,i≤r∑Aτℓ,h(i)分子只统计”在路由事件 r 时已经存在、且被丢弃”的状态在未来接收到的注意力,分母是未来全部历史注意力。FMM 越低,说明淘汰决策丢掉的未来信息越少。实验取 H=32。
第二个指标是 Selection Churn(选择动荡):相邻两次路由事件保留集合的 Jaccard 距离。记 Rrℓ,h 为路由事件 r 后保留的历史位置集合(窗口选择展开为 token 位置再比较,受保护的 recent 区因确定性滑动而不计入):
Churnℓ,h(r)=1−Rrℓ,h∪Rr+1ℓ,hRrℓ,h∩Rr+1ℓ,h结果:token 级淘汰 R1 的 FMM 高达 51.73%,即被丢掉的 token 在未来仍贡献了一半以上的注意力;窗口化后 R3 降到 46.38%,R4 为 47.38%。更关键的对照是 R3 的”仅全精度档”消融:把量化档视为不可访问后,FMM 飙升至 60.19%——这说明被存进量化档的那批窗口在未来是真正被用到的,量化档保住了大量本会被淘汰的未来注意力。Churn 方面,R1 每次路由事件 0.0170,R3 只有 0.0012,下降超过一个数量级;而窗口更大的 R4 反升到 0.0180,说明窗口化抑制了短命的打分波动,但窗口过大并不会让选择更稳,反而牺牲了分配粒度。

观察二:二元淘汰丢掉了一个有用的“中间地带”#
R2(两档)与 R3(三档)在相同窗口大小和字节预算下,对 FullKV 参考注意力质量的分配截然不同:R2 把 33.3% 的注意力质量保留在全精度、64.8% 永久淘汰(受保护的 local 区占 1.9%);R3 则全精度保留 19.7%,另用 INT2 档保留 42.6%,被永久淘汰的份额降到 35.7%——淘汰份额减少了 29.1 个百分点。也就是说,存在一个“不够格进全精度、但删了又可惜”的中间地带,低比特中间档恰好接住了它。

随之而来的问题是:量化档的窗口还要继续参与打分和排名,2bit 的排序信号可靠吗?论文用 Quantized-Score Agreement(QSA) 度量 INT2 执行下窗口分数与 FullKV 分数的余弦相似度:
QSA(r)=∥srQ∥2∥srFull∥2⟨srQ,srFull⟩平均余弦一致度 0.9824(首个路由事件 1.0000,最后一个 0.9676;逐头最差 0.7874),说明 INT2 基本保持了窗口间的相对排序;但注意力质量比 RQ 只有 0.8660,即低比特执行的注意力幅值整体衰减。结论是:量化档适合继续参与排名,但注意力数值不等于全精度——这正是”可恢复”设计必须考虑的误差来源。
观察三:重要性持续,但并非静止#
第三个诊断是 Global LIR(Local Importance Reactivation,局部重要性复活):一个窗口连续 m 个路由事件不在全精度集合内,之后又在任意后续路由事件重新进入全精度集合的比例。设 Xr,w∈{0,1} 表示窗口 w 在路由事件 r 是否处于全精度集合,一段”不活跃期”是 Xr,w=0 的最大连续序列,持续 m 个事件后该不活跃期成为”有资格”样本:
GlobalLIR(m)=#{持续 m 个事件不活跃的窗口期}#{持续 m 个事件不活跃、之后又重回的窗口期}论文取 m=3。结果极具说服力:R3 配置下,oracle(按 FullKV 排名选出的理论最优全精度集合)的复活率只有 0.98%,说明真正重要的窗口确实长期稳定;但实际部署策略选出的全精度集合复活率高达 6.18%,是 oracle 的 6.3 倍——近似打分和受限预算制造了大量”误降级”,这些窗口稍后必须回来。中位回归时间是 8 个路由事件,换算成 Ω=8 的解码步数约为 64 步,即复活的延迟远超出紧邻的下一次路由。
配合滞后转移概率 Pab(Δ)=Pr[Xr+Δ,w=b∣Xr,w=a](a,b∈{0,1},Δ 为滞后的事件数),动态图景就完整了:从量化档回流全精度的 P01 从 Δ=1 时的 0.31% 升到 Δ=8 时的 2.39%;反向流出的 P10 从 3.05% 升到 22.12%。在 Δ=8 处,流出频率是回流的 9.3 倍。这就是注意力漂移的微观画像:大部分重要窗口稳定,但有一个不可忽略的子集反复进出活跃集合;降级是高频操作,回流低频但确实发生。因此缓存系统必须支持频繁降级,同时为低频回流保留恢复的可能性——这正是”可恢复淘汰”的动机。
QEvict 的三档层级:设计详解#
三个观察直接映射为三个设计选择:以连续窗口为路由单元(对抗 token 级碎片化与 Churn)、在保留与删除之间插入可恢复的低比特中间档(接住中间地带)、允许双向迁移(应对复活)。QEvict 的形式化如下。

问题形式化#
对第 ℓ 层、第 h 个头,解码步 t 的 query qtℓ,h 在可访问的 KV 状态上做标准注意力:
atℓ,h=softmax(dkvqtℓ,h(Kacc,tℓ)⊤),otℓ,h=atℓ,hVacc,tℓ其中 Kacc,tℓ、Vacc,tℓ 是当前可访问状态的拼接,dkv 是头维,softmax 的分母 dkv 是标准缩放。QEvict 的压缩对象就是这两个矩阵的规模与精度。
缓存被划分为受保护的 sink 前缀 S、recent 区 Lt,以及被切分为连续窗口的历史区。对每个历史窗口 w,QEvict 在每个路由事件为其分配一个三档状态 ztℓ(w)∈{Full,Quantized,Evicted},并满足字节预算约束:
Bsink+Blocal+w∈Wt∑[1[ztℓ(w)=Full]Mf(w)+1[ztℓ(w)=Quantized]Mq(w)]≤Btotal这里 Bsink、Blocal 是 sink 与 recent 区的固定开销,Mf(w)、Mq(w) 分别是窗口 w 的全精度与量化存储成本,1[⋅] 是指示函数。注意这个约束的特别之处:它同时决定驻留和精度——这是与所有此前方法(要么只选子集、要么只降精度)的本质区别。
累计窗口打分#
窗口重要性用累计注意力定义。路由事件 t 时,窗口 w 的分数更新为:
Sˉtℓ(w)=Sˉt−Ωℓ(w)+Hq1h=1∑Hqτ=t−Ω+1∑ti∈w∑aτℓ,h(i)含义逐项解释:aτℓ,h(i) 是解码步 τ 时第 h 个 query 头分配给 token i 的注意力概率;内层求和把窗口内所有 token 在过去 Ω 步收到的注意力累加起来;外层对 Hq 个 query 头取平均——GQA 架构下 KV 头数量远少于 query 头,对 query 头平均能让每个 KV 头视角的打分彼此可比;最后加上上一次路由事件的累计值 Sˉt−Ωℓ(w),形成跨越整个解码过程的累计分数。使用累计量而非瞬时量的原因在于:单步注意力噪声很大,累计天然平滑;这与 H2O 的 heavy hitter 思路一脉相承,但被放到了窗口粒度上。论文强调打分函数只是提供排序,层级结构本身不依赖具体打分器——附录 J 验证了换用其他重要性估计器后层级依然成立。路由每 Ω 个生成 token 触发一次(默认 Ω=8),新生成的 token 先进入受保护的 recent 区,离开 recent 区后才进入历史候选池。
字节约束下的档位分配#
扣除保护区后,剩余历史预算 Bhist 按比例 q 分给两档。窗口容量分别为:
Kf=⌊Mf(1−q)Bhist⌋,Kq=⌊MqqBhist⌋默认 q=0.70:70% 的历史预算给量化档,30% 给全精度档。为什么量化档拿大头?因为 INT2 窗口的字节成本约为 FP16 的 1/8,同样的字节预算能容纳约 8 倍数量的窗口;把预算七三分,得到的窗口数量比反而更悬殊——量化档以少量字节保住历史的主体,全精度档只留给分数峰值。Mf、Mq 都是字节级记账,包含压缩码、量化参数、位置信息和持久索引状态(附录 B.4/B.5),而不是粗略地用比特数估算。
动态路由与恢复#
路由事件 t 的候选池由三部分组成:
Wtcand=Ft−Ω∪Qt−Ω∪Ltaged即上一事件的全精度档 Ft−Ω、量化档 Qt−Ω,以及刚离开 recent 区的新历史窗口 Ltaged。候选按累计分数排序后依次分配:
Ft=TopKKf(Wtcand;Sˉtℓ),Qt=TopKKq(Wtcand∖Ft;Sˉtℓ),Et=Wtcand∖(Ft∪Qt)状态机随之确立:
Full⇄Quantized⟶Evicted全精度与量化档之间可以双向迁移,但淘汰是单向的:只有排在 Kf+Kq 总容量之外的窗口才被永久删除。量化档的窗口照常参与注意力并持续累计分数,所以某个窗口的重要性回升时,它能在后续路由事件中被重新选进全精度档;反之,全精度窗口分数下滑就降级进量化档。“删除”从一次性判决变成了”降级—恢复—晋升”的动态过程,只有真正长期垫底的窗口才会走到物理删除。
两个保护区的设计也值得解释。sink 区固定 5 个 token:attention sink 是 StreamingLLM 以来反复验证的现象,开头 token 承载大量位置无关的注意力,必须常驻。recent 区固定 32 个 token:刚生成的 token 累计分数天然落后(被关注的历史短),若不设保护区,它们会被”资历歧视”误淘汰;同时 recent 区确定性滑动、不参与打分,也避免了它污染 Churn 统计。
量化中间档与一次性量化台账#
量化档是整套设计的物理基础,它的两个技术细节决定了”可恢复”是否真的可行。
非对称量化:Key 按通道,Value 按 token#
QEvict 沿用 KIVI 的非对称结论:Key 和 Value 的数值分布完全不同,必须用不同的量化粒度。Key 缓存中存在少数幅值巨大的异常通道——某个通道的分量在几乎所有 token 上都很大。若按 token 量化,这些通道的巨幅误差会波及所有 token 的注意力分数;按通道量化则把误差限制在异常通道自己身上,正常通道不受污染。因此 Key 按通道跨 token 维度量化。Value 缓存没有明显的通道异常模式,但 Value 在注意力输出中是按 token 加权求和进 ∑iaivi 的,按 token 量化可以把量化误差限制在每个 token 内部,与 softmax 权重的混合方式相容。因此 Value 按 token 跨通道维度量化。这一选择直接关系到观察二中的 QSA 0.9824:排序信号在 2bit 下依然可靠,靠的就是把误差引导到对排序破坏最小的方向上。
pre-RoPE 存储与位置恢复#
Key 的另一个细节是旋转位置编码。QEvict 把量化档的 Key 保存在 pre-RoPE 域——即施加 RoPE 旋转之前的原始 Key,同时保存其原始绝对位置;窗口晋升或参与注意力时,先解量化,再按原始位置重新施加 RoPE。这沿用了 KVQuant 的洞见:对旋转前的整数域值做量化,误差不会经过旋转矩阵的混合与放大,最终注意力上的误差更小、更可预测;保存原始位置则保证重旋转使用的是与训练一致的位置编码,而不是”存储时的相对偏移”这类近似。
一次性量化台账:让往返不再累积误差#
双向迁移带来一个此前不存在的问题:误差复合。一个窗口被降级(量化)→ 晋升(解量化)→ 再降级,如果每次都重新量化”重建后的值”,量化误差就会在每次往返中层层叠加,最终与原始状态越走越远。QEvict 用一次性量化台账(write-once quantization ledger) 解决:窗口第一次进入量化档时执行量化,产生的编码和量化参数被持久保存;晋升时解量化重建的是同一份低比特近似;之后再降级时直接复用台账里的编码,而不是对重建值重新量化。这样无论窗口在档位间往返多少次,量化误差只引入一次,误差路径与”一直待在量化档”完全等价。台账的持久索引状态也被计入 Mq 的字节成本——这正是字节级记账的意义所在:台账不是免费的。
INT2 与 INT4 的取舍在附录 G 的灵敏度分析中有明确结论:INT2 在固定字节预算下容纳约两倍数量的窗口,历史覆盖更广;INT4 单窗口误差更小但覆盖减半。三个基准上的结果都偏向 INT2,说明在 5%–20% 这种紧预算下,覆盖比精度更值钱。
执行路径#
推理时的执行分两种模式。常规解码走 FlashAttention-2;但 FA2 不物化注意力矩阵,拿不到打分所需的注意力概率,因此 prefill 初始化与每次路由事件改用标准 SDPA,专门物化一次注意力分数用于窗口打分。注意力计算前,活跃的量化窗口被解量化、Key 按原始位置重旋转,全部可访问状态按时间顺序恢复后再拼接。实现原生支持 GQA 架构。
实验:三个基准 × 三个模型#
评估覆盖 Llama-3.1-8B-Instruct、Qwen2.5-7B-Instruct、Mistral-7B-Instruct-v0.2 三个模型家族,LongBench(12 个任务,5%/10%/20% 预算)、RULER(32K 上下文,20% 预算)、GSM8K(10%–80% 预算扫描)三个基准。默认配置统一为 Ω=8、5 个 sink token、32 个 recent token、INT2 量化档、q=0.70。淘汰基线在匹配的实测内存预算下比较,量化基线在其各自的内存-性能工作点比较,避免”纸面比特数”和”实测字节数”之间的口径差异。
LongBench:预算越紧,优势越大#
在 20% 预算下,QEvict 宏平均 46.4(Llama)/ 37.8(Mistral),最强匹配内存淘汰基线为 44.0 / 37.4;在 5% 预算下优势扩大到 +9.7 / +4.7 分——这正是可恢复低比特保留在极端预算下的价值:预算紧到全精度档只能装下极少数窗口时,量化档成了保住历史覆盖的唯一手段。与量化基线的对比同样有说服力:10% 预算下,QEvict 只用约一半的 KV 显存,与最强量化基线的差距仅为 1.2(Llama)/ 1.8(Mistral)分。论文报告六个模型-预算组合(两模型 × 三预算,Qwen 见附录)中 QEvict 的宏平均全部最高。
论文附录还给出了按任务族拆分的 LongBench 性能-内存 Pareto 曲线(图 4,以 Llama-3.1-8B-Instruct 为例)。以多文档问答(Multi-Document QA)为例,左列对比淘汰基线、右列对比量化基线:无论在哪个方向,QEvict 都在同等内存占用下位于 Pareto 前沿的上方——它以更少的 KV 显存达到与 FullKV 更接近的准确率,且预算越紧、相对领先越明显。


RULER 32K:检索密集场景的量化档红利#
RULER 的 13 个子任务专门考验长程检索与信息聚合。QEvict 宏平均 87.6:比最强匹配内存淘汰基线 Layer-DefensiveKV(86.4)高 1.2 分,比最强近似内存量化基线 ZipCache-4b(约 79.0)高 8.6 分,距未压缩 Full-KV 参考线(约 90.0)仅差 2.4 分。单看 Needle-in-a-Haystack(大海捞针):QEvict 43.98,SnapKV 只有 14.56,StreamingLLM 几乎归零(0.04),CriticalKV 26.80,最强的淘汰基线 Layer-DefensiveKV 也只有 17.86——只有 QEvict 和 ZipCache-4b(44.80)保持了可用的捞针能力。直觉很清楚:针在 prompt 中的位置对提前打分几乎是不可见的,任何淘汰策略都有大概率把它删掉;而量化档”宁可低比特也全留着”的哲学天然适合这类”不知道哪个 token 未来有用”的任务。
一个值得注意的细节是 KVQuant-2b 在捞针子任务上拿到 64.27,高于 QEvict——它的 dense-and-sparse 方案把约 1% 的离群值全精度保留,恰好保住了孤立的针。但 KVQuant-2b 在多键追踪等任务上大幅失分(MK-2 仅 52.55 vs QEvict 97.00),宏平均反而垫底。这再次说明长上下文压缩没有单点最优解,“全保留低比特”在部分子任务上有奇效,但缺乏对重要区域的动态全精度保护。
GSM8K:推理链中的微型注意力漂移#
GSM8K 序列短,但多步推理要求缓存系统保留”稍后会再次变得相关”的中间状态——这是注意力漂移的微观样本。为此论文把 25% 的持久预算留给 recent 区。结果触目惊心:10% 预算下,所有淘汰基线几乎全军覆没(Llama 上 SnapKV 1.90、AdaKV 2.20、CriticalKV 3.26、Layer-DefensiveKV 3.18,最强不过 3% 出头),QEvict 是 11.45;20% 预算下 QEvict 79.09,最强的淘汰基线 Layer-DefensiveKV 只有 31.16。推理链一旦展开,把任何一步的中间状态删掉都可能让后续推导断裂,而 QEvict 的量化档把全部中间状态以 2bit 保留了下来。40% 预算时 QEvict 85.44,已接近 Full-KV 的 86.93。
与量化基线的对比则要诚实得多:20% 内存下 KIVI-2b 79.98 与 QEvict 79.09 基本持平,ZipCache-4b(约 22% 内存)84.46 甚至略高。原因在于 GSM8K 序列短、全量低比特的覆盖优势足以维持推理质量,QEvict 的全精度保护反而不占便宜。这个对照把 QEvict 的适用边界说清楚了:短序列上全局量化依然是有力对手,QEvict 的主场是长上下文加紧预算。

低预算下淘汰基线近乎崩溃、QEvict 显著领先的图景,在另外两个模型家族上同样成立:


端到端效率:显存与吞吐的后端分野#
效率测试(Llama-3.1-8B,256 预填充 + 1024 生成,batch 32,默认配置)呈现了鲜明的后端差异。FlashAttention-2 后端下,峰值显存从 29.54 GB 降到 20.78 GB(−29.7%),但吞吐从 535.11 掉到 218.05 tok/s——路由所需的 SDPA 物化、解量化与缓存重建的开销吞噬了节省显存带来的收益。eager/SDPA 后端下则是全赢:TTFT 692.4 vs 689.3 ms(+0.5%,基本无感),TPOT 从 84.05 降到 76.26 ms(−9.3%),吞吐 379.26 提升到 416.44 tok/s(+9.8%)。机制在于:eager 模式下注意力本就是逐 token 计算的,QEvict 淘汰掉的窗口直接减少了被注意的 token 数,省下的计算大于路由开销;FA2 模式则相反,路由强制回退到物化路径,把融合 kernel 的优势抵消了。论文对此的结论很清醒:低比特注意力与路由的融合 kernel 是同时拿到”显存红利”和”吞吐红利”的前提。
局限与未来方向#
第一,FA2 后端的吞吐回归是当前实现最大的工程短板。每次路由事件都要物化注意力分数、解量化、按时间序重建缓存,还带来临时 workspace 开销。论文给出的路线是把解量化、旋转位置编码、混合精度注意力直接融合进 FlashAttention 类 kernel,让量化档在低比特域直接参与注意力,而不是先解量化再计算。
第二,窗口是固定大小的连续切分。自适应窗口边界——让窗口沿语义边界而非固定长度切分——尚未探索。固定窗口在语料边界不规则时仍可能割裂语义单元,这是观察一中”窗口化有效”结论的自然延伸。
第三,打分依赖显式注意力概率,这也是 FA2 路径受损的根源。附录 J 展示了层级对打分器的兼容性,但替代估计器(低成本的近似重要性度量)如何在生产中落地、能否完全免除 SDPA 物化,仍是开放问题。
第四,评估集中在 decoder-only 模型;编码器-解码器结构、跨模态模型的 KV 管理不在范围内。
第五,截至本文写作(2026 年 8 月),论文尚未公开代码实现,上述效率数字均来自论文自报。要与 2026 年同期的其他路线(训练无关的稀疏注意力、熵指导的自适应推理等)做公平的端到端对比,开源实现是必要前提。
从更宏观的视角看,QEvict 回答了一个 2024 年以来悬而未决的问题:淘汰与量化两条路线争了两年,各自在部分基准上占优,而 QEvict 的答案是把它们变成一个层级系统的两个状态——淘汰是量化的终点,量化是淘汰的缓冲。注意力漂移的量化证据(6.18% 的复活率、9.3 倍的流出回流比)则说明,任何把 KV 缓存管理当成静态优化问题的思路,都低估了解码过程的动态性。
小结#
QEvict 的贡献可以概括为”一个诊断、一个架构、一个工程机制”。诊断层面,Future Missed Mass、Selection Churn 与 Global LIR 首次把注意力漂移从模糊直觉变成可测量的事实:token 级二元淘汰浪费了超过一半的未来注意力,而重要性复活的窗口约占全精度集合的 6%。架构层面,三档层级(全精度 / INT2 可恢复 / 淘汰)把”删与不删”的二值判决改写为字节预算下的联合驻留-精度分配,窗口化路由把选择动荡降低一个数量级。工程层面,一次性量化台账以极小的记账成本换来了”任意次往返、只引入一次量化误差”的干净性质。实验上,它在紧预算长上下文场景对最强淘汰基线最多领先 9.7 分,在 RULER 32K 上逼近全精度参考线;同时也诚实地暴露了 FA2 后端吞吐回退的工程代价。对正在设计长上下文推理服务的人来说,QEvict 最有价值的部分或许不是某个具体数字,而是它把 KV 缓存管理从”静态压缩”重新定义为”动态分级存储”的问题——这正是后续融合 kernel 与自适应窗口工作的起点。
参考资料#
- QEvict: Recoverable Quantized KV Eviction for Attention-Drift-Robust Long-Context Decoding
- QEvict 论文全文(HTML 版)
- Efficient Streaming Language Models with Attention Sinks(StreamingLLM)
- H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models
- SnapKV: LLM Knows What You are Looking for Before Generation
- Ada-KV: Optimizing KV Cache Eviction by Adaptive Budget Allocation for Efficient LLM Inference
- CriticalKV: Optimizing KV Cache Eviction from an Output Perturbation Perspective
- DefensiveKV: Taming the Fragility of KV Cache Eviction in LLM Inference
- KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache
- KVQuant: Towards 10 Million Context Length LLM Inference with KV Cache Quantization
- ZipCache: Accurate and Efficient KV Cache Quantization with Salient Token Identification(官方实现)
- FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning
- LongBench: A Bilingual, Multitask Benchmark for Long Context Understanding
- RULER: What’s the Real Context Size of Your Long-Context Language Models?
- Training Verifiers to Solve Math Word Problems(GSM8K)
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分内容可能已过时
评论区
分享你的想法,与大家交流讨论
音乐
暂未播放



