第一性原理¶
本章回答一个问题:为什么 KVCache 值得一篇综述。这部分提供贯穿全文的两组心智模型——KVCache 的双重身份和 Prefill/Decode 二分法。后续所有章节都建立在这两点之上。
1. 为什么是"一等公民资源"¶
KVCache 在过去两三年里完成了一次身份转变:
| 阶段 | 角色 | 关注点 |
|---|---|---|
| 早期(2018–2022) | Transformer 推理里一个避免重复计算的小 trick | 复杂度 O(n²) → O(n) |
| 现在(2023–) | 决定推理集群成本结构、调度策略、SLO 可达性的一等公民资源 | 容量、带宽、命中率、迁移、租期 |
类比一下:它从 CPU 寄存器里的临时变量,演化成了类似数据库 Buffer Pool 的系统级资源池。
为什么会这样?因为它同时被四股力量拉扯,每一股都在加速它的"系统化":
- 算法演进——attention 变体(MHA/MQA/GQA/MLA)、稀疏、量化、压缩不断改变 KV 的形状与语义
- 系统层级——HBM → DRAM → SSD → 远端 KV 池让 KV 在多级介质间流动
- 部署形态——PD 分离、并行切分、调度、扩缩容让 KV 跨进程、跨节点存在
- 工作负载——多轮、Agent、Coding、RAG、Reasoning 让 KV 的访问模式高度异质
任何一个维度单独看都不至于让 KVCache 变成"系统问题",但四个维度同时拉扯,单点优化已经无法闭合。整篇综述的组织思路就是把这四股力量先各自拆开看清楚,再回到交叉点上看真实复杂度。
2. KVCache 的"双重身份"——讨论混乱的高发地¶
KVCache 在不同语境下指代不同的东西,这是讨论时最容易"串味"的地方:
| 视角 | KVCache 是什么 | 体现形式 |
|---|---|---|
| 计算视角 | Prefill 的产物、Decode 的输入 | Attention kernel 里的张量 |
| 存储视角 | 占据显存/内存/磁盘的有状态数据 | 内存池中的块、文件中的对象 |
同一个 KV 张量,在 Attention kernel 里它是被加权求和的 V;在 Block Manager 里它是若干个 16-token 的 Block;在分布式 KV 池里它是带 hash key 的对象;在监控指标里它是 GB-hour 计费单位。
讨论"KVCache 怎么搬"的时候是存储视角,讨论"KVCache 怎么参与计算"的时候是计算视角。两个视角的界面在哪里?答案是Block Table 这一间接层——它把"Sequence 看到的逻辑 KV"映射到"内存池里的物理 Block",让计算视角和存储视角解耦。详见 运行时架构。
3. Prefill/Decode 二分法——贯穿全文的根¶
LLM 推理不是匀质的"一段计算",而是两个特征截然不同的阶段:
| 维度 | Prefill | Decode |
|---|---|---|
| 计算模式 | 整个 Prompt 并行 | 每步 1 个 token |
| 计算特征 | Compute-bound | Memory-bound |
| KV 操作 | 大量写入 | 持续读取 + 单步追加 |
| 延迟贡献 | TTFT(首 token 延迟) | TPOT / ITL(每 token 延迟) |
| 适合的硬件 | 高算力 GPU | 高带宽 HBM |
| 批量化逻辑 | 大 batch 提升算力利用率 | 大 batch 摊薄 HBM 带宽,但受 KV 容量制约 |
这一二分法是后续几乎所有结构性设计的根本依据:
- PD 分离——P 和 D 资源画像不同,混部互相干扰,干脆分开
- Chunked Prefill——把长 Prefill 切碎与 Decode 混跑,让 GPU 既不空转也不卡
- Prefix Cache——既然 Prefill 写入的 KV 在跨请求间常常重复,就缓存下来供 Decode 直接读
- Cache-Aware Routing——把同一前缀的请求路由到同一副本,最大化缓存命中
读完本综述如果只能记住一件事,那就是 Prefill 和 Decode 是两种生物。
4. 关键评估维度(指标地图)¶
为后续讨论建立一个统一的"指标坐标系":
| 类别 | 指标 | 说明 |
|---|---|---|
| 容量 | 单 token KV size、总占用、page 粒度 | 决定并发上限 |
| 带宽 | KV 读带宽、PCIe / RDMA 传输带宽 | Decode 的瓶颈 |
| 延迟 | TTFT、TPOT/ITL、长尾 P95/P99 | SLA 可达性 |
| 吞吐 | tokens/s/GPU、并发请求数 | 单卡产能 |
| 命中率/复用率 | prefix hit、跨请求/会话复用 | 决定是否需要重算 |
| 成本 | $/M tokens、KV-GB-hour | 商业可持续性 |
详细展开见 评估方法。
5. 本综述的范围与非范围¶
- ✅ 覆盖:以推理时的 KVCache 为中心的算法 + 系统 + 部署 + 负载视角
- ❌ 不覆盖(或仅作背景):
- 训练时的 attention 优化(FlashAttention 类)——只在与推理 kernel 相关时提及
- KVCache 之外的 prefill/decode 通用优化(如 speculative decoding 的算法层)
- 模型架构本身的设计动机——只关心架构选择对 KV 的影响
阅读建议:
版本历史¶
| 版本 | 日期 | 说明 |
|---|---|---|
| v0.1 | 2026-05-14 | 框架搭建 |