↓ Skip to main content

为什么自回归推理缓存 KV,而不缓存历史 Q?

·162 words·1 min
Jinyu Chen
Author
Jinyu Chen
问题驱动的个人知识库

判断归属:AI 候选。 定义与文献事实注明来源;例子、推导和组织方式是本次整理的解释,尚未经过用户逐项确认。

Reusable-state
#

前置知识是因果自注意力及逐 token 生成。讨论固定参数、相同前缀、相同位置和注意力规则、关闭随机训练操作的标准因果模型。浮点计算实现差异可能产生微小数值差别。

在每一层,历史位置 ii 只能依赖 x≤ix_{\le i}。追加新 token 不改变这些输入,也不允许历史位置读取新 token。因此历史隐状态保持相同,由它投影得到的 ki,vik_i,v_i 也相同。这一层的论证逐层成立,于是各层历史 KV 都可复用。缓存的直接实现依据见GPT-2 attn 与缓存文档。

对当前位置 tt,只计算当前的 qt,kt,vtq_t,k_t,v_t,把新 KV 追加到各层缓存:

K≤t=[K<t;kt],V≤t=[V<t;vt],ot=softmax⁡(qtK≤t⊤dk)V≤t. K_{\le t}=[K_{<t};k_t],\qquad V_{\le t}=[V_{<t};v_t],\qquad o_t=\operatorname{softmax}\left(\frac{q_tK_{\le t}^{\top}}{\sqrt{d_k}}\right)V_{\le t}.

历史 Q 用于历史位置自己的输出,而当前输出只需要当前 Q 与全部可见 KV。历史输出已经处理完毕,继续保存历史 Q 对标准逐 token 解码没有必要。这是数据依赖关系的结果,不是 Q 的大小与 KV 不同,也不是禁止其他算法存储 Q。

Prefill-and-decode
#

Prefill 一次处理提示词,计算各层 KV,并从最后一个有效位置的 logits 选择第一个输出 token。随后每次 decode 将刚选出的 token 输入模型,生成它的 KV,再选择下一个 token。KV 尚未覆盖“刚从 logits 选出、还未送入模型”的 token;这是区分缓存长度与已输出长度时容易混淆的一步。

训练时整段标签已知,可以批量计算全部位置;标准缓存主要服务自回归推理。编码器—解码器模型还可复用不随解码步变化的编码器侧交叉注意力 KV,不能把所有缓存现象限制成 decoder-only 模型。

Cost
#

下面是对稠密全上下文注意力的算术计数,固定层数和头数,不是实测延迟承诺。设当前上下文长度为 tt、模型宽度为 dd:

计算范围主要注意力计算线性层和 MLP 的代表性开销
每步重跑整个长度 tt 的前缀O(t2d)O(t^2d)O(td2)O(td^2)
缓存后只计算一个新位置O(td)O(td)O(d2)O(d^2)

因此“二次变线性”描述的是这两种单步计算方式中的注意力部分。若从短序列持续生成至长度 NN,缓存后的注意力累计为

∑t=1NO(td)=O(N2d), \sum_{t=1}^{N}O(td)=O(N^2d),

而不是 O(Nd)O(Nd)。提示词长度为 PP、另生成 GG 个 token 时,需另计 prefill 的 O(P2d)O(P^2d) 和 decode 累积的 O((PG+G2)d)O((PG+G^2)d);投影与 MLP 也应另计。缓存并未让当前 token 不再读取历史。

单请求、单 token 解码常把某些线性层计算变为向量乘矩阵;批量请求、多个新 token 或融合实现仍可能以矩阵乘法组织。GEMV/GEMM 的名字不能直接推出 decode 延迟总比 prefill 小;两者处理 token 数、并发量和内存访问方式不同。

Memory
#

设批量为 BB、层数为 LL、历史长度为 TT、KV 头数为 hkvh_{kv}、每头维度为 dhd_h、每元素字节数为 bb,完整 KV 数据的近似大小为

MKV=2BLThkvdhb. M_{KV}=2BLTh_{kv}d_hb.

系数二对应 K 与 V。这里不含分配碎片、元数据、其他激活和模型权重;分层配置不同时需逐层求和。固定其他条件时,长度和并发都使缓存线性增大。减少 KV 头数、精度或保存长度作用于不同因子,代价也不同。

Validity
#

复用要求参数及前缀计算条件一致。修改历史 token、模型/适配器、位置处理或可见范围可能使后续缓存失效。双向自注意力追加输入后,历史表示通常也会改变,上述因果论证不成立。跨请求复用必须匹配可复用前缀及模型条件,不能只比较文本“意思相近”。

工程延伸:缓存优化的不同目标区分减少重算、减少实际 KV 数据、减少分配浪费与改变存储位置,解释缓存为何也会成为瓶颈。

Revision
#

2026-10-12:合并 KV 原理与 prefill/decode 旧解释;将复杂度口径拆为单步、全过程及内存,撤去固定50%提速和 decode 必然更快的说法。推导为 AI 候选。