KV Cache 是大模型推理的核心瓶颈。在 72B 模型上,一个 4K 上下文的请求需要 8GB 的 KV Cache;在 128K 上下文时,KV Cache 膨胀到 256GB——比模型权重还大。2026 年,KV Cache 优化已成为推理引擎的"第二战场"。本文将系统性解析从 PagedAttention 到 MLA 的全链路优化技术。
一、KV Cache 基础
为什么需要 KV Cache?
Transformer 自回归解码时,每生成一个 token 需要关注之前所有 token 的 Key 和 Value。如果不缓存,每步都要重算所有历史 token 的 K/V,复杂度 O(n²);缓存后,每步只需计算新 token 的 K/V,复杂度 O(n)。
KV Cache 大小计算
KV Cache 大小 = 2 × num_layers × seq_len × num_kv_heads × head_dim × dtype_size
以 Qwen3.5-72B 为例:
| 参数 | 值 |
|---|---|
| num_layers | 80 |
| num_kv_heads (GQA) | 8 |
| head_dim | 128 |
| dtype | FP16 (2 bytes) |
单 token KV Cache = 2 × 80 × 8 × 128 × 2 = 327,680 bytes ≈ 320KB
4K 上下文 = 320KB × 4096 = 1.25GB
32K 上下文 = 320KB × 32768 = 10GB
128K 上下文 = 320KB × 131072 = 40GB
关键问题:128K 上下文下,KV Cache(40GB)已接近模型权重大小(72B FP16 = 144GB),成为显存主要瓶颈。
二、注意力机制优化
2.1 MHA → GQA → MQA 演进
| 机制 | Query Heads | KV Heads | KV Cache 压缩比 | 代表模型 |
|---|---|---|---|---|
| MHA (Multi-Head Attention) | 64 | 64 | 1x | GPT-4, Llama 2 |
| GQA (Grouped-Query Attention) | 64 | 8 | 8x | Llama 4, Qwen3.5 |
| MQA (Multi-Query Attention) | 64 | 1 | 64x | PaLM, Gemini |
| MLA (Multi-head Latent Attention) | 64 | 潜在表示 | ~16x | DeepSeek V4 |
2.2 MLA 详解
DeepSeek V4 的 MLA(Multi-head Latent Attention)是一种全新的注意力机制:
核心思想:不直接缓存 K 和 V,而是缓存一个低维潜在表示,推理时再还原为 K/V。
传统: Cache[K, V] → 大小 = 2 × n_heads × head_dim × seq_len
MLA: Cache[z] → 大小 = latent_dim × seq_len (latent_dim << 2 × n_heads × head_dim)
MLA 的数学原理:
# 下投影:将高维 K/V 压缩为低维潜在表示
z = W_down_KV @ [K; V] # latent_dim = 512
# 上投影:推理时从潜在表示恢复 K/V
K = W_up_K @ z
V = W_up_V @ z
# KV Cache 只存储 z
压缩效果对比(72B 等效模型):
| 机制 | 单 token KV Cache | 128K 上下文 | 压缩比 |
|---|---|---|---|
| MHA | 320KB | 40GB | 1x |
| GQA (8 heads) | 40KB | 5GB | 8x |
| MQA | 5KB | 0.625GB | 64x |
| MLA (latent=512) | 10KB | 1.25GB | 32x |
MLA 在压缩比(32x)和质量保持之间取得了最佳平衡——MQA 虽然压缩比更高(64x),但质量损失明显。
三、PagedAttention 详解
3.1 核心原理
PagedAttention 借鉴操作系统的虚拟内存分页机制,将 KV Cache 分为固定大小的 page:
传统: KV Cache 连续分配
请求A: [████████░░░░░░] 预留空间,浪费 50%
请求B: [████░░░░░░░░░░] 预留空间,浪费 75%
PagedAttention: KV Cache 分页分配
Page 0: [AAAA] Page 1: [AABB] Page 2: [BBCC] Page 3: [CCCC]
按需分配,无预留浪费,利用率 90%+
3.2 显存利用率对比
| 方案 | 显存利用率 | 最大并发 | 碎片率 |
|---|---|---|---|
| 连续分配 | 40-60% | 128 | 高 |
| PagedAttention (4K page) | 92% | 320 | <2% |
| PagedAttention (1K page) | 96% | 350 | <1% |
3.3 vLLM 中的 PagedAttention 配置
from vllm import LLM
llm = LLM(
model="Qwen/Qwen3.5-72B-Instruct",
tensor_parallel_size=4,
# PagedAttention 相关
block_size=16, # page 大小,默认16
swap_space=8, # CPU swap 空间(GB)
enable_prefix_caching=True, # 开启前缀缓存
use_v2_block_manager=True, # V2 内存管理
)
block_size 选择:
- 16(默认):通用推荐
- 8:更细粒度,利用率更高但管理开销略增
- 32:更大 page,适合长序列场景
四、Prefix Caching
4.1 原理
多个请求共享相同前缀时,只需计算一次前缀的 KV Cache,后续请求直接复用:
请求1: [系统prompt][用户问题1] → 计算整个序列
请求2: [系统prompt][用户问题2] → 只计算[用户问题2]部分
请求3: [系统prompt][用户问题3] → 只计算[用户问题3]部分
4.2 效果实测
在客服场景(系统 prompt 2000 token,用户消息平均 100 token):
| 模式 | 首 token 延迟 | 吞吐量 | KV Cache 使用 |
|---|---|---|---|
| 无缓存 | 0.85s | 2,850 tok/s | 100% |
| Prefix Cache | 0.12s | 8,500 tok/s | 15% |
首 token 延迟降低 86%——Prefix Caching 是提升首 token 响应速度最有效的技术。
4.3 SGLang RadixAttention
SGLang 的 RadixAttention 是 Prefix Caching 的增强版——使用 Radix Tree 管理所有可能的共享前缀:
RadixAttention Tree:
[系统prompt]
/ \
[用户1上下文] [用户2上下文]
/ | \ |
[回复1] [回复2] [追问1] [回复1]
在多轮对话场景,RadixAttention 的缓存命中率可达 75%,吞吐量比 vLLM Prefix Cache 再高 40%。
五、KV Cache 量化
5.1 FP16 → INT8 → INT4
| 精度 | 单token大小 | 128K上下文 | 质量损失 |
|---|---|---|---|
| FP16 | 320KB (MHA) / 40KB (GQA) | 40GB / 5GB | 基准 |
| INT8 | 160KB / 20KB | 20GB / 2.5GB | 0.3% |
| INT4 | 80KB / 10KB | 10GB / 1.25GB | 1.5% |
5.2 KV Cache 量化配置
# vLLM KV Cache 量化
llm = LLM(
model="Qwen/Qwen3.5-72B-Instruct",
kv_cache_dtype="int8", # 或 "fp8" "int4"
)
| KV精度 | 吞吐量 | 首 token 延迟 | 最大并发 | 质量损失 |
|---|---|---|---|---|
| FP16 | 2,850 tok/s | 0.35s | 128 | 0% |
| FP8 | 3,200 tok/s | 0.30s | 160 | 0.1% |
| INT8 | 3,500 tok/s | 0.28s | 180 | 0.3% |
| INT4 | 4,100 tok/s | 0.25s | 220 | 1.5% |
推荐:FP8 是 H100 上的最佳选择(几乎无损),INT8 适合 A100,INT4 仅在显存极度紧张时使用。
六、KV Cache Offloading
6.1 GPU-CPU 分层存储
将不常用的 KV Cache 页面 offload 到 CPU 内存:
llm = LLM(
model="Qwen/Qwen3.5-72B-Instruct",
swap_space=16, # 16GB CPU swap 空间
cpu_offload_gb=0, # 不 offload 权重
)
| 配置 | GPU 显存 | CPU 内存 | 最大上下文 | 速度影响 |
|---|---|---|---|---|
| 纯 GPU | 80GB | 0 | 128K | 基准 |
| 16GB swap | 80GB | 16GB | 256K | -15% |
| 32GB swap | 80GB | 32GB | 512K | -28% |
Offloading 适合需要超长上下文但可以容忍一定延迟的场景。
6.2 Flash Attention 3
Flash Attention 3 通过减少 KV Cache 的 HBM 读写量来提升效率:
传统 Attention: Q × K → HBM → V → HBM → Output
Flash Attention: Q × K × V → SRAM → Output (融合算子)
| 版本 | KV Cache 读取 | 速度提升 | 显存节省 |
|---|---|---|---|
| 标准 Attention | 基准 | 1.0x | 基准 |
| Flash Attention 2 | -70% | 1.8x | -50% |
| Flash Attention 3 | -85% | 2.5x | -65% |
七、各技术组合效果
72B 模型,128K 上下文
| 优化组合 | KV Cache 大小 | 显存占用 | 吞吐量 |
|---|---|---|---|
| MHA + 无优化 | 40GB | 184GB | 45 tok/s |
| GQA + PagedAttention | 5GB | 149GB | 145 tok/s |
| GQA + PagedAttn + Prefix Cache | 5GB(15%复用) | 149GB | 380 tok/s |
| GQA + PagedAttn + KV INT8 | 2.5GB | 146.5GB | 165 tok/s |
| MLA (DeepSeek V4 架构) | 1.25GB | 145.25GB | 195 tok/s |
| MLA + PagedAttn + FP8 KV | 0.625GB | 144.625GB | 220 tok/s |
从 MHA 到 MLA+PagedAttn+FP8,KV Cache 压缩了 64 倍,吞吐提升了 4.9 倍。
八、选型指南
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 短上下文(<4K) | GQA + PagedAttention | 基础方案足够 |
| 中等上下文(4K-32K) | GQA + PagedAttn + Prefix Cache | 前缀复用效果好 |
| 长上下文(32K-128K) | GQA + PagedAttn + KV INT8 | 需压缩 KV Cache |
| 超长上下文(128K+) | MLA + PagedAttn + FP8 + Swap | 全链路优化 |
| 多轮对话 | RadixAttention (SGLang) | 缓存命中率最高 |
| 高并发短请求 | GQA + PagedAttn + KV INT4 | 极致并发 |
九、总结
KV Cache 优化是大模型推理效率的"隐形战场"。从 MHA 的 40GB 到 MLA+全链路优化的 0.625GB,64 倍的压缩意味着同样的硬件可以服务 64 倍的并发请求。2026 年的 KV Cache 优化已形成清晰的技术栈:MLA 压缩 + PagedAttention 管理 + Prefix Cache 复用 + FP8/INT8 量化。如果只能选一项优化,选 PagedAttention——它是投入产出比最高的单项技术。如果追求极致,全链路优化可以实现 5 倍以上的综合吞吐提升。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
