【LLM】大模型推理加速 KV-Cache

目录

  • 模型推理过程
  • KV Cache原理
  • KV Cache的存储

模型推理过程

在了解KVCache之前,我们需要知道Transformer类大模型的推理过程。
对于LLM进行一次前向传播也就是生成一个token的过程可以被分解成以下步骤:

  • 文本 T i n p u t T_{input} Tinput经过Tokenizer后得到n个Token,即 { T 1 , T 2 , . . . , T n } \{T_1,T_2,...,T_n\} {T1,T2,...,Tn}
  • Token经过嵌入层后得到Token Embedding { x 1 0 , x i 0 , . . . , x n 0 } \{x_1^0,x_i^0,...,x_n^0\} {x10,xi0,...,xn0},其中0代表第0层, x x x是D维向量
  • Token Embedding 经过L层变换之后,得到 { x 1 L , x i L , . . . , x n L } \{x_1^L,x_i^L,...,x_n^L\} {x1L,xiL,...,xnL}
  • generation阶段,将最后一层的最后一个Token Embedding即 x n L x_n^L xnL取出,与lm_head中的vocabulary Embedding { e 1 , e 2 , . . . , e V } \{e_1,e_2,...,e_V\} {e1,e2,...,eV}进行运算,得到概率 { p 1 , p 2 , . . . , p V } \{p_1,p_2,...,p_V\} {p1,p2,...,pV},最后从概率采样中选择一个产生新的 T n + 1 T_{n+1} Tn+1

流程如图所示
在这里插入图片描述
如果我们一直用 T [ 1 , i ] T_{[1,i]} T[1,i]去生成 T i + 1 T_{i+1} Ti+1也是可行的,但很容易发现一个问题,Token Embedding中 [ 1 , i ] [1,i] [1,i]这部分的值是不需要重新计算的。

我们发现每次计算 T i + 1 T_{i+1} Ti+1时,只需要额外计算 x i 0... L x_{i}^{0...L} xi0...L的值就可以了。

在这里插入图片描述

KV Cache原理

当我们有了 { x 1 l , x 2 l , . . . , x n l } \{x_1^l,x_2^l,...,x_n^l\} {x1l,x2l,...,xnl}的数据,再加上新来的 x n + 1 l x_{n+1}^l xn+1l计算 x n + 1 l + 1 x_{n+1}^{l+1} xn+1l+1的计算量只是一次attention query。

我们只关注 x n + 1 l + 1 x_{n+1}^{l+1} xn+1l+1
s i = ( W Q x n + 1 l ) T ( W K x i l ) , 1 ≤ i ≤ n + 1 s_i = (W_Qx_{n+1}^l)^T(W_Kx_i^l),1≤i≤n+1 si=(WQxn+1l)T(WKxil),1in+1

y h = ∑ i = 1 n + 1 s i ∑ j = 1 n + 1 e j W V x i l , 1 ≤ i ≤ n + 1 y_h=\sum_{i=1}^{n+1}\frac{s_i}{\sum_{j=1}^{n+1}e_j}W_Vx_i^l,1≤i≤n+1 yh=i=1n+1j=1n+1ejsiWVxil,1in+1

x n + 1 l + 1 = C o n c a t 1 H y h x_{n+1}^{l+1}=Concat_{1}^Hy_h xn+1l+1=Concat1Hyh

其中 W Q / K / V W_{Q/K/V} WQ/K/V是QKV的投影矩阵,H是多头自注意力中head的个数。中间省略了dot product、layernorm、feed forward等步骤。

过程如图片所示。图片来源
在这里插入图片描述
在每次计算过程中得到的中间值 W K x i l W_Kx_{i}^l WKxil W V x i l W_Vx_{i}^l WVxil,将它们保存下来,就得到了K Cache和V Cache。

KV Cache的存储

KV Cache的总大小是2nHD,其中n是token数量,H是head数量,D是 x i l x_i^l xil的维度。
目前有三种解决方案:

  • 分配一个最大容量的缓冲区,但需要提前知道最大的token数量。
  • 动态分配缓冲区大小,类似vector的方式。
  • 将数据拆散,按最小单元格存储,用一份元数据记录每一块数据的位置。

最后一种方式也就是现在常用的PageAttention,也是vllm的核心技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/490424.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++中的string容器容量操作

以string容器为例,有多个容量操作 string容器文档:string - C Reference (cplusplus.com) 1.求大小:size() 求容器大小使用 size(),string容器还可以使用 length() (推荐使用siez(),因为string产生比ST…

国家中英文名称、国家代码(地区代码)、国家域名、经纬度

因为要做世界地图对世界国家的标点,搜索使用到了世界各个国家的地理位置信息,此处做备份与学习。资源地址(免费) export default {"阿尔巴尼亚": {"m_longitude": "19.809","m_latitude&quo…

MyBatis是纸老虎吗?(七)

在上篇文章中,我们对照手动编写jdbc的开发流程,对MyBatis进行了梳理。通过这次梳理我们发现了一些之前文章中从未见过的新知识,譬如BoundSql等。本节我想继续MyBatis这个主题,并探索一下MyBatis中的缓存机制。在正式开始梳理前&am…

应急响应实战笔记04Windows实战篇(2)

第2篇:蠕虫病毒 0x00 前言 ​ 蠕虫病毒是一种十分古老的计算机病毒,它是一种自包含的程序(或是一套程序),通常通过网络途径传播,每入侵到一台新的计算机,它就在这台计算机上复制自己&#xff…

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48)

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48) 一、算法介绍二、算法步骤三、算法实现1.代码2.效果一、算法介绍 通过这里的平面生成方法,可以生成模拟平面的点云数据,并可以人为设置平面方向,平面大小,并添加噪声来探索不同类型的平面数据。这种方法可以用于…

【Web世界探险家】HTML5 探索与实践

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ &…

C语言(结构体,联合体,枚举的讲解)

这期我们来讲解结构体,联合体,以及枚举的讲解,首先我们从概念开始一步一步的了解。 1,结构体 1.1概念 C 语言中的结构体是一种用户自定义的数据类型,它允许你将不同类型的变量组合在一起,从而形成一个新…

《剑指 Offer》专项突破版 - 面试题 93 : 最长斐波那契数列(C++ 实现)

题目链接:最长斐波那契数列 题目: 输入一个没有重复数字的单调递增的数组,数组中至少有 3 个数字,请问数组中最长的斐波那契数列的长度是多少?例如,如果输入的数组是 [1, 2, 3, 4, 5, 6, 7, 8]&#xff0…

【数据结构与算法】用染色法判定二分图

问题描述 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数 n 和 m。 接下来 m 行,每行包含两个整数 u 和 v,表示点 u 和点 v 之间存在一条边。 输出格式 如果给定图…

QML | JavaScript作用域和命名解析2

QML | JavaScript作用域和命名解析3.绑定的作用域对象 属性绑定是QML中最常见的JavaScript应用。属性绑定关联了一个JavaScript表达式的结果和对象的一个属性,该属性所归属的对象被称为绑定的作用域对象。在下面的代码中,Item对象就是一个绑定的作用域对象: ​ 绑定可以…

泰山派人工智能

这里我们先演示一下人工智能能干些什么吧, 请看下面演示资料 https://www.bilibili.com/v/jump-middle-edge/?spm_id_from=888.80997.embed_other.whitelist&mode=play&bvid=BV1Kh411N7b1 图像的人工智能常见的任务有如下几种情况: 分类, 目标检测,目标分割, 轨迹跟…

Matlab|基于两阶段鲁棒优化的微网电源储能容量优化配置

目录 主要内容 1.1 目标函数 1.2 约束条件 1.3 不确定变量 部分代码 结果一览 下载链接 主要内容 程序主要复现的是《考虑寿命损耗的微网电池储能容量优化配置》,解决微网中电源/储能容量优化配置的问题,即风电、光伏、储能以及燃气轮机…

上海市开展专项行动,提升车联网行业网络和数据安全防护水平

近日,上海市通信管理局发布了《关于开展“铸盾车联”2024年车联网网络和数据安全专项行动的通知》。通知中提到,此次专项行动是为了提升本市车联网行业网络和数据安全防护水平,筑牢车联网网络和数据安全防线,护航智能网联汽车产业…

#Linux系统编程(exec函数族)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)为什么介绍exec函数族 在父进程fork()创建子进程中,子进程会拷贝父进程的代码,但是有时候不想要子进程拷贝父进程的…

c语言--实用调试技巧

1什么是bug 2调试是什么,有多重要? 3debug与release 4windows环境调试简绍 5一些调试的实例 6如何写出好的代码(便于调试) 7编程常见错误 1什么是bug 导致计算机出现问题就叫bug 2调试是什么,有多重要&#x…

【JavaEE初阶系列】——多线程案例一——单例模式 (“饿汉模式“和“懒汉模式“以及解决线程安全问题)

目录 🚩单例模式 🎈饿汉模式 🎈懒汉模式 ❗线程安全问题 📝加锁 📝执行效率提高 📝指令重排序 🍭总结 单例模式,非常经典的设计模式,也是一个重要的学科&#x…

007 日期类型相关工具类

推荐一篇文章 http://t.csdnimg.cn/72F7Jhttp://t.csdnimg.cn/72F7J

git配置密钥

要配置 Git 密钥,可以按照以下步骤进行操作: 1.生成密钥:首先,在终端或命令提示符中运行以下命令生成密钥对: ssh-keygen -t rsa -b 4096 -C "dengweng-pulse.net"这将生成一个 RSA 密钥对,其中…

clickhouse学习笔记02(小滴课堂)

ClickHouse核心基础-常见数据类型讲解 插入数据: decimal类型的数据,整数部分超了会报错,小数部分超了会截取。 查看表结构: 查询: 插入: 更新操作: 这个和mysql的语句不太一样。 删除语句和my…

第十二届蓝桥杯JavaB组省赛真题 - 货物摆放

解题思路&#xff1a; 暴力 优化前&#xff08;代码没有错&#xff0c;但会超时&#xff09;&#xff1a; import java.util.*;public class Main {public static void main(String[] args) {long n 2021041820210418L;long cnt 0;for (long a 1; a < n; a) {for (lon…