FlashAttention-2 论文阅读笔记

FlashAttention-2是对原始FlashAttention算法的一系列改进,旨在优化在GPU上的计算性能。本节详细讨论了FlashAttention-2的算法、并行性以及工作分区策略。

算法

FlashAttention-2的关键优化点在于减少非矩阵乘法(matmul)的浮点运算,以充分利用GPU上的专用计算单元(如Nvidia GPU上的Tensor Cores),这些单元在处理matmul操作(尤其是在FP16/BF16格式下)时性能显著优化。该优化的目标是通过尽可能多地执行matmul操作来最大化GPU的吞吐量。

前向传播
  1. 在线Softmax技巧:FlashAttention-2对在线Softmax计算进行了修改,以最小化非matmul浮点操作:

    • 避免通过 diag(ℓ(2))^-1 重新缩放输出更新的两个项。
    • 维持一个“未缩放”的O(2)版本,并保留统计信息 ℓ(2)。
    • 仅在循环结束时,通过 diag(ℓ(last))^-1 缩放最终的O(last)以获得正确的输出。
  2. 最大化matmul FLOPs:为了最大化GPU的性能,FlashAttention-2重点优化了matmul操作,因为现代GPU上的专用单元(如Tensor Cores)在这些操作上表现出色。以Nvidia A100 GPU为例,其FP16/BF16 matmul的理论吞吐量可以达到312 TFLOPs/s,而非matmul FP32的吞吐量仅为19.5 TFLOPs/s。因此,FlashAttention-2通过优化算法,尽可能地减少非matmul操作,从而保持高吞吐量的执行效率。

  3. 算法细节:FlashAttention-2的前向传播通过以下步骤实现:

    • 将输入矩阵Q、K、V分成大小为𝐵𝑟 × 𝑑的𝑇𝑟块,将输出矩阵O和logsumexp𝐿也相应地分块。
    • 在每个线程块内部分配工作以最大化GPU资源的利用。
    • 引入了在线Softmax技巧,通过有效管理和缩放中间结果,减少了不必要的计算开销。

反向传播

FlashAttention-2的反向传播与FlashAttention类似,但也有一些微调:

  • 仅使用逐行logsumexp 𝐿,而不是softmax中的最大值和指数和。
  • 使用类似的分块策略来优化计算和内存访问,以提高反向传播的效率和性能。

FlashAttention-2在并行性和工作分区方面进行了深入优化,以在GPU上实现更高的计算效率和性能。本节详细讨论了FlashAttention-2的并行化策略和工作分区方法。

并行性

前向传播

在FlashAttention-2中,前向传播的并行化策略如下:

  1. 线程块调度:每个注意力头使用一个线程块来处理,总共有batch size × number of heads个线程块。每个线程块被调度到一个流多处理器(SM)上执行。例如,Nvidia A100 GPU上有108个这样的SM。这种调度在大量线程块(如≥ 80)时非常高效,因为可以充分利用GPU的计算资源。

  2. 对长序列的优化:对于长序列(通常意味着较小的batch size或较少的头数),为了更好地利用GPU上的多处理器,FlashAttention-2额外并行化了序列长度维度。这在这种情况下显著提高了性能和效率。

反向传播

在反向传播中,为了避免在不同列块之间的共享计算,FlashAttention-2采用了类似的并行化策略:

  • 线程块调度:每个列块使用一个线程块来处理。通过使用原子加操作来在不同线程块之间进行通信,以更新dQ,从而避免了共享内存的读写冲突。

工作分区

前向传播

在前向传播中,FlashAttention-2改进了工作分区策略,避免了FlashAttention中的"split-K"方案,具体包括:

  • K和V的分割:FlashAttention-2将Q分割到4个线程束(warp)中,同时使得K和V对所有线程束可访问。每个线程束执行矩阵乘法以获取QK>的一部分,并将其与V的一部分相乘,从而获得对应输出的片段。这种改进减少了线程束之间的通信,降低了共享内存的读写次数,从而提升了性能。
反向传播

在反向传播中,为了避免"split-K"方案带来的同步问题,FlashAttention-2选择了适当的线程束分区策略,以优化计算和内存访问效率。

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

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

相关文章

详解工业网关在线探测功能及用途

详解工业网关在线探测功能及用途 工业网关作为工业物联网(IIoT)架构中的关键组件,扮演着桥梁的角色,它连接了现场的各类传感器、执行器以及更高级别的云平台或企业系统。在线探测功能是工业网关诸多能力中的一项重要特性&#xf…

2024年文化、艺术设计与社会科学国际学术会议(ICCADSS 2024)

2024年文化、艺术设计与社会科学国际学术会议(ICCADSS 2024) 重要信息 会议官网:http://www.iccadss.com 会议地址:北京 收录检索:EI,CPCI,CNKI,Google Scholar 投稿邮箱:society_info163.com 投稿标题&am…

Swagger的基本使用(快速入门)

目录 一、环境配置 (1)导入依赖:(一般导入依赖都会报错,所以大家也可以借鉴一下这篇文章:swagger配置报错) (2)启动类添加注解 二、Swagger配置介绍 (1)基本配置 (2)设置扫描的包 三、Swagger常用注解 (1)@Api (2)@ApiOperation (3)@ApiParam (…

clean code-代码整洁之道 阅读笔记(第十一章)

第十一章 系统 “复杂要人命,它消磨开发者的生命,让产品难以规划、构建和测试。” --RayOzzie,微软公司首席技术官 11.1 如何建造一个城市 每个城市都有一组组人管理不同的部分,有些人负责全局,其他人负责细节。 城市能运转&#…

如何解决 torch.cuda.is_available()是False

目录 1. 问题2. 解决方法2.1 安装torch的CUDA版本2.1.1 查看安装的torch是什么版本2.1.2 下载GPU版本的torch 2.2 安装 NVIDIA CUDA2.2.1 下载CUDA Toolkit2.2.2 安装CUDA Toolkit 最终效果 1. 问题 在Python中,使用Pytorch时,往往会选择使用CUDA模块&a…

行业唯一!三翼鸟场景品牌战略推动价值凸显

文 | 智能相对论 作者 | 佘凯文 当你的一只羊跑进别人的羊群中,怎么才能找到它? 从前人们为了区分自己的财产,会用烧红的铁块印在动物身上作为标记。在中世纪的欧洲,手工艺匠人用这种烧灼的方法在自己的手工艺品上烙下标记&…

「Python-docx 专栏」docx 设置页面边距、页眉页脚高度

本文目录 前言一、docx 页面边距在哪里二、对 <w:pgMar> 的详细说明1、上边距的说明2、右边距的说明3、下边距的说明4、左边距的说明5、页眉高度的说明6、页脚高度的说明三、设置 docx 页边距、页眉页脚高度1、完整代码2、代码执行效果图四、补充一些内容1、页面边距的两…

AI风险的优先级划分

AI 风险的优先级划分是一个复杂的过程&#xff0c;需要考虑多个因素。以下是一些常见的考虑因素和方法&#xff1a; 风险的可能性&#xff1a;评估 AI 系统产生风险的概率。高可能性的风险通常应被视为更高优先级。 风险的影响&#xff1a;考虑风险对人类、社会、环境或其他方面…

[面试题]RabbitMQ

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

Python里引用了time包后,不能再命名time变量了吗?

在Python中&#xff0c;一旦你使用import语句导入了某个模块&#xff08;比如time模块&#xff09;&#xff0c;你就不能再使用相同的名字&#xff08;在这个例子中是time&#xff09;来命名变量、函数或其他任何东西。这是因为导入的模块会被加入到当前的命名空间中&#xff0…

全面解析:C# 委托的实质性应用与优势

有人问C#的委托&#xff08;Delegate&#xff09;有什么实质性用途?委托在C#其实是无处不在&#xff0c;那么它具体用在那里呢&#xff1f;。 本文将从委托&#xff08;Delegate&#xff09;定义和演变讲起&#xff0c;让大家一目了然。 C#的委托&#xff08;Delegate&#…

【学习笔记】Elastic-Job和Quartz 实现企业级定时任务

Elastic-Job和Quartz 实现企业级定时任务 知识拆解框架整合Java高级玩法定时任务案例 第1章 课程介绍 课程的总体介绍&#xff0c;定时任务的应用场景和发展趋势&#xff0c;以及分布式走时任务的介绍 1-1、导学 1-2、为什么学习定时任务 1-3、定时任务技术发展趋势 1-4、主…

成为AIGC人才,是职场人当下的必修课?

随着科技的飞速进步&#xff0c;人工智能和机器学习技术正逐渐渗透到我们生活的每一个角落&#xff0c;其中&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;更是以其独特的魅力和广泛的应用前景&#xff0c;成为当下科技领域的热门话题。在这样的背景下&#xff0c;…

Matlab个性化绘图第3期—带三维球标记的折线图

前段时间有会员在群里问该如何绘制下面这种带三维球标记的折线图&#xff1a; 本期内容就来分享一下带三维球标记的折线图的Matlab绘制思路。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需…

【Android面试八股文】你能详细讲讲你在APK瘦身方面都做了哪些工作吗?

文章目录 一、我用到过的方法二、扩展阅读 其他的大厂方案一、我用到过的方法 面试官: 你能详细讲讲你在APK瘦身方面都做了哪些工作吗? 你: 在过去的项目中,我做了多方面的优化来减少APK的大小,从而提升应用的下载速度和安装体验。以下是一些具体的措施和技术实现: 移除不…

JavaScript的学习之旅(6.20)

目录 一、认识三个常见的js代码 二、js写入的第二种方式 三、js里内外部文件 一、认识三个常见的js代码 <script>//写入js位置的第一个地方// 控制浏览器弹出一个警告框alert("这是一个警告");// 在计算机页面输入一个内容&#xff08;写入body中&#xff…

使用PlugLink实现自动化运营:提升效率的秘密武器(附源码)

使用PlugLink实现自动化运营&#xff1a;提升效率的秘密武器 作为一款开源的自动化工具&#xff0c;PlugLink可以帮助个人和小微企业实现运营自动化&#xff0c;极大地提升工作效率&#xff0c;降低运营成本。 一、PlugLink简介 PlugLink是一个基于Python的开源自动化工具框…

候选键的确定方法-如何判断属性集U的子集K是否为候选键、如何找到关系模式的候选键

一、候选键的定义 在关系模式R(U,F)中&#xff0c;若&#xff0c;且K满足&#xff0c;则K为关系模式R的候选键 关系模式R的候选键必须满足以下两个条件&#xff1a; &#xff08;1&#xff09;必须是属性集U的子集 &#xff08;2&#xff09;完全函数决定属性集U 二、如何…

易兆微电子_嵌入式软件工程师笔试题

易先电子 嵌入式软件工程师笔试题(十七) 1.关键字 extern是什么含义, 请举例说明。 修饰符extern用在变量或者函数的声明前&#xff0c;用来说明 “ 此变量 / 函数是在别处定义的&#xff0c;要在此处引用 ”。 //main.c #include <stdio.h>int main() {extern int num…

OS复习笔记ch11-2

上一节我们学习的内容是I/O系统的特点和设备分类和差异&#xff0c;这一节我们将主要关注I/O控制方式、OS设计问题、I/O逻辑结构等。 I/O功能的演变 在专栏的ch1-2中&#xff0c;我们详细讲解了CPU与外设的三种交互方式&#xff0c;这里简单地带过。 &#xff08;1&#xff0…