VQKV:KV Cache 压缩 82% 性能几乎不降

一句话总结

VQKV 用向量量化把 KV cache 从"每个 token 存一长串浮点数"改成"存几个共享码本的索引编号",在压掉 82.8% 的缓存后仍保留 98.6% 的原始性能



一、动机

大模型在推理时会缓存每一步的 key 和 value 向量,这就是 KV cache。上下文越长,KV cache 越大,显存很快成为部署瓶颈。

现有的 KV cache 压缩方案大致分三类,但各有硬伤:

方向 代表方法 优势 痛点
Token Eviction(丢弃 token) SnapKV, H2O 压缩率高 信息不可逆丢失
Feature Dimension Reduction(降维) Palu, ASVD, MLA 保留信息较多 高压缩率时保真难,或需要额外训练
Scalar Quantization(标量量化) KIVI, KVQuant 简单直接 逐元素独立量化,忽略向量内部结构

三条路线的共同矛盾是:很难同时做到"不改模型权重"、"高压缩率"和"高保真"

作者的判断是:问题不在于"要不要压",而在于"怎么压才不把语义骨架压坏"。标量量化把每个数单独处理,就像把一幅画拆成一堆像素各自近似,没抓住整体形状。如果能整段向量一起编码,就更可能保住结构信息。

这引出了向量量化(VQ)的思路。VQ 在文本检索(FAISS)和计算机视觉(VQ-VAE/VQ-GAN)领域早已被验证过高压缩与高保真的能力,但之前很少有人将它用于 LLM 的 KV cache 压缩------主要因为 LLM 对 KV cache 极其敏感,RoPE 还会让不同维度带有不同频率特性,直接套 VQ 并不容易。


二、核心方法

2.1 核心思想:把浮点向量改写成码本索引

VQKV 不"扔掉"信息,也不简单"压扁"维度,而是把每个 KV 向量改写成几个整数索引 。原来需要存一长串浮点数,现在只需存"去第 3 本字典拿第 127 个条目、去第 4 本字典拿第 18 个条目......"这样的编号。真正的大块表示内容放在共享码本(codebook)里,很多 token 共同复用同一套码本。

2.2 残差多级码本:RSimVQ

VQKV 不是只用一个码本,而是用残差式的多级码本(Residual Simple Vector Quantization, RSimVQ)。过程可以类比画画:

  1. 码本 1 先抓大轮廓:找到最接近原始向量的条目
  2. 码本 2 修正误差:对第一步的残差再找最近条目
  3. 码本 3 继续精修:把剩余残差再压一层
  4. ......以此类推

最终重建时,把各级码本取回的条目相加:

x ^ = ∑ i = 1 N Q i [ z i ] \hat{x} = \sum_{i=1}^{N} Q_i[z_i] x^=i=1∑NQi[zi]

一口气找一个"万能近似"很难,但分几次逐级修正误差,失真就能被有效压下去。

这里有一个关键优势:残差结构天然适配 RoPE。RoPE 旋转位置编码让 key 的不同维度带有不同频率特性,向量内部结构更复杂。VQKV 的残差设计把 RoPE 引入的变化分摊到多个码本里处理,因此对 RoPE 旋转后的 key 更加稳健。

2.3 码本训练

需要澄清一个容易被误解的点:论文说的 "training-free" 是指对原模型参数 training-free ,推理时不改 LLM 权重、不需微调。但码本本身需要离线预训练

  • 从大约 1000 万 token 的 KV cache 中预取数据
  • Key 和 value 分别训练两套独立的码本
  • 训练用 OpenWebText 的 0.1% 数据,学习率 0.001,batch size 65536

训练损失包含三项:重建误差、码本更新项、以及 commitment loss,并通过 stop-gradient 保持梯度流通:

L = ∥ x − x ^ ∥ 2 + β ∥ q z − sg ( x ) ∥ 2 + γ ∥ x − sg ( q z ) ∥ \mathcal{L} = \|x - \hat{x}\|^2 + \beta\|q_z - \text{sg}(x)\|^2 + \gamma\|x - \text{sg}(q_z)\| L=∥x−x^∥2+β∥qz−sg(x)∥2+γ∥x−sg(qz)∥


三、推理流程

推理分两个阶段:prefill 和 decoding。

3.1 Prefill 阶段

VQKV 不会把所有 KV 都压掉,而是保留两段不压缩的区域:

  • 初始段 ( L i n i t = 4 L_{init} = 4 Linit=4):序列最前面的几个 token
  • 本地窗口 ( L l o c a l = 1024 L_{local} = 1024 Llocal=1024):最近的一段 token

中间那大段历史 KV 才做向量量化,改存为整数索引。直觉上,这像是把一本书的开头几页和你刚翻到的这几页原样留着,中间的大量内容改存成目录编号。

在 prefill 当下做 forward 时,仍然使用原始 KV 参与 attention(压缩只为后续存储服务)。

3.2 Decoding 阶段

Decoding 阶段的设计更讲究:

  1. 按需重建:借助 FlashAttention,VQKV 只重建当前这一步 attention 真正需要的 KV 部分,而不是每步都还原整条历史
  2. 定制 Kernel:实现了专门的 FlashAttention kernel,把"按需重建"和内核计算流程对齐,进一步减少内存占用
  3. 块级批量量化 :量化动作不是每来一个 token 就做一次,而是每隔 L l o c a l L_{local} Llocal 步做一次批量量化,大幅降低量化频率

3.3 压缩率

压缩率由码本数量和大小共同决定:

r = ( 1 − N k log ⁡ S k + N v log ⁡ S v 16 ( D k + D v ) ) × 100 % r = \left(1 - \frac{N^k \log S^k + N^v \log S^v}{16(D^k + D^v)}\right) \times 100\% r=(1−16(Dk+Dv)NklogSk+NvlogSv)×100%

实验中 LLaMA3.1-8B 使用 ( N k , N v ) = ( 56 , 16 ) (N^k, N^v) = (56, 16) (Nk,Nv)=(56,16),码本大小 ( S k , S v ) = ( 1024 , 512 ) (S^k, S^v) = (1024, 512) (Sk,Sv)=(1024,512),对应 82.8% 的压缩率。


四、实验结果

4.1 LongBench

在 LongBench 上,VQKV 在高压缩率下全面领先:

方法 压缩率 LLaMA3.1-8B 均分 LLaMA3.2-3B 均分
Full Cache 0% 33.5 32.3
VQKV 82.8%/82.4% 33.1 32.2
SnapKV - 31.7 31.4
KIVI 75.0% 30.7 29.3
Palu 80.0% 28.6 28.1
ASVD 80.0% 21.2 14.9

VQKV 在 82.8% 压缩率下保留了基线 98.6% 的性能,且在部分子任务上甚至超过了不压缩的基线。

4.2 Needle-In-A-Haystack (NIAH)

NIAH 测试"在长上下文中精准定位特定信息"的能力。VQKV 维持了完美的 100 分,和 full-cache 模型完全一致,而其他所有方法都有明显退化。这说明向量量化在保留精确检索能力上有独特优势。


4.3 RULER

在 RULER 长上下文基准上,VQKV 同样大幅领先。随着上下文增长到 32K,其他方法的性能急剧下滑,而 VQKV 仍能保持较高水准:

方法 4K 8K 16K 32K 平均
Full Cache 94.74 92.72 93.51 90.16 92.78
VQKV 92.88 89.61 87.02 79.71 87.31
SnapKV 91.18 77.12 69.80 58.52 74.16
Palu 74.70 66.01 59.80 52.44 63.24
KIVI 57.91 52.81 47.60 49.73 52.01

4.4 高压缩率下的优势

压得越狠,VQKV 的优势越明显。在 LongBench 的不同压缩率对比中:

压缩率 VQKV ASVD Palu
50% 33.5 33.6 29.7
70% 33.5 29.9 25.3
80% 33.1 21.2 28.6
90% 32.3 4.2 18.4

到 90% 压缩率,ASVD 几乎崩溃(4.2),Palu 也只剩 18.4,而 VQKV 仍维持 32.3。这说明 VQKV 的核心卖点不只是"轻微压缩时不掉点",而是"高压缩比下仍能保住语义骨架"。

4.5 显存效率

在 RTX 4090 48GB 上的实测:full-cache LLaMA3.1-8B 大约在 190K token 左右 OOM,而 VQKV 能支撑到 824K+ token ,即 4.3 倍以上的可用生成长度。在基线到顶时,VQKV 的显存占用接近只需对方的一半。


五、消融实验

码本配置的消融揭示了两个有趣的规律:

码本数量:增加码本数量能持续提升性能,但收益递减。Key 码本的性能随数量增加平滑上升后趋于饱和,而 value 码本在少量阶段就迅速提升然后快速平台化。

码本大小:放大码本也能带来增益,但同样收益递减。Value 码本在小尺寸时获益更多,key 码本则更平缓。

核心结论:value 码本对配置更敏感,key 码本更稳健。这暗示未来可以做 key/value 非对称的码本设计,给 value 分配更精细的表示预算。



六、局限与展望

论文坦率承认:解码效率仍有改进空间。虽然定制了 Triton kernel 优化时间效率,但 VQ 引入的额外计算开销还没完全解决。

基于论文结果,我认为有几条自然的延伸方向:

  1. VQ + Token Eviction 分层缓存:中间历史用 VQ 压缩,极久远部分再做 token 筛选
  2. 动态码本:从全局固定升级为按层/按头/按任务自适应分配码本预算
  3. Kernel 深度融合:继续做系统层面的优化,否则高压缩虽省显存,解码变慢太多在真实部署中未必划算

七、启发

VQKV 最大的启发是:KV cache 压缩不一定非得在"扔 token"和"降 bit 数"之间二选一。还可以换个角度,把连续向量改写成离散索引,让"共享码本"承担大部分表示能力。真正有价值的,也许不是每个 token 都带着完整拷贝,而是很多 token 共同引用一套高质量"模板库"。

第二个启发是:高压缩不是纯数学问题,而是算法和系统的协同问题。VQKV 之所以成立,不只是因为残差量化本身好用,还因为它同时考虑了 prefill/decoding 分工、局部窗口保留、FlashAttention 按需重建、块级批量量化这些工程细节。很多论文只给"压缩公式",这篇更像是在认真回答"怎么把它跑起来"。

相关推荐
慕涯AI2 小时前
Agent 30 课程开发指南 - 第18课
人工智能·python
AI周红伟2 小时前
周红伟:RAG 与知识检索
人工智能·深度学习·机器学习·语言模型·openclaw
yongui478342 小时前
基于MSP430和Zigbee技术的煤矿综合监控系统设计与实现
算法
byte轻骑兵2 小时前
【LE Audio】ASCS精讲[7]: SDP互操作落地,蓝牙音频服务发现全解析
人工智能·音视频·le audio·低功耗音频·ascs
人工智能AI技术2 小时前
Python 函数文档字符串与参数注释
人工智能
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【24】结构化输出(Structured Output)
数据库·人工智能·spring
北京耐用通信2 小时前
告别通讯掉线!耐达讯自动化Modbus转Profinet网关:工业现场的“定海神针”
服务器·人工智能·网络协议·自动化·信息与通信
Ww.xh2 小时前
ESP8266连接AI大模型完整指南
人工智能·算法·语言模型
奇思智算2 小时前
GPU 算力显存延迟核心参数解读(2026 年)
人工智能·智星云·gpu算力租用