KV Cache:原理与显存占比
一句话定义
KV Cache 把每层已算出的 Key/Value 向量存下来供后续 decode 步复用,用显存换掉每步对全序列的重复计算,是自回归推理"能跑"的前提,也是并发显存的最大可变项。
为什么重要
它是 decode 阶段三项读取(权重、KV、激活)中唯一随上下文与并发线性增长的一项:长上下文场景 KV 甚至超过权重成为显存第一大头。不理解 KV Cache,就无法理解 PagedAttention(kp-014)、GQA(kp-016)与几乎全部服务端调度设计。
前置知识
- kp-003(decode 逐步生成、读取主导)。
- 注意力计算 Q·Kᵀ→softmax→·V 的结构(最小回顾)。
核心概念
- 为什么能缓存:decode 第 t 步的注意力要用前 t−1 个 token 的 K/V,而这些值由历史输入唯一决定、与新生成内容无关——天然可复用。
- 缓存的代价:显存占用随 序列长度 × 并发 线性增长;且每步 decode 都要把全部历史 KV 从显存读进算核,长上下文时这也是带宽大头。
- 不缓存会发生什么:每步都要对整个前缀重新 prefill,单步计算量 O(n²) 增长,长序列下慢到不可用——KV Cache 不是"可选优化"而是必需品。
原理与机制
KV Cache 成立的原因是:历史 token 的 K/V 只由前缀决定、与后续生成内容无关,因此算一次就能复用。它昂贵的原因是体积随 层数×KV头数×序列×并发 线性增长。这两个事实分别派生出两条故事线:它是自回归推理的"必需品"(去掉则每步重算全前缀),同时是显存账本里最值得压缩的"可变项"。
公式与模型
可复现推导(Llama-2-7B,MHA,FP16,L=32、H_kv=32、d_head=128):
- 每 token:2×32×32×128×2B = 524,288 B ≈ 0.5 MB;
- 单请求 4096 上下文 ≈ 2.1 GB;20 并发 ≈ 42 GB——超过权重(14GB)的 3 倍;
- GQA 8 头(kp-016):每 token 0.125 MB,20 并发 ≈ 10.5 GB,差 4 倍。这就是近年模型标配 GQA 的原因。
图示
decode 第 t 步: 新token → Q_t ──┐
├─ attention( Q_t × KV[0..t-1] ) → 输出
显存中的 KV Cache[0..t-1] ──────┘ (每层都有,逐层累加)
直观类比
KV Cache 像会议纪要:每来一句新发言(新 token),不必重放全程录音(重算全前缀),翻纪要即可接上讨论——代价是纪要越写越厚(显存线性涨)。
实例或案例
同一个 7B 服务把 max context 从 4k 提到 32k:单请求 KV 从 2.1GB 涨到 16.8GB(MHA),原 20 并发配置直接 OOM。运维上"长上下文版本上线就宕"几乎都源于没重算 KV 账本(kp-004)。
常见误区
- "KV Cache 是省显存的优化":恰恰相反——它花显存省计算;省显存的是它的压缩技术(kp-016)。
- "KV 显存可忽略":长上下文 × 高并发下它是第一大头。
- "cache 大小与精度无关":KV 半精度化(FP8/INT8)是常见压缩项,但检索任务对 KV 量化敏感,需评测(kp-009 方法论)。
自测题
- 推导 13B(L=40,GQA H_kv=8,d_head=128,FP16)每 token KV 字节。
要点:2×40×8×128×2 = 163,840 B = 0.16 MB/token。
- 为什么 KV Cache 与"新生成的内容"无关也能被复用?
要点:历史 token 的 K/V 由历史输入唯一决定。
- 不用 KV Cache,第 t 步的计算复杂度是多少?
要点:需重算全前缀,约 O(t²) 级注意力计算,长序列不可行。
与其他知识点的关系
kp-004 账本中 KV 是最大可变项;kp-014 解决其显存管理碎片问题;kp-016 解决其绝对体积问题;kp-021 的调度按 KV 占用决定准入。
延伸阅读
kp-014 的 vLLM 论文第 2 节给出了真实系统中 KV 显存浪费的量化数据,是本页的最佳续篇。