KV Cache是LLM中加速运算的非常重要的一步,能够保证模型在对话过程中,输入文本越来越长却不影响推理速度。
如图所示,在LLM推理过程中,KV Cache占据了很大一部分的显存。

注意力机制
LLM的流程本质是输入n个token, 输出第n+1个token,当得到第n +1个token,此时再根据0~n+1个token预测第n+2个token,以此反复。
LLM中预测下一个token中,最关键的一步是Self Attention的计算,假设我们输入的N个token得到了N个q,k,v向量,用数学表示就是qi,ki,vi(i∈(0,n))
Self Attention的过程是对N个token进行qkv计算,具体的公式为∑j=0nSoftmax(dk1qiTkj)vj, 去除固定系数dk1, 得到∑j=0nSoftmax(qiTkj)vj
这样就得到了第i个token的注意力向量为∑j=0nSoftmax(qiTkj)vj
因果掩码
在预测第 i+1 个token的过程中,llm只能看到 0 到 i 个位置的token,而不能看到 i+1 以及之后的token。从数学上描述就是∑j=0iSoftmax(qiTkj)vj , 注意 j 的范围变化。
KV Cache
可以注意到,计算i+1个token的时候,需要对于每个 qi都要计算∑j=0iSoftmax(qiTkj)vj , 其中kjvj 是共有的。
其次当计算i+2个token的时候,需要对于每个qi都要计算∑j=0i+1Softmax(qiTkj)vj=∑j=0iSoftmax(qiTkj)vj+qiTkj+1vj+1 , 又出现kjvj
因此kv可以进行缓存,当计算i+2个token的时候,只需要再计算一下kj+1vj+1就行

从矩阵的角度更容易理解,如图计算出了过往所有Token的KV,公式为QKTV=Q(KTV) 。在通过当前Token来计算下一个Token时,公式为qiKi∗iTVi∗i=qikiTvi+qiK(i−1)∗(i−1)TV(i−1)∗(i−1) , 因此缓存KTV就行了
为什么没有Q Cache
从上面的推导可以知道,预测下一个token并不需要和以前token的Q向量进行计算,只需要使用当前token对应的Q向量,因此没必要缓存