模型部署与推理优化

KV Cache:原理与显存占比

kp-013核心20 分钟04-KV与注意力

一句话定义

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头数×序列×并发 线性增长。这两个事实分别派生出两条故事线:它是自回归推理的"必需品"(去掉则每步重算全前缀),同时是显存账本里最值得压缩的"可变项"。

公式与模型

BytesKV = 2K,V × L × Hkv × dhead × Nctx × Bbatch × Bdtype

可复现推导(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 方法论)。

自测题

  1. 推导 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。

  1. 为什么 KV Cache 与"新生成的内容"无关也能被复用?

要点:历史 token 的 K/V 由历史输入唯一决定。

  1. 不用 KV Cache,第 t 步的计算复杂度是多少?

要点:需重算全前缀,约 O(t²) 级注意力计算,长序列不可行。

与其他知识点的关系

kp-004 账本中 KV 是最大可变项;kp-014 解决其显存管理碎片问题;kp-016 解决其绝对体积问题;kp-021 的调度按 KV 占用决定准入。

延伸阅读

kp-014 的 vLLM 论文第 2 节给出了真实系统中 KV 显存浪费的量化数据,是本页的最佳续篇。

#KV Cache#自回归#显存#GQA