天津做网站找津坤科技,太原网站建设司,河北常见网站建设价格,wordpress插件 网站跳转前言
KV-Cache是一种加速Transformer推理的策略#xff0c;几乎所有自回归模型都内置了KV-Cache#xff0c;理解KV-Cache有助于更深刻地认识Transformer中注意力机制的工作方式。
自回归推理过程知识准备
自回归模型采用shift-right的训练方式#xff0c;用前文预测下一个…前言
KV-Cache是一种加速Transformer推理的策略几乎所有自回归模型都内置了KV-Cache理解KV-Cache有助于更深刻地认识Transformer中注意力机制的工作方式。
自回归推理过程知识准备
自回归模型采用shift-right的训练方式用前文预测下一个字/词并且前文中的最后一个词经过解码器的表征会映射为其下一个待预测词的概率分布。在训练阶段句子完整输入给网络所有位置下的token并行计算。 同理在预测推理阶段也可以将前文prompt完整输入给训练好的模型取最后一个位置的表征作为下一个token的概率分布再通过采样策略确认下一个token最终将token拼接到前文prompt的末尾准备下一次推理。 GPT自回归工作方式 KV-Cache简要介绍
每步推理都将前文整句输入模型是一种效率低下的方式原因是存在相同结果的重复推理。令前一次待推理的文本长度为S下一次为S1由于网络中的各项参数已经固定因此两次推理对于前S个token的计算结果是完全相同的 包括Embedding映射每一层、每一个注意力头下的KQV映射注意力权重以及后续的FFN层都在重复计算。 根据shift-right的性质下一个token是由当前最后一个token的网络输出所决定的那能不能仅输入最后一个token来进行推理答案是否定的虽然在结果层仅由最后一个token来决定但是中间的注意力过程它依赖于前文所提供的Key、Value向量来携带前文信息因此也不能抛弃前文不管。 next token计算依赖
结合以上结论S1位置token的推理依赖于两个要素首先是当前第S个token在网络中完整forward一遍其次是除最后一个token以外之前所有的S-1位置的token在每一层、每个注意力头下的KeyValue信息。又已知S-1的每个token的KeyValue信息都是在重复计算每次计算的结果是相同的在之前的推理中都计算过但在结果层丢弃了因此完全可以将KeyValue信息在内存中存储起来使得它们可以在之后的每步推理中进行复用这种策略就是KV-Cache。这种方式避免了重复计算大幅减少了参数的计算量提高了推理效率。 KV-Cache推理效率提升统计
本例采用GPT-2作为实验对象测试开启/关闭KV-Cache对推理效率的影响。在HuggingFace实现的GPT2LMHeadModel模型类中推理阶段内置了KV-Cache选项通过use_cache来开启和关闭KV-Cache当use_cache为true时模型在推理过程中会初始化past_key_values来存储Key、Value向量并且每一步推理会对它进行维护如果use_cache为false则past_key_values不生效。GPT2LMHeadModel的推理阶段参数如下
class GPT2LMHeadModel(GPT2PreTrainedModel):...def forward(self,input_ids: Optional[torch.LongTensor] None,past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] None,...use_cache: Optional[bool] None,...) - Union[Tuple, CausalLMOutputWithCrossAttentions]:
给到prompt为“明天降温了”设置最大推理步长从10到1000不等采用最简单的贪婪搜索Greedy Search方式分别将use_cache设置为true和false两种模式查看CPU和GPU推理下耗时代码如下
import time
import torch
from transformers import BertTokenizer, GPT2LMHeadModeltokenizer BertTokenizer.from_pretrained(./gpt2-chinese-cluecorpussmall)
model GPT2LMHeadModel.from_pretrained(./gpt2-chinese-cluecorpussmall).to(cuda)text 明天降温了
input_ids torch.LongTensor([tokenizer.convert_tokens_to_ids(list(text))]).to(cuda)max_length list(range(10, 1101, 100))
for i in max_length:res model.generate(input_idsinput_ids, max_lengthi, do_sampleFalse, use_cacheTrue)
其中CPU下开启/关闭KV-Cache的推理耗时差距更加明显各步长下推理耗时(秒)统计如下表
推理步长关闭KV-Cache开启KV-Cache100.170.181108.713.1131040.939.3151092.4315.84710178.2221.82910332.9629.22
随着步长的增长关闭KV-Cache的推理总耗时呈现出指数级增长而开启KV-Cache的耗时线性增长当步长达到900时前者的耗时已经是后者的十倍以上通过可视化能够直观感受到两者的效率差距 CPU下开启和关闭KV-Cache的推理随着步长的耗时
进一步计算平均每个token的推理速度用总耗时除以推理步长统计图如下当关闭KV-Cache时随着步长从10增长到1000推理一个token从17ms增长到426ms推理步长越大效率越来越低而当开启KV-Cache时推理一个token的耗时基本稳定维持在30ms左右只呈现出小数点后第三位上的略微增长趋势推理长度几乎没有对推理效率产生负面影响。 KV-Cache推理一个token的耗时对比
根据以上实验初步得到结论随着推理步长的增长关闭KV-Cache推理效率会越来越低而开启KV-Cache推理效率基本恒等不变。 KV-Cache工作流程简述
KV-Cache会在模型连续推理的过程中持续调用和更新past_key_values特别的当模型首次推理时past_key_values为空需要对past_key_values进行初始化首次推理需将全部文本一齐输入将中间过程的所有KeyValue添加到past_key_values中。 从第二次推理开始仅需要输入当前最后一个token单独对该token做QKV映射将past_key_values中前文所有的KV和该token的KV进行拼接得到完成的Key、Value向量最终和该token的Query计算注意力拼接后的Key、Value也同步更新到past_key_values。 KV-Cache的代码实现流程图 past_key_values存储结构分析
KV-Cache会将截止当前各个token在每一层、每个头的Key向量和Value向量存储在内存中在HuggingFace的代码实现中使用past_key_values变量进行存储past_key_values是一个矩阵其维度为**[n, 2, b, h, s, d]**类似一个六维的矩阵每个维度的含义如下
第一维 num_layers在外层是以每一个堆叠的Block为单位例如堆叠12层则一共有12组Key、Value信息第二维 2代表Key和Value这两个信息对象索引0取到Key向量索引1取到Value向量第三维 batch_size代表batch_size和输入需要推理的文本条数相等如果输入是一条文本则b1第四维 num_heads代表注意力头的数量例如每层有12个头则h12第五维 seq_len代表截止到当前token为止的文本长度在每一个历史token位置上该token在每一层每个头下的KeyValue信息第六维 d代表Key、Value向量的映射维度若token总的映射维度为768注意力头数为12则d768/1264 past_key_values结构示意图
past_key_values的结构如上图所示随着模型推理步长的增长past_key_values在每一步也同步更新上一个past_key_values和下一个past_key_values的差异仅仅产生在seq_len这个维度上具体的seq_len维度大小会加1它是由新推理的那一个token所对应的KeyValue拼接到上一个past_key_values的seq_len维度中所导致的如果除开这个加1的因素上一个past_key_values和下一个past_key_values在seq_len这个维度上的向量完全相同。 用公式可以更清晰的表达出past_key_values前后的变化令第一次推理Seq_len等于512层每层12个头Key、Value维度为64则有 past_key_values前后公式对比 KV-Cache内存占用、FLOPs下降分析
KV-Cache本质上是用空间换时间存储的Key、Value矩阵会额外占用内存假设以float16精度来存储每个token的存储占用公式如下 KV-Cache占用内存计算
公式代表每一层、每一个头下的向量维度之和乘以2代表Key、Value两者只和再乘以2代表float16占用两个字节。以LLaMa-7B为例模型加载占用显存14GB向量维度4096堆叠32层最大推理步长4096若推理一个batch为2长度为4096的句子KV-Cache占用的存储空间为2×2×32×4096×2×409621474836480字节约等于4GB随着推理的batch增大推理长度变长KV-Cache占用的存储空间可能超过模型本身。 KV-Cache和模型自身参数的显存占用示意图
另一方面KV-Cache极大地降低了FLOPs浮点计算量表面上KV-Cache省去了之前每个token的Key、Value的计算量每个token在所有层下计算Key、Value的FLOPs公式如下 每个token计算Key、Value的FLOPs
其中d平方代表从token Embedding到Key或者Value向量的过程乘以2是矩阵相乘中逐位相乘再相加导致有两个操作再乘以2代表Key、Value各一个。还是以LLaMa-7B为例推理一个batch为2长度为4096的句子光计算KV一共节省了2×2×32×4096×4096×4096×217592186044416 FLOPs的计算量额外的不仅省去了前文所有token的Key、Value的映射由此导致后续这些token的注意力权重计算注意力的MLP层FFN前馈传播层也都不需要再计算了相当于推理阶段的计算复杂度永远等于只对一个token进行完整的forward推理因此计算量大幅降低。
最后的最后
感谢你们的阅读和喜欢我收藏了很多技术干货可以共享给喜欢我文章的朋友们如果你肯花时间沉下心去学习它们一定能帮到你。
因为这个行业不同于其他行业知识体系实在是过于庞大知识更新也非常快。作为一个普通人无法全部学完所以我们在提升技术的时候首先需要明确一个目标然后制定好完整的计划同时找到好的学习方法这样才能更快的提升自己。
这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
一、全套AGI大模型学习路线
AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能 二、640套AI大模型报告合集
这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。 三、AI大模型经典PDF籍
随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。 四、AI大模型商业化落地方案 五、面试资料
我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下。
这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】