Generative AI·生成式 AI·

⚡ 加快語言模型生成速度(1/2):Flash Attention

#Flash Attention#Inference#Transformer#GPU#李宏毅

課程來源: 台大李宏毅《機器學習》2026 Spring
主題: 加快語言模型生成速度(1/2):Flash Attention(約 50 分鐘)
投影片: inference.pdf
先備: 語言模型內部運作原理|論文: FlashAttention


#一、這堂課在講什麼?

加快語言模型**生成(Inference)**速度,經典方法有三類:

  1. Flash Attention(本講)
  2. KV Cache(下一講)
  3. Speculative Decoding(過去已講,見 2024 生成式 AI 第 16 講)

今天你用語言模型時,多半已經在用 Flash Attention,只是不一定知道它怎麼算。

Flash Attention 的特點:

  • 不改變 attention 的計算結果(不是近似)
  • 隨插即用:可套到任何使用 self-attention 的 Transformer
  • 代價小、效果大(長序列上可約 8×~9× 加速)

來源是 2022 年論文,已是「上古神技」,至今仍是標配。


#二、為什麼 Attention 慢?瓶頸在「搬運」

GPU 記憶體分層(倉庫 / 工作台):

層級比喻特點
HBM大倉庫容量大、讀寫慢
SRAM工作台極快、但空間很小

標準 Self-Attention:

Attention(Q,K,V)=softmax(QK⊤d)V\text{Attention}(Q,K,V) = \mathrm{softmax}\left(\frac{QK^\top}{\sqrt{d}}\right) V

樸素實作會:

  1. 在 HBM 上存完整的 QK⊤QK^\top(序列長 NN 時是 O(N2)O(N^2))
  2. 再讀回來做 softmax
  3. 再與 VV 相乘

→ 大量時間花在 HBM ↔ SRAM 的來回搬運,而不是矩陣乘法本身。
這是典型的 memory-bound(I/O bound),不是 compute-bound。


#三、改進思路:分塊(Tiling)

把 QQ、KK、VV 切成小塊:

  • 每次只把能放進 SRAM 的塊搬上「工作台」
  • 在 SRAM 裡做完,再寫回必要結果

可把「讀好幾次」降到大約 兩次量級 的有效讀寫策略;但仍可能要把中間 attention 相關量寫回 HBM——還不夠。


#四、靈魂拷問:一定要算出完整 Attention Weight 嗎?

標準流程心理上是:

  1. 算出完整 attention matrix A=softmax(QK⊤/d)A = \mathrm{softmax}(QK^\top / \sqrt{d})
  2. 再 O=AVO = AV

Flash Attention 的關鍵洞察:

不需要把完整的 attention weight 矩陣真正存出來。
在 SRAM 裡做完 QKQK 後,直接與 VV 做加權累積,得到輸出 OO。

全程:

  • 巨大的 N×NN \times N attention 矩陣從不完整寫回 HBM
  • 只維護輸出 OO,以及做 softmax 所需的少量統計量

副作用:幾乎「讀不出」完整 attention map(做 interpretability 時不方便)——這正是加速的代價與收益。


#五、Online Softmax:分塊也能算對

問題:softmax 需要整行的最大值和加總,分塊時看不到整行怎麼辦?

Online Softmax 用數學修正:

  • 維護目前為止的 running max 與 running sum
  • 當新塊出現更大的 max 時,用新舊 max 的差去修正之前的累積結果
  • 最終數值與「一次看完全行再 softmax」等價(在浮點誤差範圍內)

因此可以一塊一塊處理,不必為了 softmax 把整行中間結果反覆寫回 HBM。
這是 Flash Attention 能 exact(精確) 又快的關鍵數學工具。


#六、效果與實務

  • 長序列(如 4096 tokens)上,相對樸素實作可約 8×~9× 加速(視硬體與實作而定)
  • 數值結果與原生 attention 幾乎相同(浮點累積順序不同可能有極小差異)
  • 現代框架常預設啟用類似優化,例如指定 attn_implementation 為 sdpa

是否真的走到 Flash Attention,取決於 PyTorch 版本、GPU 型號等環境。

投影片後半會銜接到 KV Cache(decode 階段必須存 K/V,否則每步重算)。


#七、概念直覺對照

概念直覺
標準 Attention先造整張大表 AA,再乘 VV → 表太大,搬運貴
Tiling桌子一次只放得下一塊,分塊搬、分塊算
Online Softmax邊算邊記「目前最大」和「目前總和」,新塊來了再修正
Flash Attention工作臺上算完就累加進 OO,大表從不進倉庫

數學上仍是:

Oi=∑jsoftmaxj(qi⊤kjd)vjO_i = \sum_j \mathrm{softmax}_j\left(\frac{q_i^\top k_j}{\sqrt{d}}\right) v_j

只是實作順序與存取模式完全不同。


#八、總結

Flash Attention 透過「分塊 + Online Softmax」,在不改變 attention 數學結果的前提下,避免把 O(N2)O(N^2) 的 attention 矩陣寫入 HBM,大幅減少 GPU 記憶體讀寫,顯著加快(尤其是長序列的)Transformer 運算。

集主題
本講 (1/2)Flash Attention(算 attention 本身更快、更省顯存)
下一講 (2/2)KV Cache(生成時避免重複算歷史 K/V)
延伸Speculative Decoding(小模型猜、大模型驗證)

延伸閱讀: