一、什么是kv cache?
https://zhuanlan.zhihu.com/p/655325832
- 自回归场景引发的KVCache问题
减少推理过程中kv键值对的重复计算,实现kv cache的优化。目前减少KV cache的手段有许多,比如page attention、MQA、MGA等,另外flash attention可以通过硬件内存使用的优化
二、KV Cache 大小
KV Cache 的大小与模型配置(层数,hidden_size,Attention head 个数等)以及序列长度、Batch Size 成正比。其中单个 Token 对应的 KV Cache 大小与模型配置相关,并且是固定的,这里将其称为单位 KV Cache 计算公式为:
sum_token = (hidden_size / num_attention_heads * num_key_value_heads) * num_hidden_layers * 2 (k, v)
而总的 KV Cache 大小为:
sum = sum_token * seq_len * batch_size
batch_size 和 seq_len 越大,KV Cache 越大,如下图所示为 LLaMA2-7B 模型的 batch_size 和 seq_len 对应的 KV Cache 大小(默认 FP16 精度):
-
当 batch_size * seq_len 为 32K 时,比如 batch_size 为 1,seq_len 为 32K,其 KV Cache 大小为 16GB,甚至超过模型权重大小 14GB。
-
当 batch_size * seq_len 为 128K 时,比如 batch_size 为 1,seq_len 为 128K,其 KV Cache 大小为 64GB,加上模型权重 14GB 甚至快要超过 A100 GPU 的 80GB 显存限制。
三 稀疏化KV cache (Attention Sparsity)
SnapKV 的解决方法
https://arxiv.org/pdf/2404.14469
-
分解 Prompt(输入上下文):
- 将输入上下文(Prompt)拆分成两部分:
- Prefix:较早部分的 Token(例如序列的开头)。
- Window:靠近生成位置的最近 Token(即当前关注的“窗口”)。
- 将输入上下文(Prompt)拆分成两部分:
-
稀疏化 KV Cache:
- 不是保留 Prefix 中所有 Token 的 KV Cache,而是通过注意力分数(Attention Score)从 Prefix 中挑选出与当前 Window 相关性最高的一部分 Token。
- 每个注意力头会根据它自己的注意力分数,独立选择需要保留的 Token。因此,不同的头可能会从 Prefix 中选择不同的 Token。
-
最终的 KV Cache:
- 将以下两部分组合成最终的 KV Cache:
- Window 中所有 Token 的 KV Cache(因为它们与当前生成任务最密切)。
- 从 Prefix 中挑选出来的重要 Token 的 KV Cache。
- 将以下两部分组合成最终的 KV Cache:
-
固定 Prompt 的 KV Cache:
- 在生成(Decoding)阶段,SnapKV 不会更新 Prompt 的 KV Cache,这进一步减少了计算量和内存需求。
- GKA
将value和key分组,取平均值(做实验发现取平均、取第一个、随机取方法中,取平均是最好的)
三、投机采样
小模型推理,大模型验证修改(验证的长度可以自己设置,10个字符串验证一次)
P概率是否够高,高的话通过
小模型生成japan… bond但是大模型验证bond的概率低,n的概率高,于是修正为n
四、RWKV
基础知识:
Cross attention用的是input的k、v; 用的是output的q
对于Transformer而言,每次的输入为:[batch_size,seq_length,d_module]结构,由于句子一般是长短不一的,而输入的数据需要是固定的格式,所以要对句子进行处理。
通常会把每个句子按照最大长度进行补齐,所以当句子不够长时,需要进行补0操作,以保证输入数据结构的完整性
但是在计算注意力机制时的Softmax函数时,就会出现问题,Padding数值为0的话,仍然会影响到Softmax的计算结果,即无效数据参加了运算。
为了不让Padding数据产生影响,通常会将Padding数据变为负无穷,这样的话就不会影响Softmax函数了
Self-Attention Masked
Self-Attention Masked只发生在Decoder操作中,在Decoder中,我们的预测是一个一个进行的,即输入一个token,输出下一个token,在网上看到一个很好的解释如下:
假设我们当前在进行机器翻译
输入:我很好
输出:I am fine
接下来是Decoder执行步骤
第一步:
·初始输入: 起始符 + Positional Encoding(位置编码)
·中间输入:(我很好)Encoder Embedding
·最终输出:产生预测“I”
第二步:
·初始输入:起始符 + “I”+ Positonal Encoding
·中间输入:(我很好)Encoder Embedding
·最终输出:产生预测“am”
第三步:
·初始输入:起始符 + “I”+ “am”+ Positonal Encoding
·中间输入:(我很好)Encoder Embedding
·最终输出:产生预测“fine”
topology.拓扑结构
staggering难以置信的 adeptly内行熟练的
underscore the imperative 强调必要性
mutually exclusive互斥的