KVcache

一、什么是kv cache?

https://zhuanlan.zhihu.com/p/655325832

减少推理过程中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

  1. 分解 Prompt(输入上下文)

    • 将输入上下文(Prompt)拆分成两部分:
      • Prefix:较早部分的 Token(例如序列的开头)。
      • Window:靠近生成位置的最近 Token(即当前关注的“窗口”)。
  2. 稀疏化 KV Cache

    • 不是保留 Prefix 中所有 Token 的 KV Cache,而是通过注意力分数(Attention Score)从 Prefix 中挑选出与当前 Window 相关性最高的一部分 Token。
    • 每个注意力头会根据它自己的注意力分数,独立选择需要保留的 Token。因此,不同的头可能会从 Prefix 中选择不同的 Token。
  3. 最终的 KV Cache

    • 将以下两部分组合成最终的 KV Cache:
      • Window 中所有 Token 的 KV Cache(因为它们与当前生成任务最密切)。
      • 从 Prefix 中挑选出来的重要 Token 的 KV Cache。
  4. 固定 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互斥的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值