跳转到内容

VeriCache: Turning Lossy KV Cache into Lossless LLM Inference — 有损压缩草稿,无损输出验收

待复核

VeriCache 是一套 LLM 推理框架:允许你用有损的 KV cache 压缩(丢 token、量化)去快速草稿下一串 token,再用完整 KV cache 验收;验收不过就改掉,最终输出与「全程用满血 KV」一致(论文在 greedy / 温度 0 下定义 identical)。

日常类比:考试时先用缩印小抄飞快写草稿,再用原版教材逐行核对——小抄错了就改,交卷内容必须和教材一致。小抄省时间,教材保正确。

它建在 vllm 与 LMCache 上,覆盖长上下文 decode 与远程前缀缓存;统一 compressor 接口可挂多种丢 token / 量化方法,也可与传统投机解码叠用。相对满血 KV,吞吐最高约 (长上下文)/ (远程前缀),输出不变。

读者只需记住一句话:压缩负责快,满血负责对;GPU 上常驻的是小抄,原版教材大多放在 CPU/远端,验收时才搬进来。

不理解 VeriCache,下面这些事会对不上:

  • 为什么「压缩后 F1 还行」却在代码生成 / tool calling 里功能正确率崩盘——偏差会随解码步数累积
  • 为什么只靠有损 KV 服务长输出,会悄悄写出语法错、参数错的「看起来通顺」的答案
  • 为什么「像投机解码」还不够:满血 KV 若一直占 GPU,压缩省下的显存与带宽就吐回去了
  • 为什么草稿走 HBM、验收走 PCIe/网络时,错峰调度能把两条瓶颈叠在一起跑
  • 为什么同一套调度能挂七种压缩器:接口统一后,换 KVzip / TurboQuant 不必重写验收流水线
  1. 有损草稿 + 满血验收:类比小抄写、教材改。用 KV_comp 自回归草稿 x 个 token,再对这 x 个位置做一次满血前向;第一个不一致处起改用满血预测,后面草稿作废。压缩方法只当加速器,不当最终裁判。

  2. 跨资源错峰(cross-resource staggering):类比厨房一边炖汤一边洗碗——草稿吃 HBM 带宽,验收吃互联带宽 + 算力。请求别齐步「全体草稿再全体验收」,而是有人草稿、有人验收,资源互补。

  3. 拉长验收周期:压缩 KV 与满血同权重、注意力模式接近,一轮常能接受 25–40 个 token(传统小模型草稿往往只有 2–3)。验收越稀,满血 KV 换入次数越少,压缩收益才站得住。

把三点串起来:算法上是「投机式正确性」;系统上是「别让满血 KV 常驻 GPU」;调度上是「用长接受串摊薄换入」。

案例 1:草稿–验收–接受循环(概念)

Section titled “案例 1:草稿–验收–接受循环(概念)”
# 伪代码:同一模型权重,两份 KV
draft = []
while need_more_tokens:
for i in 1..x: # 用压缩 KV 在 GPU 上草稿
draft.append(next_token(KV_comp))
# 并行:从 CPU/远端把 KV_full 换入
preds = verify_forward(KV_full, draft) # 一次前向核对 x 个位置
accept_prefix_until_first_mismatch(draft, preds)
resume_from_last_accepted()

逐部分解释

  • KV_comp 常驻 GPU,负责快;KV_full 多在 CPU/存储,验收时才换入
  • 不一致处用满血 token 纠正,保证与满血 greedy 轨迹对齐
  • x 个全对,还可收下满血给出的「多一个」bonus token,再继续草稿
  • x 越大,越能摊薄每次换入成本,但拒收多了会浪费草稿

案例 2:长上下文——满血 KV 放 CPU

Section titled “案例 2:长上下文——满血 KV 放 CPU”
# 每请求:GPU 上只留压缩 KV;满血 KV 在 host DRAM
GPU: KV_comp = compress(KV_full) # 例如 1/4 体积
CPU: KV_full
# 调度:batch 里错开谁在 verify,避免 PCIe 上同时搬多份满血 KV
# 直觉:10 个请求、x=30 → 大约每 3 轮草稿才轮到 1 个请求验收

逐部分解释:HBM 留给更多请求的压缩 KV,提高 batch;验收时再短暂装入满血 KV。论文例子:草稿吃 HBM,验收吃 PCIe,错峰后峰值显存与链路都不易被「齐步验收」打爆。齐步若一次搬 10 份满血 KV,互联会堵、HBM 会尖峰。

案例 3:远程前缀缓存——慢链路只传压缩 KV

Section titled “案例 3:远程前缀缓存——慢链路只传压缩 KV”
# 存储侧有本地 GPU 做验收;远端 serving GPU 只拿压缩 KV 草稿
slow_link.send(KV_comp) -> remote_drafter
fast_link.load(KV_full) -> local_verifier
# 每 x 个草稿 token:远端草稿 ∥ 本地预取满血 KV,再本地 verify
# 远端等验收结果时,可切去给 batch 里别的请求继续草稿

逐部分解释:瓶颈在慢存储链路时,先传小体积压缩 KV 就能开写;满血 KV 走快链路给本地验收。启动可快约压缩比 c 倍,整体吞吐论文报告最高约 。关键是草稿与验收落在不同硬件,天然可流水线。

  1. 把有损 KV 的输出直接当最终答案:短答可能「看起来还行」,长代码 / 结构化调用里错误会指数级放大。
  2. 齐步投机(全体草稿再全体验收):PCIe/网络瞬间挤满,满血 KV 在 HBM 里排队空等,压缩收益被吃光。
  3. 验收周期太短:每 2–3 token 就换入满血 KV,等于没享受「长接受串」;应随接受率拉长 x
  4. 只看 token 级指标(F1/ROUGE):功能正确率可能已接近 0,指标仍漂亮——验收任务要用语法/参数级度量。
  5. 把 VeriCache 当成「又一个压缩算法」:它不替代压缩,而是给已有压缩器加一层无损外壳;没有 compressor,它无从草稿。

适用

  • 长上下文 decode,显存/HBM 带宽被满血 KV 卡住,又能接受「CPU 存满血、GPU 跑压缩」
  • 远程前缀缓存,慢链路传全量 KV 太贵,想先传压缩稿再本地验收
  • 代码生成、tool calling、结构化输出等必须与满血轨迹一致的场景
  • 已有丢 token / 量化压缩器,想通过统一接口变成「无损加速层」

不适用

  • 短输出、开放生成,且能接受有损分布——直接压缩可能更简单
  • 无法把满血 KV 放 host/远端、或互联极慢导致验收永远盖不住草稿
  • 需要与满血采样分布在非 greedy 设定下「感觉一样」但又不做标准拒绝采样扩展时(论文主声明在 greedy identical)
  • 压缩器与满血注意力差极大、接受率极低——长草稿窗口会变成频繁拒收
  • KV 变大:上下文冲到十万~百万 token,单请求带宽与多请求 batch 都被 KV 体积卡住。
  • 有损压缩潮:丢 token(H2O、SnapKV、DuoAttention、KVzip…)与量化(KIVI、KVQuant、TurboQuant、CacheGen…)把体积砍到约 2–5×,但输出会漂。
  • 投机解码近亲:MagicDec / QuantSpec / SparseSpec 等用稀疏或压缩 KV 草稿,但常把满血 KV 留在 GPU,压缩的系统收益有限。
  • VeriCache(2026):把满血 KV 挪出 GPU、错峰换入,并统一多种压缩器;基于 vLLM + LMCache 做出「吞吐上去、输出不变」。
  • 对照记忆:若你只记得「投机解码」,请再加一条——这里的草稿与验收共用同一套权重,系统收益来自资源错峰,不只来自「小模型猜、大模型改」。
  1. 压缩可以当草稿引擎,不必当最终分布——正确性交给满血验收
  2. 系统瓶颈要配对:HBM-bound 草稿 ∥ 互联-bound 验收,比齐步投机更吃得开硬件
  3. 接受串长度是杠杆:同模型压缩草稿能拉到几十 token,才摊得起满血换入
  4. 指标要对齐任务:功能正确率崩了,F1 高也没用
  5. 接口比单点算法更值钱:统一 compressor 后,新压缩方法可以「即插即加速」而不改调度
  • vllm —— VeriCache 实现所基于的高吞吐推理引擎
  • paged-attention —— 分页 KV 如何让长上下文装进 GPU
  • paged-attention-vllm —— vLLM 侧 PagedAttention 工程落地
  • oscar-int2-kv —— INT2 KV 量化;可想象成 VeriCache 可挂的一类 compressor
  • kv-fold —— 另一条长上下文路线:不压缩,而把 KV 当 fold 累加器
  • eagle —— 投机解码家族;VeriCache 借用「草稿+验收」但系统约束不同
  • prefix-cache-policy-2026 —— 前缀缓存策略;与远程 prefix 场景对照

(暂无反向链接)