KV Cache 优化全景解析——从基础原理到工程实践
技术日报 2026-03-30
今日主题:KV Cache 优化全景解析——从基础原理到工程实践
📋 目录
- 技术背景:为什么 KV Cache 是推理瓶颈核心
- KV Cache 基础原理:Prefill vs Decode
- 注意力机制演进:MHA → MQA → GQA
- 系统级优化:PagedAttention 与 vLLM
- Continuous Batching:让 GPU 持续满载
- Prefix Caching / Radix Attention:复用前缀 KV
- KV Cache 量化:FP8/INT8/2bit 方案
- KV Cache 稀疏化与驱逐策略
- KV Cache 卸载:多级存储层次
- 前沿进展:MLA 与 NSA(2024–2026)
- 代码实战:用 vLLM 实践各项优化
- 参考资料
一、技术背景:为什么 KV Cache 是推理瓶颈核心
大语言模型(LLM)推理面临一个核心矛盾:算力成本 vs 内存成本。在自回归生成阶段,每生成一个新 token,GPU 就要重新计算所有历史 token 的 Key 和 Value 向量——在无任何优化的情况下,生成第 t 个 token 的计算量是 O(t²) 级别的,这显然无法支撑实际部署。
KV Cache 技术正是解决这一问题的核心手段,但它也引入了新的挑战:
- 内存占用急剧增大:KV Cache 随序列长度线性增长,在长上下文场景中可超过模型权重本身
- 内存带宽成为瓶颈:Decode 阶段每步只生成 1 个 token,但需从 HBM 读取完整的 KV Cache,GPU 算力严重空转
- 内存碎片问题:传统静态分配导致大量 GPU 显存浪费(高达 60–80%)
围绕这三大问题,学术界和工程界发展出了本文要深入介绍的一整套优化体系。
二、KV Cache 基础原理:Prefill vs Decode
2.1 为什么需要 KV Cache
在 Transformer Decoder 中,注意力计算公式为:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V$$
对于第 t 步生成,需要计算第 t 个 query 与所有历史 key 的点积。历史 token 的 key 和 value 向量完全由模型参数和 token 本身决定,不会随时间变化。因此可以将它们缓存起来,形成 KV Cache。
| 无 KV Cache | 有 KV Cache |
|---|---|
| 第 t 步需重新计算前 t-1 个 token 的 K/V | 直接从缓存读取 K/V,只计算第 t 个 token |
| 时间复杂度:O(t²) | 时间复杂度:O(t) |
| 显存无额外占用 | 额外占用 KV Cache 显存 |
2.2 Prefill 与 Decode 两阶段
LLM 推理严格分为两个特性迥异的阶段:
┌─────────────────────────────────────────────────────────────────┐
│ LLM 推理流程 │
│ │
│ 输入 Prompt │
│ "请介绍..." → [Prefill 阶段] → KV Cache 初始化完成 │
│ │
│ [Decode 阶段] │
│ 新token₁ → Q @ K_cache → token₂ │
│ 新token₂ → Q @ K_cache → token₃ │
│ ...(每步 KV Cache 追加一个新 token 的 K/V) │
└─────────────────────────────────────────────────────────────────┘
| 特征 | Prefill(预填充) | Decode(解码) |
|---|---|---|
| 输入 | 完整 Prompt(全部 token) | 上步新生成的单个 token |
| 计算模式 | 高并行、Compute-Bound(计算密集型) | 低并行、Memory-Bound(内存带宽密集型) |
| GPU 利用率 | 高(矩阵乘法,利用率接近峰值) | 低(向量-矩阵乘法,大量等待内存) |
| KV Cache 操作 | 初始化:写入所有 token 的 K/V | 每步追加:新 token K/V |
| 时延指标 | TTFT(Time to First Token,首 token 延迟) | ITL(Inter-Token Latency,每 token 延迟) |
2.3 KV Cache 内存计算公式
精确计算公式:
$$\text{KV Cache Memory} = 2 \times L \times B \times T \times H_{kv} \times d_h \times \text{bytes_per_element}$$
| 符号 | 含义 |
|---|---|
2 |
Key 和 Value 各一份 |
L |
Transformer 层数 |
B |
Batch Size(并发序列数) |
T |
序列长度(token 数) |
H_kv |
KV 头数(MHA 中 = Q 头数,GQA 中 = 分组数) |
d_h |
每个头的维度(通常为 128) |
bytes |
FP16/BF16=2B,INT8=1B,INT4=0.5B |
LLaMA-3 70B(GQA,8个KV头,80层)不同上下文长度 KV Cache(FP16,Batch=1):
| 序列长度 | KV Cache 大小 | 模型权重(FP16) | KV Cache 占比 |
|---|---|---|---|
| 1,024 | 0.31 GB | 130.4 GB | 0.2% |
| 4,096 | 1.25 GB | 130.4 GB | 1.0% |
| 8,192 | 2.50 GB | 130.4 GB | 1.9% |
| 32,768 | 10.00 GB | 130.4 GB | 7.1% |
| 131,072 | 40.00 GB | 130.4 GB | 23.5% |
📌 关键规律:KV Cache 大小与
B × T成正比。在超长上下文(>100K tokens)高并发场景下,KV Cache 可成为显存主要消耗者。
三、注意力机制演进:MHA → MQA → GQA
3.1 MHA 的内存困境
标准 Multi-Head Attention(Vaswani et al., 2017)中,h 个注意力头各自维护独立的 K/V 投影。KV Cache 大小正比于 h,在 Decode 阶段每步需从 HBM 读取所有 h 组 K/V,成为显著的内存带宽瓶颈。
3.2 Multi-Query Attention(MQA)——极端压缩
论文:Noam Shazeer,"Fast Transformer Decoding: One Write-Head is All You Need",arXiv:1911.02150,2019 年 11 月
核心思想:保留多个 Q 头,但所有 Q 头共享同一套 K/V 投影(仅 1 个 KV 头)。
$$\text{KV Cache}{MQA} = \frac{1}{h} \times \text{KV Cache}$$
对 32 头模型,KV Cache 压缩 32×!
优缺点:
- ✅ 极大减少内存带宽,Decode 速度显著提升
- ❌ 模型质量(精度)相比 MHA 有一定下降
- ❌ 训练稳定性差,无法从 MHA 权重直接转换
使用模型:PaLM、Falcon-7B(初版)、早期 Gemma-2B 等
3.3 Grouped-Query Attention(GQA)——工业界黄金标准
论文:Ainslie et al.,"GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints",arXiv:2305.13245,EMNLP 2023
GQA 是 MHA 和 MQA 的插值折中:将 h 个 Q 头分为 G 组,每组共享一套 K/V:
$$\text{KV Cache}{GQA} = \frac{G}{h} \times \text{KV Cache}$$
论文核心贡献:
- 提出 "Uptraining" 方案:以约 5% 原始预训练算力 将 MHA 模型转换为 GQA/MQA,无需重头训练
- GQA 在质量上明显优于 MQA,接近 MHA,而速度接近 MQA
LLaMA-3 70B 在 8K 序列长度下的对比(FP16):
| 注意力类型 | KV 头数 | KV Cache 大小 | vs MHA 节省 |
|---|---|---|---|
| MHA | 64 | 20.00 GB | — |
| GQA(实际) | 8 | 2.50 GB | 节省 87.5%(8× 压缩) |
| MQA | 1 | 0.31 GB | 节省 98.4% |
主流开源模型注意力机制汇总:
| 模型 | 规模 | 注意力机制 | Q-heads | KV-heads | 压缩比 |
|---|---|---|---|---|---|
| LLaMA-2 7B | 7B | MHA | 32 | 32 | 1:1 |
| LLaMA-2 13B | 13B | MHA | 40 | 40 | 1:1 |
| LLaMA-2 70B | 70B | GQA | 64 | 8 | 8:1 |
| LLaMA-3 8B | 8B | GQA | 32 | 8 | 4:1 |
| LLaMA-3 70B | 70B | GQA | 64 | 8 | 8:1 |
| Mistral 7B | 7B | GQA | 32 | 8 | 4:1 |
| Gemma-2B | 2B | MQA | — | 1 | — |
| Falcon-7B | 7B | MQA | — | 1 | — |
📌 趋势:2023 年后几乎所有主流开源模型均采用 GQA,Q:KV 比通常为 4:1 或 8:1。GQA 已成为事实上的工业标准。
四、系统级优化:PagedAttention 与 vLLM
4.1 传统 KV Cache 的内存碎片噩梦
传统 LLM 服务系统按最大序列长度预分配连续内存块。实测数据显示,FasterTransformer、早期 Orca 等系统中,仅 20.4%–38.2% 的 KV Cache 内存存储了有效 token,内存浪费高达 61.8%–79.6%。根本原因:
- 内部碎片:预分配最大长度,但实际输出更短,末尾内存闲置
- 外部碎片:不同请求占用不同大小内存块,无法被合并
4.2 PagedAttention:操作系统智慧的迁移
论文:Kwon et al.,"Efficient Memory Management for Large Language Model Serving with PagedAttention",SOSP 2023,arXiv:2309.06180
Woosuk Kwon 等人(UC Berkeley)直接借鉴 OS 虚拟内存分页机制:
OS 虚拟内存 PagedAttention
───────────────── ─────────────────────────
虚拟地址空间 → 逻辑 KV 块(Logical Blocks)
物理内存页 → 物理 KV 块(Physical Blocks)
页表(Page Table)→ 块表(Block Table)
按需分页 → 按需分配物理块
工作机制:
请求 A(128 tokens): 逻辑块 [0,1,2] → 物理块 [5,2,9](非连续!)
请求 B(64 tokens): 逻辑块 [0,1] → 物理块 [1,7]
空闲物理块池: [0,3,4,6,8,...]
KV Cache 管理器维护块表映射,实现逻辑连续、物理离散的存储
Copy-on-Write(写时复制)机制:
Beam Search 等需要并行探索多路径的场景中,共享前缀的逻辑块可映射到同一物理块(通过引用计数共享),只有当路径分叉需要写入时才触发 CoW——分配新块、复制内容、更新块表。
内存节省数据(SOSP 2023 实测):
- 并行采样:节省 6.1%–30.5% 内存
- Beam Search:节省 37.6%–66.3% 内存
- 整体 KV Cache 利用率:从 20–38% 提升至 接近 100%
4.3 vLLM 性能数据
在 ShareGPT 数据集上与当时主流系统对比(SOSP 2023 论文实验):
| 对比系统 | vLLM 相对吞吐量提升 |
|---|---|
| FasterTransformer | 可持续请求率高达 22× |
| Orca(Oracle 模式) | 1.7×–2.7× 吞吐 |
| Orca(Max 模式) | 2.7×–8× 吞吐 |
| 综合 | 整体吞吐提升 2–4× |
五、Continuous Batching:让 GPU 持续满载
5.1 Static Batching 的致命缺陷
传统静态批处理以"请求粒度"调度:一批请求同时开始,全部完成后才接收新请求。问题在于:
请求A: ████████████████████████████████ (1000 tokens)
请求B: ██████████ (300 tokens) → 完成后空转!
请求C: ██████████████████ (600 tokens) → 等待A完成!
GPU: [||||||||||||||||||||||||||pad pad][||||||||||||||...]
短请求完成后 GPU 算力空转,新请求又无法进入。
5.2 Orca 的迭代级调度
论文:Gyeong-In Yu et al.(首尔大学+FriendliAI),OSDI 2022
核心创新:调度粒度降到单次 Decode 迭代(每生成 1 个 token 后重新调度)
- 某请求生成
<EOS>→ 立即从批次移除,释放槽位 - 等待队列中的新请求立即插入(Late-Joining)
- GPU 始终满载运行
Orca 实验结果:在 GPT-3 175B 上,相比 FasterTransformer,吞吐量提升 36.9 倍(OSDI 2022)。
5.3 各框架吞吐量提升(相比 Static Batching)
| 框架 | 提升倍数 | 测试条件 |
|---|---|---|
| vLLM(CB + PagedAttention) | 最高 23× | A100 40GB, OPT-13B |
| HuggingFace TGI | 约 8× | 同上 |
| NVIDIA FasterTransformer(+CB) | 约 4× | 同上 |
六、Prefix Caching / Radix Attention:复用前缀 KV
6.1 场景痛点
RAG、多轮对话、Few-shot 场景中,大量请求共享相同的 System Prompt、示例或对话历史。每次都重新 Prefill 这些共享前缀是极大浪费:
请求1: [System Prompt: 你是助手...][用户: 问题A]
请求2: [System Prompt: 你是助手...][用户: 问题B]
请求3: [System Prompt: 你是助手...][用户: 问题C]
↑ 相同前缀,每次都重新计算 KV!
6.2 SGLang 的 RadixAttention(2024)
论文:Zheng et al.(LMSYS),arXiv:2312.07104,2024 年 1 月正式发布
SGLang 用 Radix Tree(基数树) 管理 KV Cache,实现细粒度前缀匹配:
Radix Tree 结构示意:
Root
├── "System: 你是一个助手..." → [KV_block_1, KV_block_2]
│ ├── "用户: 问题A" → [KV_block_3a]
│ └── "用户: 问题B" → [KV_block_3b]
└── "请将以下文章..." → [KV_block_4]
新请求到达 → 搜索最长前缀匹配 → 命中则直接复用 KV 块 → 仅计算未匹配部分
实现细节:
- 树节点:Token 序列 → KV Cache 张量(分页存储)
- 淘汰策略:LRU(最近最少使用),GPU 内存不足时自动驱逐
- Cache-Aware Scheduling:调度器优先处理与热点前缀高度匹配的请求
SGLang 性能数据(A10G GPU,Llama-7B/Mixtral-8x7B):在 MMLU、HellaSwag、ReAct Agent、DSPy RAG 等综合 benchmark 上,相比 Guidance、vLLM,吞吐量最高提升 5 倍。
6.3 vLLM 的 Hash-based Prefix Caching
vLLM 实现哈希链式块级缓存:
- 每个物理块通过哈希键
(父块哈希值, 当前块 Token ID 序列)唯一标识 - O(1) 哈希查找命中缓存
- 双向链表实现 O(1) LRU 淘汰
效果(多轮对话场景):
- 缓存 System Prompt + 历史对话后,每轮 TTFT 降低 60%–80%
- 相似前缀请求占比 50% 时,吞吐量最高提升 2×
📌 SGLang vs vLLM 前缀缓存差异:vLLM 以固定 Block 大小(16/32 token)为粒度进行哈希,末尾不完整块无法命中。SGLang Radix Tree 粒度更细,在复杂前缀场景下命中率更高。
七、KV Cache 量化:FP8/INT8/2bit 方案
7.1 量化的核心挑战:异常值问题
KV Cache 量化面临一个关键障碍:激活值异常值(Outliers)。Key Cache 和 Value Cache 统计特性截然不同:
- Key Cache:通道间分布差异悬殊,存在极端异常值;且经过 RoPE 位置编码后,数值分布更复杂
- Value Cache:同一 token 内各通道分布相对均匀,量化更友好
这种非对称性催生了差异化量化策略。
7.2 KIVI:2bit 无损非对称量化
论文:Liu et al.(莱斯大学),"KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache",arXiv:2402.02750,ICLR 2024
关键设计:
| 组件 | 量化维度 | 依据 |
|---|---|---|
| Key Cache | 逐通道(Per-Channel)量化 | 通道间分布差异大,需通道独立缩放 |
| Value Cache | 逐 Token(Per-Token)量化 | 同 token 内通道分布均匀 |
实测效果:
- 2bit 量化,无需微调,精度几乎无损
- KV Cache 峰值内存减少约 2.6 倍(含模型权重)
- 支持批次大小增加最多 4 倍
- 吞吐量提升 2.35~3.47 倍(在 Llama/Falcon/Mistral 上测试)
7.3 KVQuant:3bit 量化支持百万上下文
论文:Hooper et al.(UC Berkeley),"KVQuant: Towards 10 Million Context Length LLM Inference with KV Cache Quantization",arXiv:2401.18079,NeurIPS 2024
四大技术创新:
- Pre-RoPE Key 量化:在旋转位置编码施加前完成量化,消除位置信息干扰
- 逐通道 Key 量化:精确对齐 Key 的实际统计分布
- 非均匀量化:设计感知层敏感性的自适应数据类型
- 逐向量稠密+稀疏量化:将异常值单独处理,防止量化范围偏斜
关键数据:
- 3bit 量化,Wikitext-2/C4 困惑度退化 < 0.1
- 单张 A100-80GB 支持 LLaMA-7B 上下文达 100 万 tokens
- 8 卡 GPU 可支持 1000 万 tokens 上下文
- 定制 CUDA Kernel 在 LLaMA-7B 上实现约 1.7 倍加速
7.4 FP8 KV Cache:生产级量化(vLLM + NVIDIA H100)
FP8 是 NVIDIA Hopper 架构(H100/H200)原生支持的数据类型,分为 fp8_e4m3(4位指数+3位尾数,精度更高)和 fp8_e5m2 两种格式。
vLLM 提供完整的 FP8 KV Cache 工程支持:
from vllm import LLM, SamplingParams
# 方式1:随机 token 校准(快速验证)
llm = LLM(
model="meta-llama/Llama-3-8B-Instruct",
kv_cache_dtype="fp8", # 启用 FP8 KV Cache
calculate_kv_scales=True, # 自动校准量化尺度
gpu_memory_utilization=0.95,
)
# 方式2:数据集离线校准(推荐生产使用)
# 使用 llm-compressor 离线计算精确的量化尺度
llm = LLM(
model="quantized-model-with-kv-cache-scales",
kv_cache_dtype="fp8",
calculate_kv_scales=False, # 从模型配置加载校准尺度
)
性能影响:FP8 相比 FP16/BF16 内存减少约 50%,允许近 2 倍 KV Cache 容量,主要提升吞吐量(无明显延迟改善)。
7.5 TurboQuant:3bit 极坐标量化(2025,Google)
Google 最新提出的量化方案(ICLR 2026 投稿),组合了两项技术:
- PolarQuant:将向量转为极坐标,对角度分量进行 3bit 均匀量化,消除传统归一化误差
- QJL(量化 Johnson-Lindenstrauss 变换):用 1bit 符号校正消除量化偏差
声称效果:内存节省 6 倍,注意力计算加速 8 倍,困惑度零损失(尚待同行评审)。
八、KV Cache 稀疏化与驱逐策略
8.1 H2O:Heavy-Hitter Oracle(NeurIPS 2023)
论文:Zhang et al.,"H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models",arXiv:2306.14048,NeurIPS 2023
核心洞察:注意力分数分布极度不均——少数 token(Heavy Hitters,H²)持续积累大量注意力权重,且这种重要性具有跨层持久性。
算法:将 KV Cache 驱逐形式化为动态子模最优化问题,证明贪心策略具有理论保证:
保留策略 = Heavy Hitters(高频 token)+ 最近 token 滑动窗口
效果:保留约 20% KV Cache 的条件下,在 OPT、LLaMA、GPT-NeoX 上对多数任务精度几乎无损。
8.2 SnapKV:生成前一次性压缩(2024)
论文:Li et al.,"SnapKV: LLM Knows What You are Looking for Before Generation",arXiv:2404.14469,2024
关键洞察:模型在生成开始前(Prefill 阶段末),就已通过注意力模式"预知"哪些 token 在生成中会被频繁访问。
算法:
- Prefill 结束时,分析 Query 对 Prompt tokens 的注意力分布(Window 内最后若干 Query 的汇聚注意力)
- 动态选出重要 KV 对保留,其余一次性丢弃(无生成中动态开销)
- 支持 Llama/Mistral/Mixtral,成功应用于百万 token 级任务(LWM-Text-Chat-1M)
相比 H2O 和 StreamingLLM,SnapKV 在 LongBench 等长文本基准上精度显著更高。
8.3 StreamingLLM:Attention Sink 与无限流式推理(ICLR 2024)
论文:Xiao et al.(MIT),"Efficient Streaming Language Models with Attention Sinks",arXiv:2309.17453,ICLR 2024
Attention Sink 现象:初始 token(通常前 1–4 个)在各层中持续吸收大量注意力权重,成为"注意力汇"。若滑动窗口丢弃这些 token,模型输出会崩溃。
解决方案:
- 始终保留最初几个 Attention Sink tokens(即使超出窗口范围)
- 配合滑动窗口注意力,维持 O(1) 内存复杂度
效果:LLaMA-2、MPT、Falcon、Pythia 无需重新训练,稳定推理 400 万 tokens 及以上。
8.4 PyramidKV:按层动态分配预算(2024)
论文:Cai et al.,"PyramidKV: Dynamic KV Cache Compression based on Pyramidal Information Funneling",arXiv:2406.02069,2024
核心发现:LLM 各层注意力模式不同——底层注意力分散(需更多 KV),高层注意力高度集中(少数 KV 即可),信息流呈金字塔漏斗形汇聚。
策略:按层动态分配 KV 预算,底层多、顶层少(倒三角/金字塔形)。
实验数据(LLaMA-3-8B-Instruct,LongBench):
- 仅保留 2.5% KV Cache,保持 90% 模型性能
- 相比 H2O/StreamingLLM/SnapKV 等均分策略,在相同压缩比下精度更高
九、KV Cache 卸载:多级存储层次
9.1 存储层次架构
GPU HBM(~80GB,~3.35 TB/s)
↕ NVLink/PCIe(~900 GB/s)
CPU DRAM(~512GB,~200 GB/s)
↕ PCIe(~64 GB/s)
NVMe SSD(~8TB,~7 GB/s)
↕ 网络
远程分布式存储
9.2 FlexGen:三级存储调度(ICML 2023)
论文:Sheng et al.,"FlexGen: High-Throughput Generative Inference of Large Language Models",arXiv:2303.06865,ICML 2023
首个系统性利用 GPU/CPU/磁盘三级存储运行大型 LLM 的框架:
- 通过搜索最优调度策略(zig-zag 批处理顺序)最大化吞吐
- 允许在单张消费级 GPU(RTX 3090)上运行 OPT-175B
- 权重、KV Cache 和激活值均可分层存放
9.3 现代 KV Cache Offloading 系统(2025–2026)
| 工具 | 机构 | 特点 | 效果 |
|---|---|---|---|
| LMCache | 开源 | vLLM 插件,支持 CPU/SSD/远程多级存储 | TTFT 降低 3~10× |
| FlexKV | 腾讯 TACO | 分布式 KV 存储管理,多实例共享 | — |
| NVIDIA 多轮对话优化 | NVIDIA | KV Cache 前缀复用+Offloading | TTFT 降低高达 14× |
十、前沿进展:MLA 与 NSA(2024–2026)
10.1 MLA:Multi-head Latent Attention(DeepSeek-V2,2024)
MLA 是迄今架构层面最彻底的 KV Cache 压缩方案,通过低秩联合压缩从根本上改变注意力存储结构。
核心机制对比:
# 标准 MHA:存储完整 K, V
# 每 token 存: num_heads × head_dim × 2 维 = 128 × 128 × 2 = 32768 维(FP16 = 65536 bytes)
# MLA:只存储低维潜在向量 + 解耦位置编码
c_kv = X @ W_DKV # 低秩压缩向量(kv_lora_rank = 512 维)
k_pe = X @ W_KR # 解耦 RoPE 编码(64 维)
# 存储:512 + 64 = 576 维 → FP16 = 1152 bytes
# 推理时按需解压(矩阵吸收技巧):
# Prefill:c_kv @ W_UK @ Q^T(展开为 MHA 形式)
# Decode :直接用 c_kv 与吸收后的投影矩阵计算(MQA 形式)
以 DeepSeek-V3(128K 上下文)计算压缩比:
| 指标 | 标准 MHA | MLA | 压缩比 |
|---|---|---|---|
| 每 token KV Cache(FP16) | 65,536 bytes | 1,152 bytes | 56.9× |
| 4K token 总 KV | 262 MB | 4.6 MB | 98% 节省 |
| 128K token 总 KV | 8.4 GB | 148 MB | 98% 节省 |
| 1M token 总 KV | 67 GB | 1.18 GB | 98% 节省 |
性能对比:
- Decode 阶段:约 1.2 倍加速(内存带宽压力下降)
- Prefill 阶段:约 0.9 倍(有解压开销)
- 整体吞吐:约 2 倍提升(相同 GPU 可服务更多并发)
- DeepSeek-V3 整体 KV Cache 减少 93.3%
10.2 NSA:Native Sparse Attention(DeepSeek,2025 年 2 月)
论文:Yuan et al.,"Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention",arXiv:2502.11089,2025 年 2 月
NSA 是首个真正端到端可训练的稀疏注意力机制,解决了以往稀疏方案无法与预训练协同优化的缺陷。
三层分层稀疏策略:
全文上下文
│
├── [1] 粗粒度 Token 压缩:聚类/池化 → 全局语义块
├── [2] 细粒度 Token 选择:动态筛选关键局部片段
└── [3] 滑动窗口局部注意力:保留近邻精度
↓
三路注意力结果融合(加权求和)
技术优势:
- 硬件对齐:充分利用 GPU 并行性,避免内存访问不连续
- 在 64K 序列长度下,解码/前向/反向传播均显著快于全注意力
- 通用基准+长上下文任务性能持平或优于全注意力模型
- 与 MLA 互补:MLA 压缩 KV 维度(深度方向),NSA 压缩 KV 数量(序列方向)
十一、代码实战:用 vLLM 实践各项优化
11.1 基础推理(启用默认优化)
from vllm import LLM, SamplingParams
# vLLM 默认启用 PagedAttention + Continuous Batching
llm = LLM(
model="meta-llama/Llama-3.1-8B-Instruct",
gpu_memory_utilization=0.90, # GPU 显存利用率
max_model_len=8192, # 最大上下文长度
)
prompts = [
"请介绍 Transformer 架构的核心原理。",
"什么是 KV Cache?",
]
sampling_params = SamplingParams(temperature=0.8, max_tokens=512)
outputs = llm.generate(prompts, sampling_params)
11.2 启用 Prefix Caching + Chunked Prefill
llm = LLM(
model="meta-llama/Llama-3.1-8B-Instruct",
enable_prefix_caching=True, # 启用前缀缓存
max_num_batched_tokens=16384, # Chunked Prefill:较大值优化吞吐
# max_num_batched_tokens=2048, # 较小值优化 Decode 延迟(ITL)
gpu_memory_utilization=0.95,
)
# 多个请求共享相同前缀时,prefix caching 自动生效
sys_prompt = "你是一个专业的 AI 技术助手,擅长解析论文和技术概念。" * 50 # 长 system prompt
requests = [
f"{sys_prompt}\n用户问题: {q}"
for q in ["什么是 FlashAttention?", "解释 GQA 原理", "PagedAttention 如何工作?"]
]
# 第一次请求计算 sys_prompt 的 KV Cache
# 后续请求直接复用,TTFT 显著降低
11.3 FP8 KV Cache 量化
llm = LLM(
model="meta-llama/Llama-3.1-70B-Instruct",
kv_cache_dtype="fp8", # FP8 KV Cache(仅 H100/H200 原生加速)
calculate_kv_scales=True, # 自动校准量化尺度
gpu_memory_utilization=0.95,
tensor_parallel_size=4, # 多卡并行
)
# FP8 使 KV Cache 内存减少约 50%,可处理更长上下文或更大批次
11.4 计算 KV Cache 内存需求
def calc_kv_cache_gb(
num_layers: int,
batch_size: int,
seq_len: int,
num_kv_heads: int,
head_dim: int = 128,
dtype_bytes: int = 2, # FP16=2, INT8=1, FP8=1
) -> float:
"""计算 KV Cache 内存占用(单位:GB)"""
total_bytes = 2 * num_layers * batch_size * seq_len * num_kv_heads * head_dim * dtype_bytes
return total_bytes / (1024 ** 3)
# LLaMA-3 8B(GQA,32层,8 KV头)
# Batch=16,Seq=8K,FP16
kv_gb = calc_kv_cache_gb(
num_layers=32, batch_size=16, seq_len=8192,
num_kv_heads=8, dtype_bytes=2
)
print(f"LLaMA-3 8B, B=16, T=8K, FP16: KV Cache = {kv_gb:.2f} GB")
# 输出:LLaMA-3 8B, B=16, T=8K, FP16: KV Cache = 16.00 GB
# FP8 量化后
kv_gb_fp8 = calc_kv_cache_gb(
num_layers=32, batch_size=16, seq_len=8192,
num_kv_heads=8, dtype_bytes=1 # FP8=1B
)
print(f"LLaMA-3 8B, B=16, T=8K, FP8: KV Cache = {kv_gb_fp8:.2f} GB")
# 输出:LLaMA-3 8B, B=16, T=8K, FP8: KV Cache = 8.00 GB(减半!)
11.5 LMCache KV Cache CPU Offloading
# 安装:pip install lmcache vllm
from lmcache.config import LMCacheEngineConfig
from lmcache.integration.vllm import LMCVllmConfig
from vllm import LLM
# 配置 KV Cache 卸载到 CPU
lmcache_config = LMCacheEngineConfig(
chunk_size=256,
local_cpu=True, # 开启 CPU 内存卸载
max_local_cpu_size=20, # CPU 内存上限(GB)
)
llm = LLM(
model="meta-llama/Llama-3.1-70B-Instruct",
gpu_memory_utilization=0.6, # 降低 GPU 显存占用,给 KV Cache 留空间
lmcache_config=lmcache_config,
)
# 多轮对话时历史 KV Cache 自动卸载到 CPU,GPU 始终服务当前轮
十二、技术全景图与选型建议
KV Cache 优化四大方向
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 架构层面(设计时选择)
MHA → GQA(主流,4:1/8:1 分组)
MLA(DeepSeek,56.9× KV 压缩,架构重设计)
NSA(DeepSeek 2025,原生稀疏,与 MLA 互补)
2. 系统层面(部署时选择)
PagedAttention(vLLM,近零内存碎片,2-4× 吞吐)
Continuous Batching(Orca/vLLM,最高 23× 吞吐)
Prefix Caching(SGLang RadixAttention/vLLM,TTFT 降低 60-80%)
Chunked Prefill(Prefill-Decode 平衡,ITL 降低 20-50%)
3. 量化层面(精度换空间)
FP8(~50% 内存,生产可用,H100/H200 原生)
KIVI 2bit(~60% 内存,几乎无损精度)
KVQuant 3bit(支持超长上下文,100万 token)
4. 稀疏化层面(选择性丢弃)
H2O(20% KV 保留,精度接近全量)
SnapKV(Prefill 末一次性压缩,长上下文友好)
StreamingLLM(O(1) 内存,无限流式推理)
PyramidKV(2.5% KV 保持 90% 性能)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
选型建议:
• 生产部署通用场景 → vLLM + PagedAttention + Continuous Batching
• 多轮对话/RAG → 叠加 Prefix Caching(TTFT 大幅降低)
• 长上下文(>32K)→ GQA + KVQuant(3bit) 或 FP8 KV Cache
• 超长无限流式 → StreamingLLM(O(1) 内存,固定开销)
• 极致内存压缩 → MLA(若从头训练)或 KIVI 2bit(现有模型)
• 最新研究方向 → NSA + MLA 组合(DeepSeek 2025 路线)
参考资料
核心论文
- Attention Is All You Need - Vaswani et al., 2017
- Fast Transformer Decoding: One Write-Head is All You Need (MQA) - Shazeer, 2019
- GQA: Training Generalized Multi-Query Transformer Models - Ainslie et al., EMNLP 2023
- Efficient Memory Management for Large Language Model Serving with PagedAttention (vLLM) - Kwon et al., SOSP 2023
- Orca: A Distributed Serving System - Yu et al., OSDI 2022
- SGLang: Efficient Execution of Structured LM Programs - Zheng et al., 2024
- KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache - Liu et al., 2024
- KVQuant: Towards 10 Million Context Length LLM Inference - Hooper et al., NeurIPS 2024
- H2O: Heavy-Hitter Oracle for Efficient Generative Inference - Zhang et al., NeurIPS 2023
- SnapKV: LLM Knows What You are Looking for Before Generation - Li et al., 2024
- Efficient Streaming Language Models with Attention Sinks - Xiao et al., ICLR 2024
- PyramidKV: Dynamic KV Cache Compression - Cai et al., 2024
- FlexGen: High-Throughput Generative Inference of Large Language Models - Sheng et al., ICML 2023
- DeepSeek-V2: A Strong, Economical, and Efficient MoE LM (MLA) - DeepSeek-AI, 2024
- Native Sparse Attention (NSA) - Yuan et al., DeepSeek, 2025
工程资源
- vLLM 官方文档
- SGLang GitHub
- LMCache 文档
- NVIDIA: Mastering LLM Techniques: Inference Optimization
- Fast and Expressive LLM Inference with RadixAttention - LMSYS Blog
中文技术文章
- 图解KV Cache:解锁LLM推理效率的关键 - 腾讯云开发者社区
- 原理&图解vLLM Prefix Cache(RadixAttention)- 腾讯云开发者社区
- Multi-head Latent Attention (MLA) 深度解析 - Lei's Blog
- DeepSeek NSA:长文本加速9倍的稀疏注意力技术 - 知乎
- 大模型推理优化:KV Cache瓶颈与PagedAttention高效内存管理 - 机器学习与深度学习研究号,2026-03-25

浙公网安备 33010602011771号