引言

KV Cache(键值缓存)是大模型推理中显存占用的最大头。一个512K上下文的推理,KV Cache可能占用数十GB显存。2026年,KV Cache优化技术已经非常成熟,从vLLM的PagedAttention到DeepSeek的MLA,各种创新层出不穷。本文将全面解析KV Cache的优化技术,帮助开发者深入理解并合理选择。

KV Cache基础

为什么需要KV Cache?

Transformer的自注意力机制:

Attention(Q, K, V) = softmax(QK^T / √d_k) × V

问题:生成第t个token时,需要K_1, K_2, …, K_{t-1}和V_1, …, V_{t-1}。如果每次都重新计算,复杂度O(n²)。

解决:缓存历史K和V → KV Cache

KV Cache的显存占用

对于Llama 4 70B(32层,hidden_size=8192):

上下文长度 FP16 KV Cache INT8 KV Cache INT4 KV Cache
2K 512MB 256MB 128MB
8K 2GB 1GB 512MB
32K 8GB 4GB 2GB
128K 32GB 16GB 8GB
512K 128GB 64GB 32GB

关键观察:上下文长度每增加4倍,KV Cache增大4倍。

优化技术全景

技术分类

技术路线 核心思路 压缩比 质量损失
注意力优化 减少KV Cache占用 - -
├─ Multi-Query Attention (MQA) 多查询共享KV 1/n_heads 0%
├─ Grouped-Query Attention (GQA) 分组共享KV 1/group_size <0.5%
└─ Multi-Head Latent Attention (MLA) 低维潜在表示 8-10× <1%
分页管理 动态内存管理 - -
├─ PagedAttention 分页管理KV Cache 减少碎片 0%
└─ RadixAttention 前缀树缓存 复用公共前缀 0%
量化压缩 降低精度 - -
├─ INT8量化 8-bit量化 <1%
├─ INT4量化 4-bit量化 2-3%
└─ FP8量化 8-bit浮点 <0.5%
稀疏化 只保留重要token - -
├─ StreamingLLM 保留初始+近期token 可变 1-3%
├─ H2O 动态淘汰低注意力token 2-4× 2-5%
└─ ScissorHands 基于重要性的稀疏化 2-3× 2-4%

注意力优化

1. Multi-Query Attention (MQA)

原理:所有查询头共享同一组KV。

标准MHA: #heads组独立的K和V
MQA: 1组K和V,所有heads共享

效果

  • KV Cache压缩比 = 1 / #heads(如32层 → 压缩32倍)
  • 质量损失:几乎为0(Llama 2验证了这一点)

代表模型:PaaS-BloonV3、Falcon

2. Grouped-Query Attention (GQA)

原理:折衷方案,将heads分组,每组共享KV。

标准MHA: 32 heads → 32组KV
GQA: 32 heads → 8组KV(每组4个heads)
MQA: 32 heads → 1组KV

效果(Llama 4 70B,8组):

  • KV Cache压缩比 = 4×
  • 质量损失:<0.5%
  • 推理速度:提升1.3-1.5×

代表模型:Llama 4系列、Qwen3.5系列

3. Multi-Head Latent Attention (MLA)

原理(DeepSeek创新):将KV Cache压缩到低维潜在空间。

标准: KV Cache = [K_1, K_2, ..., K_n]  # 高维
MLA: 存储低维潜在向量c_i ≈ f(K_i, V_i)
     推理时从c_i重构K_i和V_i

MLA 2.0效果(DeepSeek V4):

  • KV Cache压缩比 = 8-10×
  • 质量损失:<1%
  • 长序列推理速度提升28%

技术细节

维度 标准MHA MLA 1.0 MLA 2.0
KV Cache大小(256K) 64GB 9.6GB 6.4GB
信息损失 0% ~3% ~1.5%
重构开销 0% +8%延迟 +5%延迟

MLA vs GQA

维度 MLA 2.0 GQA (8组)
压缩比 10×
质量损失 1.5% 0.5%
实现复杂度
硬件友好度

分页管理优化

1. PagedAttention(vLLM)

原理:类比操作系统的虚拟内存分页,将KV Cache分页管理。

传统: 为每个请求预分配连续显存 → 碎片多、利用率低
PagedAttention: KV Cache分块(如16tokens/块),动态分配 → 碎片少、利用率高

效果

  • 显存利用率从60%提升到90%
  • 支持的并发请求数提升2-3×
  • 质量损失:0%

实测(Llama 4 70B,32路并发):

方案 峰值显存 支持的最大上下文 并发请求数
连续分配 128GB 8K 32
PagedAttention 105GB (-18%) 32K 32

2. RadixAttention(SGLang)

原理:利用前缀树(radix tree)共享和复用KV Cache。

请求1: [system_prompt] + [user_q1] → 生成answer_1
请求2: [system_prompt] + [user_q2] → 生成answer_2

传统: 两个请求的system_prompt分别存储 → 浪费
RadixAttention: system_prompt只存储一次,两个请求共享 → 节省

效果(多轮对话场景):

  • KV Cache复用率:60-80%
  • 首token延迟降低:50-70%
  • 显存占用降低:40-60%

实测(共享2000 tokens system prompt,100并发):

方案 总KV Cache 首token延迟 显存节省
无前缀缓存 200GB 1.8s 0%
RadixAttention 45GB 0.5s 77%

量化压缩

KV Cache专用量化

不同于权重量化,KV Cache量化有特殊要求:

  1. 在线量化:推理时动态量化,无法离线准备
  2. 敏感度不均:不同层、不同head的KV对量化敏感度不同
  3. 通道维度:通常在通道维度量化

INT8 KV Cache量化

方法:对K和V分别进行INT8量化。

# 伪代码
def int8_kv_quantize(K, V):
    # K: [batch, num_heads, seq_len, head_dim]
    K_scales = K.abs().max(dim=-1, keepdim=True) / 127
    V_scales = V.abs().max(dim=-1, keepdim=True) / 127
    
    K_int8 = (K / K_scales).round().clip(-128, 127).to(torch.int8)
    V_int8 = (V / V_scales).round().clip(-128, 127).to(torch.int8)
    
    return K_int8, V_int8, K_scales, V_scales

效果

  • 压缩比:2×
  • 质量损失:<1%
  • 推理速度:基本无影响(现代GPU的INT8计算快)

INT4 KV Cache量化

方法:更激进的4-bit量化,通常用GPTQ或AWQ变种。

效果

  • 压缩比:4×
  • 质量损失:2-3%
  • 推理速度:可能略降(INT4计算不如INT8成熟)

实测(Qwen3.5 72B,MMLU基准):

KV精度 MMLU得分 KV Cache大小(128K)
FP16 78.5% 36GB
INT8 78.3% (-0.2%) 18GB
INT4 76.8% (-1.7%) 9GB
NF4 77.5% (-1.0%) 9GB

推荐:INT8 KV Cache量化——最佳平衡点。

稀疏化技术

1. StreamingLLM

原理:保留初始token(“注意力汇”)和近期token,丢弃中间token。

K,V Cache = [初始token] + [近期token]
           = [重要上下文] + [当前对话]

效果

  • 可处理无限长上下文(固定大小KV Cache)
  • 质量损失:1-3%(取决于保留的token数)
  • 适用场景:对话(近期内容最重要)

2. H2O (Heavy-Hitter Oracle)

原理:动态识别并保留高注意力分数的token。

每个token对当前生成的贡献不同 → 保留高贡献token,淘汰低贡献token

效果

  • 压缩比:2-4×
  • 质量损失:2-5%
  • 计算开销:需要计算注意力分数(额外~5%开销)

3. ScissorHands

原理:基于token重要性的稀疏化,重要性通过自我注意力评估。

效果

  • 压缩比:2-3×
  • 质量损失:2-4%
  • 特点:无需额外模型,端到端可微

综合优化方案

方案1:GQA + PagedAttention + INT8量化

适用:通用场景,平衡质量和效率。

技术 压缩比 质量损失
GQA (8组) 0.5%
PagedAttention 碎片减少 0%
INT8 KV量化 0.5%
综合 ~1%

代表:Llama 4 + vLLM

方案2:MLA + RadixAttention + INT8量化

适用:长上下文场景,追求极致效率。

技术 压缩比 质量损失
MLA 2.0 10× 1.5%
RadixAttention 前缀共享 0%
INT8 KV量化 0.5%
综合 20× ~2%

代表:DeepSeek V4 + SGLang

方案3:GQA + StreamingLLM + INT4量化

适用:无限上下文场景,可以容忍一定质量损失。

技术 压缩比 质量损失
GQA (8组) 0.5%
StreamingLLM 可变 1-3%
INT4 KV量化 2%
综合 64× ~5%

代表:部署在资源极度受限的边缘设备。

选型决策树

开始
上下文长度通常<32K?
  ├─ 是 → 需要极致效率?
  │        ├─ 是 → MLA + RadixAttention(方案2)
  │        └─ 否 → GQA + PagedAttention(方案1)
  └─ 否 ↓
      可以容忍质量损失?
        ├─ 是 → StreamingLLM + INT4(方案3)
        └─ 否 → MLA + INT8量化(方案2变种)

未来趋势

  1. 2-bit KV Cache量化:研究界已在探索,质量损失仍大
  2. 动态精度:根据token重要性动态选择量化精度
  3. 跨请求KV共享:不仅共享前缀,还共享语义相似的上下文
  4. 硬件加速:下一代GPU可能原生支持MLA等创新
  5. 训练时优化:训练模型时考虑KV Cache效率(如MLA训练)

结语

KV Cache优化是2026年大模型推理优化的核心战场之一。从注意力架构创新(GQA、MLA)到内存管理优化(PagedAttention、RadixAttention),再到量化压缩(INT8/INT4),各种技术百花齐放。对于开发者来说,关键是理解自己的场景需求——长上下文、高并发、低延迟还是低成本——然后选择最适合的技术组合。未来,随着模型架构和硬件的进步,KV Cache将不再是推理的瓶颈,让更长、更快、更便宜的AI成为现实。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。