1 什么是KV Cache

Untitled

LLM(大型语言模型)中的 Attention 机制中的 KV Cache(键值缓存)主要作用是存储键值对,以避免在每次生成 token 时重新计算键值向量,从而减少计算量和提高效率。利用预先计算好的 K 值和 V 值,可以节省大量计算时间,尽管这会占用一定的存储空间。

随着模型规模的增大和数据量的增加,LLM 的窗口长度也在不断增大,因此就出现一组主要矛盾,即:对不断增长的 LLM 的窗口长度的需要与有限的 GPU 显存之间的矛盾。为了解决这个问题,需要优化 KV Cache,减少重复计算,以提高推理性能。

2 使用KV Cache

在推理的时候transformer本质上只需要计算出$O_i$,即一个字一个字地蹦。再根据上面的结论,

  1. Attention的第i个输出只和第 i 个query有关,和其他query无关,所以query完全没有必要缓存,每次预测$O_i$时只要计算最新的$Q_i$即可,其他的丢弃即可
  2. Attention的输出O_i的计算和完整的K和V有关,而K、V的历史值只和历史的O有关,和当前的O无关。那么就可以通过缓存历史的K、V,而避免重复计算历史K、V

Untitled

因此,当预测 今天天气真 → 好 时,使用kv cache后流程如下:

  1. 输入的向量
  2. 提取真对应的$Q_i, K_i, V_i$
  3. 拼接历史K、V的值,得到完整的K、V
  4. 然后经过Attention计算,获得$O_i$ 输出
  5. 根据$O_i$ 计算得到

3 公式证明

Attention的计算公式如下:

$$ O=Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V $$

3.1 Attention的$O_i$只和$Q_i$有关

假设: