【自用】NLP算法面經(6)

一、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(dk??QKT?),即注意力權重矩陣。
在這里插入圖片描述
在標準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 復雜透視表…