KV Cache 技术分析

原文:Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.

1 什么是KV Cache

LLM(大型语言模型)中的 Attention 机制中的 KV Cache(键值缓存)主要作用是存储键值对,以避免在每次生成 token 时重新计算键值向量,从而减少计算量和提高效率。利用预先计算好的 K 值和 V 值,可以节省大量计算时间,尽管这会占用一定的存储空间。

随着模型规模的增大和数据量的增加,LLM 的窗口长度也在不断增大,因此就出现一组主要矛盾,即:对不断增长的 LLM 的窗口长度的需要与有限的 GPU 显存之间的矛盾。为了解决这个问题,需要优化 KV Cache,减少重复计算,以提高推理性能。

2 使用KV Cache

在推理的时候transformer本质上只需要计算出$O_i$,即一个字一个字地蹦。再根据上面的结论,

  1. Attention的第i个输出只和第 i 个query有关,和其他query无关,所以query完全没有必要缓存,每次预测$O_i$时只要计算最新的$Q_i$即可,其他的丢弃即可
  2. Attention的输出O_i的计算和完整的K和V有关,而K、V的历史值只和历史的O有关,和当前的O无关。那么就可以通过缓存历史的K、V,而避免重复计算历史K、V

因此,当预测 今天天气真 → 好 时,使用kv cache后流程如下:

  1. 输入的向量
  2. 提取真对应的$Q_i, K_i, V_i$
  3. 拼接历史K、V的值,得到完整的K、V
  4. 然后经过Attention计算,获得$O_i$ 输出
  5. 根据$O_i$ 计算得到

3 公式证明

Attention的计算公式如下:

$$ O=Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V $$

3.1 Attention的$O_i$只和$Q_i$有关

假设:

$$ \begin{align} Q &= \begin{bmatrix} Q_0\\ Q_1 \end{bmatrix}\\

K &= \begin{bmatrix} K_0\\ K_1 \end{bmatrix} \end{align} $$

那么,

$$ O = softmax(\frac{\begin{bmatrix} Q_0K_0^T & Q_0K_1^T\\ Q_1K_0^T & Q_1K_1^T\\ \end{bmatrix}}{\sqrt{d_k}})V $$

令,

$$ A = \begin{bmatrix} A_0\\ A_1 \end{bmatrix} = \begin{bmatrix} Q_0K_0^T & Q_0K_1^T\\ Q_1K_0^T & Q_1K_1^T\\ \end{bmatrix}, f(x) = \frac{softmax(x)}{\sqrt{d_k}} $$

此时,$A_1$只和$Q_1$有关,和$Q_0$无关,那么,

$$ \begin{bmatrix} O_0\\ O_1 \end{bmatrix} = O = \begin{bmatrix} f(A_0)\\ f(A_1) \end{bmatrix}V = \begin{bmatrix} f(A_0)V\\ f(A_1)V \end{bmatrix} $$

因此,$O_i$ 只和 $A_i$ 相关,而根据A的设定,$A_i$ 只和 $Q_i$ 相关,即:

<aside> 💡 Attention矩阵的第 i 个输出只和第 i 个 Q有关,和之前的 Q无关

</aside>

即:

$$ O_i = Attention(Q_i,K,V) = softmax(\frac{Q_iK^T}{\sqrt{d_k}})V $$

3.2 FNN/Dense的$Y_i$只和$X_i$有关

假设FNN层的变换如下:

$$ Y = XW^T $$

那么,

$$ \begin{bmatrix} Y_0\\ Y_1 \end{bmatrix} = \begin{bmatrix} X_0\\ X_1 \end{bmatrix}W^T = \begin{bmatrix} X_0W^T\\ X_1W^T \end{bmatrix} $$

也就是经过FNN层或者Dense层之后,第 i 个输出仍然只和第 i 个输入有关,和其他输入无关。

由于K、V的生成过程也是FNN过程,因此,

  1. $K_i$、$V_i$只和当前推理的上一层输出$O_i$有关,和上一层的历史O输出无关
  2. K、V的历史值只和历史的O有关,和当前的O无关

3.3 transformer的第i个输出只和第i个Q有关

结合结论1和结论2,transformer的第 i 个输出 $O_i$ 只和第 i 个query即 $Q_i$有关,和其他的query无关

3.4 K和V没有和Q一样的性质

即:

  1. 在Attention中,第 i 个O不仅和第 i 个K or V有关,还和其他K or V有关
  2. 因此,K或者V不具有传递性

根据3.1中证明得:

  1. $O_i$ 只和 $A_i$ 相关,而根据A的设定,$A_i$ 不仅和$K_i$有关还和其他的K有关。
  2. 由于 $O = f(A)\begin{bmatrix} V_0\\V_1 \end{bmatrix}$,因此O和所有的V都有关

综上,第 i 个输出$O_i$(可以拓展到每个transformer block的输出)和完整的K、V都有关

4 KV Cache的优化方法

4.1 MQA、MHA减少KV Cache

‣ ‣

下图展示了大模型中MHA、MQA、GQA之间的区别

  • multi-head attention: 不共享任何head
  • multi-query attention:共享所有的KV head,经过小批量训练后,仍然会导致精度损失
  • grouped-query attention:分组共享KV head,经过小批量训练后,不会导致精度损失

可以发现,MQA和GQA本质上都是通过共享K、V的head实现对MHA的优化。这直接让MQA、GQA减少了计算时的显存占用。另外由于KV Cache和head数量直接成正相关,因此减少KV head数量后,也就相当于直接减少了KV Cache

4.2 窗口约束减少KV Cache

Longformer提出了利用滑动窗口约束attention的上下文范围,从而达到提升上下文长度的目的。

由于SWA通过滑动窗口的技巧,约束了上下文的长度而不再是全局,KV Cache也会被限制到固定长度,而不再是全局。最终实现了减小KV Cache的目的

LM-Infinite同样是利用滑动窗口的原理,通过GLM + 窗口约束的方式实现限制KV Cache显存占用上限

4.3 量化和稀疏

通过量化和稀疏方式用于压缩KV Cache的显存占用,关于具体的方法,这里就不再详述。

4.4 PageAttention

PageAttention是在vLLM 中提出的KV Cache优化方法,它将在操作系统的虚拟内存中分页的经典思想引入到 LLM 服务中。在无需任何模型架构修改的情况下,可以做到比 HuggingFace Transformers 提供高达 24 倍的 Throughput。下面是实现流程:

  1. 内存分区

    主要受到操作系统虚拟内存和分页思想启发的注意力算法。具体来说,PagedAttention 将每个序列的 KV cache 划分为块,每个块包含固定数量 token 的键和值。PagedAtention的KV cache显存管理主要分为逻辑内存区和物理内存区:

    • 逻辑内存区:按照token作为key在block table中查询物理内存区的位置
    • 物理内存区:分成多个不同的block对连续token进行保存。但是block之间的地址可以不连续。因此内存回收时,就可以基于block进行。
  2. 内存共享

    由于是通过逻辑内存的key对物理内存区进行查询动作,因此多个不同的序列可以进行内存共享:

    1. 如果多个序列使用相同的block,那么直接返回相同block的地址空间
    2. 写时复制:如果新block开始部分和之前的block一样,但是之后的不一样,那么就会对相同部分直接复制,然后创建新的block

5 总结

kv cache通过空间换时间的思路加速推理速度,在不做压缩和裁剪的情况下对精度没有影响

6 参考

LLM(二十):漫谈 KV Cache 优化方法,深度理解 StreamingLLM

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT又多了一个强有力的竞争对手:Meta发布Llama 3开源模型!附体验地址

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

力扣:两数之和

知识点&#xff1a; 动态数组的创建&#xff1a; #include<stdlib.h> arr (int*)malloc(len * sizeof(int)); 如何使用sacnf输入数组&#xff1a; scanf 函数在读取输入时&#xff0c;会自动跳过空格&#xff08;空格、制表符、换行符等&#xff09;和换行符&#…

vscode绿绿主题setting config

下载插件Green Tree Theme 选greentree ctrl shift p找到setting {"workbench.colorTheme": "Green Tree","editor.fontSize": 16.5, // 字号"workbench.colorCustomizations": {"[Green Tree]": {"activityBarBadge.…

算法一:数字 - 两数之和

给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素不能使用两遍。 来源&#xff1a;力扣(LeetCode) 链接&#xf…

scala---基础核心知识(变量定义,数据类型,流程控制,方法定义,函数定义)

一、什么是scala Scala 是一种多范式的编程语言&#xff0c;其设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台&#xff08;Java虚拟机&#xff09;&#xff0c;并兼容现有的Java程序。 二、为什么要学习scala 1、优雅 2、速度快 3、能融合到hado…

管道流设计模式结合业务

文章目录 流程图代码实现pomcontextEventContextBizTypeAbstractEventContext filterEventFilterAbstractEventFilterEventFilterChainFilterChainPipelineDefaultEventFilterChain selectorFilterSelectorDefaultFilterSelector 调用代码PipelineApplicationcontrollerentitys…

浅析binance新币OMNI的前世今生

大盘跌跌不休&#xff0c;近期唯一的指望就是binance即将上线的OMNI 。虽然目前查到的空投数量不及预期&#xff0c;但OMNI能首发币安&#xff0c;确实远超预期了。 OMNI代币总量1亿&#xff0c;初始流通仅10,391,492枚&#xff0c;其中币安Lanchpool可挖350万枚 对于OMNI这个…

设计模式——模版模式21

模板方法模式在超类中定义了一个事务流程的框架&#xff0c; 允许子类在不修改结构的情况下重写其中一个或者多个特定步骤。下面以ggbond的校招礼盒发放为例。 设计模式&#xff0c;一定要敲代码理解 模版抽象 /*** author ggbond* date 2024年04月18日 17:32* 发送奖品*/ p…

50.HarmonyOS鸿蒙系统 App(ArkUI)web组件实现简易浏览器

50.HarmonyOS鸿蒙系统 App(ArkUI)web组件实现简易浏览器 配置网络访问权限&#xff1a; 跳转任务&#xff1a; Button(转到).onClick(() > {try {// 点击按钮时&#xff0c;通过loadUrl&#xff0c;跳转到www.example1.comthis.webviewController.loadUrl(this.get_url);} …

代码随想录第39天|62.不同路径 63. 不同路径 II

62.不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标…

Codeforces Round 782 (Div. 2) D. Reverse Sort Sum

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

【WP】猿人学4 雪碧图、样式干扰

https://match.yuanrenxue.cn/match/4 探索 首先打开Fiddler&#xff0c;发现每个包的除了page参数一样&#xff0c;然后重放攻击可以实现&#xff0c;尝试py复现 Python可以正常拿到数据&#xff0c;这题不考请求&#xff0c;这题的难点原来在于数据的加密&#xff0c;这些数字…

用10个Kimichat提示词5分钟创建一门在线课程

●研究市场并在生成式AI主题内找到一个特定细分市场&#xff0c;这一市场尚未被现有课程充分覆盖。使用在线研究来收集关于当前可用课程类型的信息&#xff0c;以及市场上存在哪些空白。利用这些信息创建一个填补空白并吸引对“生成式AI”感兴趣的特定受众群体的课程。确定课程…

面试经典算法系列之二叉树17 -- 验证二叉树

面试经典算法32 - 验证二叉树 LeetCode.98 公众号&#xff1a;阿Q技术站 问题描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当…

ActiveMQ 如果数据处理出现异常会怎么样

我们有一个 Spring 的客户端&#xff0c;在处理消息的时候因为程序的原因出现消息处理异常。 对这种情况&#xff0c;ActiveMQ 会把出现异常的消息放在 DLQ 队列中进行持久化。 因此&#xff0c;在 ActiveMQ 消息处理队列中需要持续关注 DLQ 队列&#xff0c; DLQ 的队列都是无…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(5)——可控评估端到端评估

最后完结篇,文末有测试中发现的有趣现象,并附上了相关资料链接~ 5.可控评估 分两个阶段评估生成代理。我们从一个更加严格控制的评估开始,单独评估代理的响应,以了解它们是否在狭义上定义的上下文中产生可信的行为。然后,在我们对代理社区进行为期两天的端到端分析中,我…

蓝桥杯2024年第十五届省赛真题-数字接龙

思路&#xff1a;DFS&#xff0c;因为输入的i&#xff0c;j的顺序导致&#xff0c;方向向量中x是行编号&#xff0c;y是列编号。方向向量可能和直觉上不同。 错的 //int dx[8]{0,1,1,1,0,-1,-1,-1}; //int dy[8]{1,1,0,-1,-1,-1,0,1}; 对的 int dx[]{-1,-1,0,1,1,1,0,-1}; int…

数据结构(顺序栈

目录 1. 讲解&#xff1a;2. C代码实现&#xff1a;小结&#xff1a; 1. 讲解&#xff1a; 用顺序的物理结构&#xff08;数组&#xff09;存储栈这个数据结构&#xff0c;实现栈的创建、销毁、增删查、判空。 top指针的指向位置有两种实现方法&#xff1a;一个是指向栈顶元素…

页缓存(PageCache)和预读机制(readahead )

页缓存&#xff08;PageCache)和预读机制&#xff08;readahead &#xff09; 页缓存&#xff08;PageCache)是操作系统&#xff08;OS&#xff09;对文件的缓存&#xff0c;用于加速对文件的读写。 page 是内存管理分配的基本单位&#xff0c; Page Cache 由多个 page 构成&…

《Super Simple Skybox》天空盒 -- 创造绝美天空的神奇工具!限时免费!

《Super Simple Skybox》天空盒 -- 创造绝美天空的神奇工具&#xff01;限时免费&#xff01; 前言内容介绍资源特色动态&#xff0c;美丽的天空在几秒钟内即插即用 功能列表领取兑换码 前言 ^^在这个充满创意与想象的世界里&#xff0c;Unity 免费资源犹如一颗璀璨的明珠&…