KV Cache 为什么能加速推理?一个自注意力视角

从 Transformer 自注意力公式推导 KV Cache 的保存对象与显存权衡。

展开文章目录

解码阶段逐 token 生成,但每个 token 都要“重新看一遍历史”吗?KV Cache 的答案:历史 token 的 Key/Value 计算结果不需要重算。

自注意力的计算切分

对位置 tt 的查询向量,注意力输出是:

attnt=softmax ⁣(qtK≤t⊤dk)V≤t\text{attn}_t = \text{softmax}\!\left(\frac{q_t K_{\le t}^{\top}}{\sqrt{d_k}}\right) V_{\le t}

其中 K≤tK_{\le t} 和 V≤tV_{\le t} 由历史 token 线性投影得到。若没有缓存,每生成一个新 token 都要对全部历史重新做矩阵乘法。

缓存了什么

推理框架保存的是每一层的 K、V 张量,而不是原始 hidden state:

张量随 token 变化生成时重算
Q每次新是
K/V(历史)追加否
W_q/W_k/W_v固定否

显存权衡

缓存需要显存。每个 token 的缓存字节数可以写成:

KV bytes per token=2×L×Hkv×dhead×b\text{KV bytes per token} = 2 \times L \times H_{\text{kv}} \times d_{\text{head}} \times b

其中 LL 是层数,HkvH_{\text{kv}} 是 KV heads 数量,dheadd_{\text{head}} 是头维度,bb 是每个元素的字节数。这里不能用 dmodeld_{model} 或注意力头总数替代 KV heads。GQA/MQA 会减少 HkvH_{\text{kv}},从而直接降低每个 token 的缓存。

所以 7B 模型在长上下文、高并发下,KV Cache 可能比权重更占显存。GQA 降低缓存字节数;PagedAttention 降低分配碎片并支持共享;sliding window 则裁剪可见历史。三者解决的是不同层面的问题,不能互相替代。

面试可用的一句话

“KV Cache 是在时间维上做动态规划:每步只需计算当前 token 的 Q 与历史 K/V 的点积,代价是把历史 K/V 显式存下来。”

这句话同时证明你懂公式、懂显存、懂为什么现代架构要改注意力头结构。

证据清单

来源与适用范围

  1. 论文

限定条件:公式推导与公开模型机制分析,不包含特定硬件实测。

本文遵循 CC BY-NC-SA 4.0

站点代码采用 MIT。所有模拟结果都标注了假设,不替代目标环境实测。

继续阅读归档