大模型学习笔记 - LLM 之 attention 优化

news2025/1/12 15:45:45

LLM 注意力机制

  • LLM 注意力机制
    • 1. 注意力机制类型概述
    • 2.Group Query Attention
    • 3.FlashAttention
    • 4. PageAttention

1. 注意力机制类型概述

注意力机制最早来源于Transformer,Transformer中的注意力机制分为2种 Encoder中的 全量注意力机制和 Decoder中的带mask的注意力机制。这两种注意力机制 都是 MultiHeadAttention 由Key,Query, Value 三个矩阵组成。

由于经典的MHA的计算时间和缓存占用量都是O(n^2)级别的(n是序列长度),这就意味着如果序列长度变成原来的 2 倍,显存占用量就是原来的 4 倍,计算时间也是原来的 4 倍。当然,假设并行核心数足够多的情况下,计算时间未必会增加到原来的 4 倍,但是显存的 4 倍却是实实在在的无可避免,这也是之前微调 Bert 的时候时不时就来个 OOM 的原因了。

所以不少工作致力于研究 降低Attention的计算复杂度和缓存大小,从而使复杂度从O(n^2) 降低到O(nlogn) 甚至O(n).

  • 稀疏attention: SparseAttention,Longformer
    • Reformer,Linformer:
    • Linear Attention 思想: Q K t QK^t QKt 这一步我们得到一个nn的矩阵,就是这一步决定了Attention的复杂度是O(n^2);如果没有Softmax,那么就是三个矩阵连乘 Q K t V QK^{t}V QKtV,而矩阵乘法 是满足结合率的,所以我们可以先算 K t V K^{t}V KtV,得到矩阵dd,然后再用Q左乘它,由于d<<n,所以这样算大致的复杂度只有O(n)(就是Q左乘的那一步占主导)。也就说,去掉softmax的Attention的复杂度可以降低到最理想的线性级别。这显然是我们的终极追求:Linear Attention,复杂度为线性级别的Attention.

优化计算量和缓存后,LLM时代,推理速度加速的成为一个问题,于是针对推理慢的开始进行如下优化

  1. IO传输瓶颈: 斯坦福团队发现 影响推理速度的瓶颈不在于计算量,而是IO传输。于是提出了减少IO传输的FlashAttention 1/2/3. FlashAttention论文的目标是尽可能高效地使用SRAM来加快计算速度。
  2. GPU显存瓶颈:研究人眼引入了 PagedAttention,这是一种受操作系统中虚拟内存和分页经典思想启发的注意力算法。与传统的注意力算法不同,PagedAttention 允许在非连续的内存空间中存储连续的 key 和 value 。具体来说,PagedAttention 将每个序列的 KV cache 划分为块,每个块包含固定数量 token 的键和值。在注意力计算期间,PagedAttention 内核可以有效地识别和获取这些块。
  3. 减少推理缓存: **GQA(group query attention)**分组注意力机制,在MQA基础上,增加多组Key,Value(但是不是全量),每个head独立拥有Query。

2.Group Query Attention

在自回归解码的标准做法是缓存序列中先前标记的键(K)和值(V) 对,从而加快注意力计算速度。然而,随着上下文窗口或批量大小的增加,多头注意力 (MHA)模型中与 KV 缓存大小相关的内存成本显着增长,所以随着上下文窗口增加,KV缓存大小成为瓶颈,为了扩展上下文,减少注意力机制的计算量和缓存大小,从而研究者开始对全量注意力机制的优化进行研究,目前主流的注意力机制主要分为3种:

  1. MHA(multi-head attention)全量注意力机制,每个head 独立拥有K Q V。
  2. MQA(multi-query attention)多查询注意力机制,多个head共享1组Key,Value,每个head独立拥有Query。
    1. 由于只是用一个 key 和value,大大加快解码推断的速度,但是可能导致质量下降。
    2. 目前ChatGLM2-6B使用的是这个
  3. GQA(group query attention)分组注意力机制,在MQA基础上,增加多组Key,Value(但是不是全量),每个head独立拥有Query。
    1. LLaMA2 和 Mistral采用的是这个。
    2. 属于1和2的折中,KV个数在1-head 中间.
    3. GQA 变体在大多数评估任务上的表现与 MHA 基线相当,并且平均优于 MQA 变体

在这里插入图片描述

3.FlashAttention

4. PageAttention

tobe added

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

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

相关文章

磁编码器原理与方案

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、磁编码器二、多极磁编三、绝对值磁编四、单极对磁编五、磁游标编码器六、磁刻线编码器七、磁编码器优点八、磁…

46.x86游戏实战-DXX封包实现进入地图房间

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

windows所有功能都可使用就是电脑黑屏了

运行新任务然后输入explorer.exe勾选上创建任务确定就好了 下次尽量不手欠&#xff01;&#xff01;&#xff01;&#xff01;

21. Lammps命令学习-6之read_data

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;Lammps命令学习-6之read_data read_data file keyword args … 读取包含LAMMPS运行模拟所需信息的data文件   https://docs.lammps.org/read_data.html Syntax read_data file keyword args ...Description 读取包…

推荐算法实战-五-召回(上)

一、传统召回算法 &#xff08;一&#xff09;基于物料属性的倒排索引 在离线时&#xff0c;将具有相同属性的物料集合起来&#xff0c;根据一些后验统计指标将物料排序。 当一个用户在线交互发出请求后&#xff0c;提取用户的兴趣标签&#xff0c;根据标签检索相应物料集合…

24吉林成考报名明日开始,注意照片规格

24吉林成考报名明日开始&#xff0c;注意照片规格 #吉林成考 #成考报名 #成考报名照片 #成人高考报名 #成人高考 #成人高考报名照片

CANoe.DiVa的应用——Diva进行诊断自动化测试执行过程详解(三)

🙋‍♂️【Vector CANdelastudio配置CDD】文章合集💁‍♂️点击跳转 ——————————————————————————————————–—— 从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 1.工程导入2.查看用…

SpringBoot3 简单集成 Spring AI 并使用

文章目录 准备JDK17api key 创建项目编写配置文件创建controller启动并测试角色预设流式响应\异步响应ChatModel&#xff08;聊天模型&#xff09;ImageModel&#xff08;文生图&#xff09;文生语音语言翻译多模态Function Calling &#xff08;函数调用第三方API&#xff09;…

小折叠手机首获120万次弯折耐久认证,意味着什么?

提到折叠屏手机&#xff0c;很多人都会担心其耐用性。毕竟&#xff0c;频繁的开合对铰链和屏幕都是极大的考验。但华为nova Flip却用实力证明&#xff0c;耐用性不再是问题。凭借玄武水滴铰链技术&#xff0c;首获瑞士SGS 120万次弯折耐久认证的小折叠屏手机。 一、120万次弯折…

springboot中后缀匹配模式useSuffixPatternMatch、useTrailingSlashMatch的源码匹配分析

背景&#xff1a; 上篇文章&#xff0c;已经说了&#xff0c;如果我们直接debug调试没法找到源码中具体的代码&#xff0c;那么就可以通过jd-gui反编译的方式通过搜关键词的方式来找到源码中具体的位置&#xff0c;这次简单说下spring中的两种后缀匹配模式useSuffixPatternMat…

ArcGIS Pro基础:并行处理设置

如上所示&#xff0c;随便打开一个工具&#xff0c;找到【环境】设置&#xff0c;然后就可以找到【并行处理因子】的设置。 ArcGIS 软件里的并行处理因子一般是空的&#xff0c;这是默认设置&#xff0c;表达的是意思由是各个工具【自行决定】使用进程的数量。 其他情况&…

redis面试(十九)读写锁ReadLock

读写锁ReadLock 简单来说就是互斥锁和非互斥锁。多个客户端可以同事加的锁叫读锁&#xff0c;只能有一个客户端加的锁叫写锁。这个理论应该是从数据库中来的&#xff0c;放在这里也是同样的解释。 多个客户端同时加读锁&#xff0c;是不会互斥的&#xff0c;多个客户端可以同…

【Excel】Excel小技巧(实时更新中)- 0.0.1

文章目录 单元格操作多列数据"".join()为一个 END 单元格操作 多列数据"".join()为一个 END

Python保留字符

Python中的保留字。 这些保留字不能用作常数或变数&#xff0c;或任何其他标识符名称。 所有 Python 的关键字只包含小写字母。

Java 中边读数据库边写到文件,可以处理大型数据文件而不会消耗太多内存。

从数据库查询结果集中提取单行数据&#xff0c;并按列格式化为字符串形式。主要功能如下&#xff1a; 遍历结果集的每一列。 根据不同的数据类型转换列值为字符串。 使用StringBuilder拼接各列值&#xff0c;列间以colSeparator分隔。 替换字符串中的换行符\n和回车符\r为空字符…

C语言—指针(2)

目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、字符指针变量 八、数组指针变量 &#xff08;8.1&#xff09;什么是数组指针变量 &#xff08;8.2&#xff09;数组指针变量的初始化 九、二维数组传…

Linux入门——08 进程间通讯——管道

1.进程间通讯 1.1什么是通讯 进程具有独立性&#xff08;每个进程都有自己的PCB,独立地址空间&#xff0c;页表&#xff09;但是要进行进程的通信&#xff0c;通信的成本一定不低&#xff0c;打破了独立性 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给…

探索风扇产品模型的3D可视化魅力

在这个科技日新月异的时代&#xff0c;每一个细微的创新都能为我们的生活带来前所未有的便捷与享受。今天&#xff0c;就让我们一起踏入一场视觉与科技的盛宴&#xff0c;探索风扇产品模型如何通过3D可视化技术&#xff0c;重新定义家居生活的舒适与美学。 想象一下&#xff0c…

Redis—缓存机制

Redis 缓存机制 1. 缓存三兄弟1.1 缓存击穿1.2 缓存穿透1.3 缓存雪崩 2. 布隆过滤器3. 缓存和数据库数据一致性3.1 缓存更新策略3.2 缓存不一致处理 4. 热点 key4.1 热点 key 处理4.2 热点 key 重建 5. 缓存预热 Redis&#xff0c;一个轻量级的开源内存数据结构存储系统&#x…

Java:循环练习

目录 1. 回文判断 2. 减法求商余 3. 求平方根 4.求质数 5. 猜数字 1. 回文判断 输入一个数字&#xff0c;判断是否为回文&#xff0c;回文就是正着读和反着读都一样&#xff0c;如121是回文&#xff0c;123则不是。 import java.util.Scanner;public class DemoNew {publ…