当前位置: 首页 > news >正文

金属加工网站建设济南网站制作网站

金属加工网站建设,济南网站制作网站,网站建设案例行业现状,手机网页及网站设计 pdfLLM推理优化——KV Cache篇(百倍提速) 注意:KV Cache本质上是空间换时间的技术。与计算机组成原理中的cache不同,它不涉及访存优化。 不知道大家在用LLM的时候,有没有注意到一个问题:我们在输入我们的问题…

LLM推理优化——KV Cache篇(百倍提速)

请添加图片描述

注意:KV Cache本质上是空间换时间的技术。与计算机组成原理中的cache不同,它不涉及访存优化。

不知道大家在用LLM的时候,有没有注意到一个问题:我们在输入我们的问题之后,需要等待一段漫长的时间才能看到第一个字符的响应,而等待第一个之后,后续的响应却非常之快,这就是使用了KV Cache加速后的带来的优势。

LLM推理过程与自注意力机制

LLM的推理过程和训练过程是有所区别的,LLM在训练过程中使用因果掩码并行化训练,无需像RNN一样等待之前的结果运算结束。但是他的推理过程却类似RNN,并且有大量的重复计算。详细解释可以参照上一篇Blog:LLM的训练与推断。我们已经知道LLM推断时实际上是一种自回归模型 f θ f_\theta fθ,假设在 t t t步及其之前的输入和推断表示为 x 1 : t x_{1:t} x1:t,我们可以用公式表示它:

x 1 : t + 1 = f θ ( x 1 : t ) (1) % \begin{align} x_{1:t+1} = f_\theta(x_{1:t}) \tag{1} % \end{align} x1:t+1=fθ(x1:t)(1)

从公式1我们可以看到,即使 x 1 : t x_{1:t} x1:t已经是计算过的,但是在计算 x t + 1 x_{t+1} xt+1时却还要重复计算 x 1 : t x_{1:t} x1:t,当序列愈来愈长,这个计算代价也越来越不可接受,尤其绝大多数计算都是在做无用功(重复计算)。

基于此,我们就有一个朴素的优化思考:我们能否去除掉这些重复计算?那答案是当然可以,不然就没有这篇博客了🤣。

那么如何去除呢?如果有动态规划、搜索基础的小伙伴可能会比较眼熟,类似于常用的剪枝操作。将后续仍然需要使用的计算结果保存起来,后续使用时不必再次计算

那么来看一下具体是如何实施的,从LLM的训练与推断中我们可以知道,需要重复计算的矛盾点来自于自注意力机制,首先回顾一下它:
a t t n ( Q , K , V ) = s o f t m a x ( Q T K d k ) V attn(Q,K,V) = softmax\left(\frac{Q^TK}{\sqrt{d_k}}\right)V attn(Q,K,V)=softmax(dk QTK)V
我们可以用行列向量的形式表示第t步计算 x t x_t xt时的 ( Q T K ) t (Q^TK)_t (QTK)t
( Q T K ) t = ( q 1 T k 1 q 1 T k 2 … q 1 T k t q 2 T k 1 q 2 T k 2 … q 2 T k t ⋮ ⋮ ⋱ ⋮ q t T k 1 q t T k 2 … q t T k t ) ( Q T K ) t + 1 = ( q 1 T k 1 q 1 T k 2 … q 1 T k t q 1 T k t + 1 q 2 T k 1 q 2 T k 2 … q 2 T k t q 2 T k t + 1 ⋮ ⋮ ⋮ ⋮ q t T k 1 q t T k 2 … q t T k t q t T k t + 1 q t + 1 T k 1 q t + 1 T k 2 … q t + 1 T k t q t + 1 T k t + 1 ) \begin{align} (Q^TK)_t&= \left( \begin{array}{cccc} q^T_1k_1 & q^T_1k_2&\ldots&q^T_1k_t\\ q^T_2k_1 & q^T_2k_2&\ldots&q^T_2k_t\\ \vdots& \vdots&\ddots&\vdots\\ q^T_tk_1 & q^T_tk_2&\ldots&q^T_tk_t\\ \end{array}\right)\notag \\ (Q^TK)_{t+1}&= \left( \begin{array}{ccccc} q^T_1k_1 & q^T_1k_2&\ldots&q^T_1k_t&q^T_1k_{t+1}\\ q^T_2k_1 & q^T_2k_2&\ldots&q^T_2k_t&q^T_2k_{t+1}\\ \vdots& \vdots&\ &\vdots&\vdots\\ q^T_tk_1 & q^T_tk_2&\ldots&q^T_tk_t&q^T_tk_{t+1}\\ q^T_{t+1}k_1 & q^T_{t+1}k_2&\ldots&q^T_{t+1}k_t&q^T_{t+1}k_{t+1}\\ \end{array}\right)\notag \\ \end{align} (QTK)t(QTK)t+1= q1Tk1q2Tk1qtTk1q1Tk2q2Tk2qtTk2q1Tktq2TktqtTkt = q1Tk1q2Tk1qtTk1qt+1Tk1q1Tk2q2Tk2qtTk2qt+1Tk2 q1Tktq2TktqtTktqt+1Tktq1Tkt+1q2Tkt+1qtTkt+1qt+1Tkt+1

从式子中可以看到,在计算 ( Q T K ) t + 1 (Q^TK)_{t+1} (QTK)t+1时,前t行t列已经被计算过,我们只需要计算最后一行并且保存即可。由 q t + 1 T k 1 , q t + 1 T k 2 , … , q t + 1 T k t , q t + 1 T k t + 1 q^T_{t+1}k_1, q^T_{t+1}k_2,\ldots,q^T_{t+1}k_t,q^T_{t+1}k_{t+1} qt+1Tk1,qt+1Tk2,,qt+1Tkt,qt+1Tkt+1可知,我们还需要知道之前每次计算出的 k k k值,所以在保存每行值之外,也应当保存 k 1 , k 2 , … , k t + 1 k_1, k_2,\ldots,k_{t+1} k1,k2,,kt+1的值。

这里可能会有疑惑,最后一列用了之前的 q 1 , q 2 , … , q t q_1,q_2, \ldots,q_t q1,q2,,qt,为什么不保存 q q q的值。实际上, Q T K Q^TK QTK矩阵会经过一个掩码操作,他最后得到是一个下三角矩阵,我们不必再次计算,直接补0即可。

保存 V V V值亦是同理。

保存 K , V K,V K,V是不是KV Cache名称的由来呢?

http://www.yayakq.cn/news/763039/

相关文章:

  • 做再生料的网站ui培训公司
  • 网站做适配手机要多久图书馆门户网站建设有哪些公司
  • 蒙古文网站建设郑州seo优化公司排名
  • 做网站营销怎么去推广网站关联页面如何做
  • 深圳设计公司企业网站可以免费做调查问卷的网站
  • 站长网站后台搜索引擎网站推广怎么做
  • 建设农村信息网站wordpress目录页面
  • 太原网站建设服务企业建站网站建站系统
  • 专做奢侈品品牌的网站如何设计制作网站
  • 丽水 网站建设网站开发的质量标准
  • 网站主题制作网站推广基本方法是
  • 乐清做网站建设公司哪家好晋安网站建设
  • 做网站开发 用什么app开发者需要更新
  • 晋城网站seo成功营销案例分享
  • 优质的南昌网站设计成都建设网站的公司有哪些
  • vue做的个人网站江苏建设工程安全监督网站
  • 西昌市建设工程管理局网站什么是网站名称
  • 最新钓鱼网站源码手机制作表格教程
  • 盐城网站开发代理咨询卖设计图的网站
  • 韶关城乡建设部网站首页网站内页百度提交口
  • 公司做网站一般多少钱运营网站打不开dns修改
  • 网站制作需要学什么asp.net 4.0网站开发与项目实战(全程实录)(附光盘)
  • 宁波龙山建设有限公司网站电子商务专业简单介绍
  • 大名做网站手机主页哪个网站好
  • 湖南网站建设营销推广网站架构设计师工资水平
  • 德州宁津建设局网站网站建设服务好的商家
  • 东莞制作网站公司成品网站w灬源码16伊园
  • 免费建网站软件哪个好揭阳公司做网站
  • 一个网站网站建设下来要花多少钱免费源码分享
  • 咸阳做网站的公司个人主页英语