URL
- paper:
kv cache
是一种生成式大模型加速的方法,没有原创的论文,比较早的提到这项技术的论文是:《Efficient Scaling Transformer Inference》 - code: https://github.com/huggingface/transformers/blob/f0bc49e7f61f74f055c47ad40e6010f57eed0b0b/src/transformers/models/gpt2/modeling_gpt2.py#L290
transformers repo
中的GPT2
模型代码中包含use_cache
和layer_past
就是kv cache
的实现接口
TL;DR
GPT like
大语言模型目前在生成式大模型领域占了主导地位,这些模型每一次推理只得到一个token
,下一次推理会将得到的token
放到上一次输入token
序列的末尾作为新输入,直到达到max_seq_length
或输出的token
表示end of sequence
- 这种
GPT like
的生成机制意味着每次推理需要将之前所有token
再重复算一次,序列长度越长,计算量越大,耗时越长 KV Cache
通过缓存上一次推理过程中每一层transformer
的key / value
,将推理的时间复杂度从 降低到了 ,且计算结果完全等价
Algorithm
- 可以在本时间步使用上一个时间步缓存的
key / value
的必要理论依据是:- 每个时间步输入的
token
序列除最后一个token
之外都和上一个时间步输入相同 attention mask
是下三角矩阵- 对
attention score
矩阵做softmax
是逐行的而不是全局的或逐列的 - 除
self-attention
操作之外,GPT like LLM
的其他层(layer norm
,gelu
,FFN
等)对seq_len
维度来说都是element-wise
的,且在推理阶段是静态的
- 每个时间步输入的
- 以上四个理论依据在
GPT like
模型中都满足,下面解释四个条件为什么是必不可少的:- 如果上面第一个条件不满足,那么每次推理都是新的内容,缓存将毫无意义
- 下三角矩阵和逐行做
softmax
是必不可少的,随着token
长度加一,每一层的attention score
矩阵都会在最右和最下分别加一列和一行,由于下三角的存在,除最后一行外,其他每一行的值都不会改变(新加的一列不参与计算),而且逐行做,新加的一列也不影响其他行 self-attention
是GPT like LLM
中唯一一个在token feature
间做信息融合的算子,其他算子都是在token feature
内做且都是静态操作,所以随着序列长度变长,之前的序列特征都是静态的
1 | import torch |
可以看到随着时间步的推移,每一层的
x / q / k / v / attention weight
的前n-1
个token feature
都和上一个时间步相同,因此可以缓存
Thought
- 实际上
q / k / v / attention weight
都可以缓存,只缓存k / v
是计算量和IO
量的tradeoff
paged attention
是通过类似内存分页管理的方式管理kv cache
的一种方法,动态分配显存,速度更快,支持更高batch