显存里的隐形巨兽:KV Cache 优化技术全景拆解
为什么 100 万 token 上下文的推理常常"显存先于算力告急"?从 MQA/GQA 的注意力头共享,到 DeepSeek MLA 的潜空间压缩,再到 PagedAttention 的分页管理与 KIVI 的低比特量化,本文按四条技术路线拆解 KV Cache 这一长上下文时代最硬的瓶颈。
一个反直觉的事实
训练大模型最怕算力不够,推理大模型却常常先被显存卡死。这个反直觉现象的根源,就是本文的主角——KV Cache。它不参与训练,却决定了一次推理能承载多长的上下文、多高的并发。
KV Cache 是什么:把历史"记账"下来
标准 Transformer 自回归解码时,每生成一个 token,都要让该 token 的 Query 与之前所有 token 的 Key、Value 做注意力计算。如果不做缓存,每步都要重新计算全部历史 token 的 K/V,复杂度随序列长度平方级增长。KV Cache 的做法是:把已生成 token 的 Key 和 Value 存在显存里,后续步骤直接复用。
代价是显存消耗随序列长度线性增长且相当可观:KV Cache 占用 ≈ 2(K 与 V)× 层数 × 头数 × 头维度 × 序列长度 × 字节数。以 70B 模型、8K 上下文为例,KV Cache 可达数十 GB,往往比模型权重本身还大。长上下文(百万 token 级)推理时,KV Cache 会耗尽显存,导致 Batch Size 退化为 1,吞吐量断崖式下跌。业界因此把 KV Cache 称为长上下文时代的"内存墙"。
围绕这堵墙,业界形成了四条主流优化路线。
路线一:注意力头共享(MQA / GQA)
思路最直接:既然 KV Cache 大小与 KV 头数量成正比,那就减少 KV 头的数量。
- MQA(Multi-Query Attention):所有 Query 头共享同一组 Key/Value 头,KV Cache 直接缩小到约 1/N(N 为头数)。
- GQA(Grouped Query Attention):折中方案,将 Query 头分组,每组共享一个 KV 头。Llama 2 70B 采用 GQA 后,推理吞吐量比 MHA 版本提升约 2.5 倍,同时质量损失可忽略。
GQA 的论文(Ainslie et al., 2023)证明,从已训练好的 MHA 检查点可以微调得到 GQA,而无需从头训练,这使得 GQA 成为当今开源模型的事实标准之一。
路线二:潜空间压缩(DeepSeek MLA)
GQA 只是减少头的数量,而 DeepSeek-V2 提出的 MLA(Multi-head Latent Attention) 更进一步:把 Key、Value 连同 Query 一起投影到一个低维潜空间,推理时只需缓存低维的潜向量,而非完整的 K/V。
- 传统 MHA 缓存维度 = 2 × n_kv_h × d_h;MLA 缓存维度 = d_c(潜维度),通常远小于前者。
- DeepSeek-V2 官方报告显示,MLA 将 KV Cache 占用降低约 93.3%,显著提升长上下文下的吞吐上限。
- 该设计在 DeepSeek-V3 中延续,成为其低成本推理优势的架构基础之一。
MLA 的意义在于:它把"压缩 KV Cache"从工程技巧上升为架构设计,从源头决定了显存占用上限。
来源:DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model(arXiv:2405.04434)
路线三:显存分页管理(PagedAttention / vLLM)
前面两条路线从"减少数据量"入手,PagedAttention 则从"管理方式"入手。它的灵感来自操作系统虚拟内存:传统方案为每个序列预分配连续显存块,内部碎片和外部碎片都很严重,实测显存浪费可达 60% 以上。
PagedAttention 将 KV Cache 切成固定大小的块(block),用块表(block table)映射逻辑块到物理块,按需分配:
- 消除内部碎片:只在需要时分配块。
- 支持块级共享:并行采样(beam search / parallel sampling)时多个序列可共享公共前缀的 KV 块。
- 实测可将吞吐量提升 2–4 倍,并让显存利用率接近上限。
vLLM 将这一思路工程化,如今已是推理服务的事实标准组件。
路线四:低比特量化(KIVI 与更激进的方向)
KV Cache 是数值分布相对稳定的张量,这为量化提供了空间。KIVI 提出免调优的非对称 2-bit 量化:对 Key 的通道进行分组量化、对 Value 按 token 流式量化,配合每块去量化,几乎不损失精度。
- KIVI 可将 KV Cache 压缩至原来的约 1/4,实测在长上下文任务中保持与原精度相当的效果,同时显存占用大幅下降。
- 更激进的方向是 1-bit / 2-bit 感知训练量化,以及结合稀疏化只保留关键 token 的 KV。
量化路线与 MQA/MLA 正交,可叠加使用,是当前显存优化的最后一层"杠杆"。
来源:KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache(arXiv:2402.02750)
四条路线的对比
| 优化路线 | 核心机制 | 代表工作 | 效果量级 | 适用层 |
|---|---|---|---|---|
| 头共享 | 减少 KV 头数量 | GQA / MQA | KV 降至 1/N | 模型架构 |
| 潜空间压缩 | 缓存低维潜向量 | DeepSeek MLA | KV 降约 93% | 模型架构 |
| 分页管理 | 消除显存碎片 | PagedAttention | 吞吐提升 2–4 倍 | 推理系统 |
| 低比特量化 | 降低存储位宽 | KIVI | KV 压缩约 4 倍 | 推理系统 |
四条路线分属"架构"与"系统"两个层面,彼此互补:架构层决定 KV Cache 的理论下限,系统层决定能否逼近这个下限。
观察与反思
把这几份资料放在一起看,能读出三层信息。
第一层:瓶颈转移了。 当模型参数量级、训练算力被反复强调时,推理侧的 KV Cache 内存墙其实更早、更频繁地制约用户体验——长上下文承诺得再漂亮,显存放不下就等于没有。注意力机制的进步不再只围绕"效果",而是越来越多地围绕"显存账本"。
第二层:压缩是架构红利,也是工程竞赛。 GQA 和 MLA 把优化前移到架构设计,属于"出生即带红利";PagedAttention 与量化则属于"后天补课"。两者缺一不可:架构再省,没有分页和量化,碎片与位宽仍会浪费掉大部分收益。这也是为什么头部推理服务普遍采用"MLA/ GQA + 量化 + 分页"的组合拳。
第三层:未来仍不乐观。 即便四条路线全开,百万 token 级上下文 + 高并发的组合对显存的要求依然苛刻。MLA 之后的下一站,可能是把 KV 缓存搬出显存(分层存储)、或让注意力摆脱显式缓存(线性注意力/SSM 回归)。KV Cache 这个"隐形巨兽"大概率还会继续改写推理系统的设计规则。
(内容由AI生成,仅供参考)