如下图llama2的LlamaAttention为例,LLM在具体实现时,使用变量past_key_value缓存之前的位置已经转换过Key,Value。其格式是(key_states, values_states),其中key_states,values_states即是 缓存Key矩阵,Value矩阵。 当LLM的use_cache使用True时,这时模型推理的输入hidden就是单个Token,该过程也会使用past_key_value变量。
在LLM推理中,生成每个新token时都需要attention操作,这里要反复访问之前生成的Key/Value Cache,也就是我们要探讨的KVcache。可以看出,KVCache可以显著减少重复计算,从而提高LLM系统效率。 Prefill阶段:一次性处理全部输入tokens,把K/V缓存起来; Decoding阶段:逐token生成,每生成一个新token就要访问前面的KVCache。 传统的...
再深入一层,看看模型的forward方法(例如,根据LlamaForCausalLM.forward的文档),如期找到了use_cache布尔参数。启用KV缓存后,我们有两个输入:上一个生成的词元和KV缓存,它们分别通过参数input_ids和past_key_values进行传递。新的KV值(即作为当前迭代的一部分计算得出的值)作为forward方法输出的一部分返回,以便...
如下图所示,MHA中每个Query向量都会对应一个Key,Value,其输出会把每个注意力头的输出拼接起来。因此也会存较多的KV Cache。 MQA,即Multi Query Attention。如下图所示,MQA的思路比较直接,就是让每个注意力头共用一个KV,很显然,相较于MHA,KV Cache的占用直接减少到了1/head_num。...
使用KV Cache 后: 只需要计算当前新 token 的 Key/Value,并追加到缓存中。 计算量随 Token 长度增加仅为线性增长,显著加速推理。 (2)减少显存(VRAM)占用 标准Transformer需要存储完整的 Attention 计算历史,占用大量显存。 KV Cache 仅存储 Key/Value 矩阵,相比于存储整个计算图,显存占用大幅降低。
常见的 KV Cache 机制能够节约模型计算的时间,但是在多轮对话的情景下,key 和 value 的缓存会消耗大量的内存,无法在有限的显存下无限扩展上下文。同时,训练好的模型在不做二次微调的前提下也无法很好地泛化到比训练序列长度更长的文本,导致生成效果糟糕。图来源:https://arxiv.org/pdf/2309.17453.pdf Strea...
PagedAttention 没有涉及到的另一个可能的优化措施是跨请求重用键值缓存(reusing the key-value cache across requests)。当提示词(prompts)共享某一类共同的前缀时,这种优化就会适用,这种情况通常出现在聊天界面和Agent等多轮用例或使用提示词模板时(图 4)。
常见的KV Cache机制能够节约模型计算的时间,但是在多轮对话的情景下,key和value的缓存会消耗大量的内存,无法在有限的显存下无限扩展上下文。同时,训练好的模型在不做二次微调的前提下也无法很好地泛化到比训练序列长度更长的文本,导致生成效果糟糕。 图来源:https://arxiv.org/pdf/2309.17453.pdf ...
PagedAttention 没有涉及到的另一个可能的优化措施是跨请求重用键值缓存(reusing the key-value cache across requests)。当提示词(prompts)共享某一类共同的前缀时,这种优化就会适用,这种情况通常出现在聊天界面和Agent等多轮用例或使用提示词模板时(图 4)。
Memory=batch_size * seq_length * hidden_size * layers * 2 * 2 ; 第一个2是key + value的vector都要cache,第二个2是fp16; 这两大块显存中,parameters占用是刚性的,只要参数量不减少,这个部分显存是没法节约的(除非INT8甚至INT4量化)!剩下的就是kv cache了,用vllm官网的话说:As a result, efficien...