自回归生成时,每产生一个新 token 都要对整段序列做注意力。但由于因果掩码,历史 token 的 K、V 不会因新 token 而改变,重复计算纯属浪费。KV Cache 把每个层、每个历史位置的 K、V 缓存下来,新 token 只需算自己的 QKV,再与缓存的 K、V 做一次注意力,每步复杂度从 O(n²) 降到 O(n)。
代价是显存:cache 大小 = 层数 × 2(K和V)× 序列长 × KV头数 × 头维度 × 字节数。以 7B 模型(32 层、GQA 8 个 KV 头、头维 128、FP16)为例,每 token 约 0.5MB,十万 token 上下文就要约 50GB。因此 KV cache 是长上下文推理的显存瓶颈。
优化方向:MQA/GQA 减少 KV 头数、KV cache 量化到 INT8/INT4、PagedAttention(vLLM,像操作系统管理页表一样管理显存碎片)、滑动窗口注意力。追问方向:prefill 与 decode 两个阶段的计算特征有何不同(计算密集 vs 访存密集)?