引言
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量化 | 2× | <1% |
| ├─ INT4量化 | 4-bit量化 | 4× | 2-3% |
| └─ FP8量化 | 8-bit浮点 | 2× | <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× | 4× |
| 质量损失 | 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量化有特殊要求:
- 在线量化:推理时动态量化,无法离线准备
- 敏感度不均:不同层、不同head的KV对量化敏感度不同
- 通道维度:通常在通道维度量化
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组) | 4× | 0.5% |
| PagedAttention | 碎片减少 | 0% |
| INT8 KV量化 | 2× | 0.5% |
| 综合 | 8× | ~1% |
代表:Llama 4 + vLLM
方案2:MLA + RadixAttention + INT8量化
适用:长上下文场景,追求极致效率。
| 技术 | 压缩比 | 质量损失 |
|---|---|---|
| MLA 2.0 | 10× | 1.5% |
| RadixAttention | 前缀共享 | 0% |
| INT8 KV量化 | 2× | 0.5% |
| 综合 | 20× | ~2% |
代表:DeepSeek V4 + SGLang
方案3:GQA + StreamingLLM + INT4量化
适用:无限上下文场景,可以容忍一定质量损失。
| 技术 | 压缩比 | 质量损失 |
|---|---|---|
| GQA (8组) | 4× | 0.5% |
| StreamingLLM | 可变 | 1-3% |
| INT4 KV量化 | 4× | 2% |
| 综合 | 64× | ~5% |
代表:部署在资源极度受限的边缘设备。
选型决策树
开始
↓
上下文长度通常<32K?
├─ 是 → 需要极致效率?
│ ├─ 是 → MLA + RadixAttention(方案2)
│ └─ 否 → GQA + PagedAttention(方案1)
└─ 否 ↓
可以容忍质量损失?
├─ 是 → StreamingLLM + INT4(方案3)
└─ 否 → MLA + INT8量化(方案2变种)
未来趋势
- 2-bit KV Cache量化:研究界已在探索,质量损失仍大
- 动态精度:根据token重要性动态选择量化精度
- 跨请求KV共享:不仅共享前缀,还共享语义相似的上下文
- 硬件加速:下一代GPU可能原生支持MLA等创新
- 训练时优化:训练模型时考虑KV Cache效率(如MLA训练)
结语
KV Cache优化是2026年大模型推理优化的核心战场之一。从注意力架构创新(GQA、MLA)到内存管理优化(PagedAttention、RadixAttention),再到量化压缩(INT8/INT4),各种技术百花齐放。对于开发者来说,关键是理解自己的场景需求——长上下文、高并发、低延迟还是低成本——然后选择最适合的技术组合。未来,随着模型架构和硬件的进步,KV Cache将不再是推理的瓶颈,让更长、更快、更便宜的AI成为现实。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
