一、FlashAttention

1、Tile-Based计算

将q,k,v分块为小块,每次仅处理一小块:

  • 利用gpu的片上SRAM完成QK^T和softmax
  • 避免中间结果写入HBM

标准attention的计算算法如下:
在这里插入图片描述
标准attention实现大量中间结果需要频繁访问HBM,而HBM的访问速度远远低于GPU的SRAM。因此FlashAttention通过“tile计算+显存访问优化”方案,减少了对HBM的依赖,提高了整体执行效率。

softmax计算公式如下:
在这里插入图片描述
为了数值稳定性,FlashAttention采用Safe Softmax,对于向量x
在这里插入图片描述
同理,对于向量x=[x1,x2],softmax可以分解计算:
在这里插入图片描述
这就说明即使q,k,v被分成块也可以计算softmax的。

2、Recomputation strategy

为了节省存储中间的softmax权重,FlashAttention在需要时重新计算部分内容,避免保存完整矩阵。
标准attention的反向传播算法如下,其中P代表softmax(QKTdk)softmax(\frac{QK^T}{\sqrt{d_k}})softmax(dkQKT),即注意力权重矩阵。
在这里插入图片描述
在标准attention的实现中,为了完成前向传播和反向传播,需要保存如下中间结果:

  • QKTQK^TQKT
  • softmax权重
  • attention output(最终结果)
    这些矩阵很大,尤其是在处理长序列时,显存消耗会非常高。
    FlashAttention为了降低显存占用,采取了一种策略:

在前向传播时不保留中间矩阵,而是到了反向传播阶段再把它们重新计算出来。

以softmax的attention score为例:

  • 标准方法

QKTQK^TQKT -> softmax -> 换存在显存中 ->用于乘v和反向传播

  • FlashAttention

QKTQK^TQKT -> softmax -> 直接用于乘V,不缓存

后面反向传播要用到softmax->再计算一次QKTQK^TQKT和softmax

3、代码

for i in range(0, N, block_size): #外层循环:按block_size步长遍历所有token(处理query的分块)q_block = q[:, i:i+block_size] #取出当前query块[batch_size, block_size,dim]max_score = None #初始化当前query块的最大注意力分数(用于数值稳定)row_sum_exp = None #初始化当前query块的指数和(用于softmax分母)acc = torch.zeros_like(q_block) #初始化累积结果张量for j in range(0, N, block_size): #内层循环:遍历所有k/v的分块k_block = k[:, j:j+block_size]v_block = v[:, j:j+block_size]# 1.计算原始注意力分数scores = torch.bmm(q_block, k_block.transpose(1,2)) * scale #[batch, block_size, block_size]#bmm表示批量矩阵乘法,scale是缩放因子(通常为1/sqrt(dim))# 2.数值稳定处理(减去最大值后做指数计算)block_max = scores.max(dim=-1, keep_dims=True).values #当前块每行的最大值 [batch, block_size, 1]scores = scores - block_maxexp_scores = socres.exp() #计算指数[batch, block_size, block_size]# 3.可选dropoutif dropout_p > 0.0:exp_scores = F.dropout(exp_scores, p=dropout_p,training=True)# 4.累积加权和(注意力权重 x value)acc += torch.bmm(exp_scores,v_block)# 5.维护softmax分母(log-sum-exp技巧)block_sum = exp_scores.sum(dim=-1,keep_dims=True) #当前块的指数和 [batch, block_size, 1]if row_sum_exp is None: #第一次处理该query块时row_sum_exp = block_sum #直接保存max_score = block_max #保存当前最大值else:row_sum_exp += block_summax_socre = torch.max(max_socre, block_max)output[:, i:i+block_size] = acc / (row_sum_exp + 1e-6)
return output

4、总结

(1)FlashAttention的关键设计

  • 将q/k/v分成小块,在SRAM中进行attention的计算
  • 在计算softmax的过程中使用log-sum-exp技巧,确保数值稳定
  • 将softmax后与V的乘法也集成进tile内的计算流程,避免生成大矩阵
  • 利用recompilation:不存储softmax权重P,而是在反向传播时重算QKTQK^TQKT,换取显存节省。

(2)FlashAttention的不足

  • 线程并行效率不高:使用的是“1warp对应1Q行”的划分方式,warp内线程空闲率高
    【注:
    在gpu并行计算中,warp是NVIDIA GPU的基本执行单位,通常由32个线程组成。这些线程在gpu上以SIMT(single instruction, multiple threads)方式执行,即所有线程在同一时刻执行相同指令,但可以处理不同的数据。

FlashAttention中的“1 warp对应1Q行”问题是指每个warp负责计算1行Q的注意力分数。但由于Q的行维度(seq_len)通常远小于32,导致:
+ 线程利用率低:32个线程中,只有少数线程真正在计算,其余线程空闲
+ 并行效率不高:gpu的SIMT架构要求所有线程执行相同指令,但部分线程没有实际工作,造成浪费。

  • split-K导致频繁HBM读写:每次分块操作都要访问Q和O,存在冗余累加
  • 不支持MQA/GQA等高效注意力结构:仅适用于标准MHA
  • 实现依赖Triton编译器:对部属平台要求高,难以在pytorch,tensorflow等框架中原生集成
  • 反向传播内核较少优化:精度和性能兼顾方面还有改进空间。

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

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

相关文章

Vue页面卡顿优化:从理论到实战的全面解释

目录 1. 理解Vue页面卡顿的幕后黑手 1.1 响应式系统的“双刃剑” 1.2 虚拟DOM的“隐藏成本” 1.3 浏览器渲染的“性能陷阱” 实战案例:一个“罪魁祸首”的排查 2. 优化响应式系统:让数据“轻装上阵” 2.1 使用v-if和v-show控制渲染 2.2 冻结静态数据 2.3 精细化响应式…

从0开始学linux韦东山教程Linux驱动入门实验班(6)

本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。本人将前几章的内容大致学完之后,考虑到后续驱动方面得更多的开始实操,后续的内容将以韦东山教程Linux驱动入门实…

高性能反向代理与负载均衡 HAProxy 与 Nginx

在现代高并发 Web 架构中,HAProxy 和 Nginx 是两个非常重要的工具。它们在反向代理、负载均衡、SSL 终止、缓存、限流等方面发挥着关键作用。 一、HAProxy 与 Nginx 简介 1. HAProxy 简介 HAProxy(High Availability Proxy) 是一个使用 C …

AI安全“面壁计划”:我们如何对抗算法时代的“智子”封锁?

> 在算法窥视一切的今天,人类需要一场数字世界的“面壁计划” 2025年,某医院部署的AI分诊系统被发现存在严重偏见:当输入相同症状时,系统为白人患者分配急诊通道的概率是黑人患者的**1.7倍**。调查发现,训练数据中少数族裔样本不足**15%**,导致AI在“认知”上形成了结…

数据库数据恢复—报错“system01.dbf需要更多的恢复来保持一致性”的Oracle数据恢复案例

Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。Oracle数据库恢复流程: 1、…

Spring Cloud Gateway 服务网关

Spring Cloud Gateway是 Spring Cloud 生态系统中的一个 API 网关服务,用于替换由Zuul开发的网关服务,基于Spring 5.0Spring Boot 2.0WebFlux等技术开发,提供了网关的基本功能,例如安全、监控、埋点和限流等,旨在为微服…

[数据结构]#6 树

树是一种非线性的数据结构,它由节点组成,并且这些节点之间通过边连接。树的每个节点可以有一个或多个子节点,并且有一个特殊的节点叫做根节点(没有父节点)。树在计算机科学中应用广泛,尤其是在数据库索引、…

车辆网络安全规定之R155与ISO/SAE 21434

随着科技的不断进步,车辆已经从传统的机械装置演变为高度智能化的移动终端。现代汽车不仅配备了先进的驾驶辅助系统(ADAS)、车载信息娱乐系统(IVI),还具备联网功能,能够实现远程诊断、自动驾驶、…

Go语言实战案例-合并多个文本文件为一个

以下是《Go语言100个实战案例》中的 文件与IO操作篇 - 案例21:合并多个文本文件为一个 的完整内容,适用于初学者学习文件读取与写入的综合运用。🎯 案例目标使用 Go 语言将指定目录下的多个 .txt 文件,合并成一个新的总文件。&…

基坑渗压数据不准?选对渗压计能实现自动化精准监测吗?

一、渗压监测的背景 渗压计是一种专门用于测量构筑物内部孔隙水压力或渗透压力的传感器,适用于长期埋设在水工结构物或其它混凝土结构物及土体内,以测量结构物或土体内部的渗透(孔隙)水压力。 在水利工程中,大坝、水库…

Linux网络:阿里云轻量级应用服务器配置防火墙模板开放端口

1.问题介绍在使用Udp协议或其他协议进行两台主机或同一台主机通信时,常常会出现bind成功,但是在客户端向服务端发送数据后,服务端无响应的情况,如果使用轻量级应用服务器,大概率是服务器的端口因为防火墙未对公网IP开放…

《 Spring Boot整合多数据源:分库业务的标准做法》

🚀 Spring Boot整合多数据源:分库业务的标准做法 文章目录🚀 Spring Boot整合多数据源:分库业务的标准做法🔍 一、为什么需要多数据源支持?💡 典型业务场景⚙️ 二、多数据源集成方案对比&#…

前端ApplePay支付-H5全流程实战指南

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言近期公司开展关于苹果支付的相关业务,与之前不同的是,以前后台直接获取第三方Wallet封装好的接口获取支付地址,H5页面直接跳转使用Appl…

Flink窗口:解锁流计算的秘密武器

Flink 窗口初识在大数据的世界里,数据源源不断地产生,形成了所谓的 “无限数据流”。想象一下,网络流量监控中,每一秒都有海量的数据包在网络中穿梭,这些数据构成了一个无始无终的流。对于这样的无限数据流&#xff0c…

Java排序算法之<希尔排序>

目录 1、希尔排序介绍 1.1、定义 1.2、核心思想 2、希尔排序的流程 第 1 轮:gap 4 第 2 轮:gap 2 第 3 轮:gap 1 3、希尔排序的实现 4、时间复杂度分析 5、希尔排序的优缺点 6、适用场景 前言 希尔排序(Shell Sort&…

c++加载qml文件

这里展示了c加载qml文件的三种方式以及qml文件中根节点的访问准备在创建工程的初期,遇到了一个问题,cmake文件以前都是系统自动生成的,不需要我做过多的操作修改,但是,加载qml的程序主函数是需要用到QGuiApplication&a…

007TG洞察:GPT-5前瞻与AI时代竞争力构建:技术挑战与落地路径

最近,GPT-5 即将发布的消息刷爆了科技圈,更让人期待的是,GPT-6 已经悄悄启动训练了,OpenAI 的奥特曼表示对未来1-2年的模型充满信心,预测AI将进化为能够发现新知识的“AI科学家”。面对日益强大的通用AI,企…

Windows下编译OpenVDB

本文记录在Windows下编译OpenVDB的流程。 零、环境 操作系统Windows 11VS Code1.92.1Git2.34.1MSYS2msys2-x86_64-20240507Visual StudioVisual Studio Community 2022CMake3.22.1 一、编译 1.1 下载 git clone https://github.com/AcademySoftwareFoundation/openvdb.git …

react 内置hooks 详细使用场景,使用案例

useState场景&#xff1a;组件中管理局部状态&#xff0c;如表单值、开关、计数器等。const [count, setCount] useState(0); return <button onClick{() > setCount(count 1)}>Click {count}</button>;useEffect 场景&#xff1a;组件挂载时执行副作用&#…

从0到1学Pandas(九):Pandas 高级数据结构与操作

目录一、探秘多级索引1.1 创建多级索引1.2 多级索引操作1.3 索引转换二、探索 Panel 与 xarray2.1 Panel 数据结构2.2 xarray 库2.3 高维数据操作三、时间序列高级应用3.1 时区处理3.2 时间序列重采样与频率转换3.3 时间序列分解与预测四、数据透视与重塑高级技巧4.1 复杂透视表…