序列模型與Transformer

閃電注意力(flash attention)

/ flash uh-TEN-shun /

閃電注意力,是一種巧妙的辦法,它通過聰明地安排資料在晶片內部的搬運,算出與原來完全相同的注意力結果,卻快得多、省記憶體得多。關鍵的領悟是:在現代 GPU 上,慢的那部分通常不是算術——而是把資料在晶片那一小塊快如閃電的晶片上記憶體、與它更大卻慢得多的主記憶體之間來回倒騰。標準注意力會把一個巨大的分數矩陣寫進慢記憶體再讀回來,而這趟流量才是真正的瓶頸。

閃電注意力壓根不在慢記憶體裡搭出那個完整矩陣。它把序列分成一塊塊能塞進快速晶片上記憶體的小瓦片,為每塊算注意力,再用一個邊算邊更新、數值上很謹慎的 softmax 版本,巧妙地把部分結果即時合併起來。它的輸出在數學上與普通注意力一模一樣——並非近似——但因為它從不實體化那個巨大的中間矩陣,所用記憶體只隨序列長度線性增長,而非平方增長,實踐中還快上好幾倍。

這是一個「在絲毫不改數學的前提下,改變了可能性邊界」的教科書例子。通過砍掉記憶體代價,閃電注意力使得在遠比從前更長的序列上訓練和運行模型變得可行,直接成全了今天人們用的許多長上下文模型。誠實的說法是:它並沒有打破注意力那根本的平方計算量——運算的次數還在那裡——它移除的是記憶體牆與慢記憶體流量,而那才是真正的實踐上限。這是一場系統的勝利,而非關於注意力本身的新算法。

在一段 16000 詞元的序列上,標準注意力試圖在記憶體裡端著一個 16000×16000 的分數矩陣——數以億計的數字——於是憋住了。閃電注意力壓根不搭它;它串流地穿過一塊塊小瓦片,產出一模一樣的輸出,卻能舒舒服服地裝進快速晶片上記憶體。

同樣的答案,沒有那個巨大矩陣——一個記憶體技巧,而非新公式。

一個常見的誇大,是說閃電注意力「解決」了注意力的平方代價。它並沒有——算術運算的次數沒變。它移除的是記憶體瓶頸與慢記憶體流量,那才是綁手綁腳的實踐上限。它算出的是完全相同的結果,只是效率高得多。

又稱
FlashAttention闪电注意力閃電注意力IO-aware attention