AI・機械学習
上級

FlashAttention(フラッシュアテンション)

Transformerのセルフアテンション計算をIO効率化するアルゴリズム。HBMとSRAM間のデータ転送を最小化するタイリング技法により、標準アテンションと数学的に等価な結果を2〜4倍高速に算出する。

0 回閲覧
0 いいね

FlashAttentionとは

FlashAttentionは、2022年にStanford大学のTri Dao氏が発表したTransformerのアテンション計算を高速化するアルゴリズムである。GPU上のHBM(High Bandwidth Memory)とオンチップSRAM間のデータ移動をタイリング(ブロック分割)によって最小化し、標準的なアテンション実装と完全に等価な計算結果を、メモリ使用量O(N)・計算速度2〜4倍で達成する。2026年現在、vLLM・TensorRT-LLM・PyTorch 2.x・Hugging Face Transformersなど主要フレームワーク全てに統合されており、LLM推論・学習の事実上の標準となっている。

アテンション計算のボトルネック

標準的なセルフアテンションは以下の計算を行う:

  1. Q×K^T の行列積でアテンションスコアを計算(O(N²d))
  2. Softmaxで正規化
  3. 正規化スコア×V で出力を計算

シーケンス長Nが4,096〜128,000に達する現代のLLMでは、N²サイズのアテンション行列をHBMに書き出す必要があり、これがメモリ帯域のボトルネックとなる。H100のHBM帯域は3.35TB/sだが、SRAM帯域は33TB/s以上であり、約10倍の差がある。

GPUHBM容量HBM帯域SRAM容量SRAM帯域演算性能(FP16)
A100 80GB80GB2.0 TB/s20MB/SM~19 TB/s312 TFLOPS
H100 SXM80GB3.35 TB/s50MB/SM~33 TB/s989 TFLOPS
H200141GB4.8 TB/s50MB/SM~33 TB/s989 TFLOPS
B200192GB8.0 TB/s未公開未公開2,250 TFLOPS

FlashAttentionのタイリングアルゴリズム

FlashAttentionの核心は、アテンション行列を明示的にメモリ上に展開せず、ブロック単位で計算を完結させる点にある。

動作原理

  1. Q, K, V 行列をブロックサイズ B_r × B_c(典型的に128×128)に分割
  2. 各ブロックをSRAMにロードし、そのブロック内でQ×K^T→Softmax→×Vを一気に計算
  3. Online Softmax(Milakov & Gimelshein, 2018)を用いて、ブロック間のSoftmax正規化を漸進的に統合
  4. 最終結果のみHBMに書き戻す

メモリ計算量の改善

  • 標準アテンション: O(N²) の中間メモリ(アテンション行列全体を保持)
  • FlashAttention: O(N) の中間メモリ(ブロックサイズ分のみSRAMに保持)
  • シーケンス長128Kの場合: 標準で128K×128K×2B = 32GB → FlashAttentionで数MB

バージョン進化

FlashAttention-1(2022年)

  • 初版。A100で標準アテンションの2〜4倍高速
  • Tritonカーネルで実装。Causal masking対応

FlashAttention-2(2023年)

  • ワークパーティショニング改善で非causal時1.7〜2倍、causal時約3倍にさらに高速化
  • GPUスレッドブロック間のワーク分配を最適化
  • A100で最大理論FLOPSの73%を達成(FA-1は35%)

FlashAttention-3(2024年)

  • H100のTMA(Tensor Memory Accelerator)を活用した非同期データ転送
  • FP8ネイティブ対応でさらに1.5〜2倍高速
  • WGMMA(Warpgroup Matrix Multiply-Accumulate)命令の活用
  • Hopper世代以降のGPU専用(Ampere非対応)
バージョン対応GPU主要改善対標準比速度理論FLOPS利用率
FA-1Ampere+タイリング導入2〜4×~35%
FA-2Ampere+ワーク分配最適化3〜5×~73%
FA-3Hopper+TMA/FP8/WGMMA5〜8×~85%

主要フレームワークでの利用方法

PyTorch 2.x(組み込み)

PyTorch 2.0以降、torch.nn.functional.scaled_dot_product_attentionでFlashAttentionバックエンドが自動選択される。

vLLM

vLLM 0.4以降でFlashAttention-2がデフォルト有効。--enable-flashinferオプションでFlashInfer(FlashAttention派生の高速カーネル)も選択可能。

Hugging Face Transformers

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-70B", attn_implementation="flash_attention_2")で明示的に有効化。

FlashAttentionの制約と代替

  • Ampere以前のGPU: FlashAttentionはSM80以降(A100/RTX 30xx以降)が必要。V100ではxFormers memory_efficient_attentionが代替
  • 可変長シーケンス: パディングなしのvarlen APIが必要(FA-2で対応済み)
  • カスタムアテンションマスク: Sliding Window Attention等の複雑なマスクは専用実装が必要(FlashAttention-2.5で一部対応)

よくある質問(FAQ)

Q1: FlashAttentionを使うとモデルの精度は変わりますか? A: 変わらない。FlashAttentionは標準アテンションと数学的に完全等価であり、精度低下は一切ない(FP8モード除く)。速度とメモリ効率のみが改善される。

Q2: RTX 4090でFlashAttention-3は使えますか? A: 使えない。FlashAttention-3はHopper世代(H100/H200)以降のGPU専用。RTX 4090(Ada Lovelace)ではFlashAttention-2が最速選択肢。

Q3: FlashAttentionとxFormersの違いは何ですか? A: xFormersのmemory_efficient_attentionはFlashAttentionと同様のメモリ効率化を行うが、FlashAttention-2/3はより積極的なハードウェア最適化(ワーク分配、TMA活用)で上回る。2026年現在はFlashAttentionが標準。

まとめ

  • FlashAttentionはGPUのメモリ階層を活用したIO-awareなアテンション最適化アルゴリズム
  • 標準アテンションと数学的に等価で精度劣化なし、速度2〜8倍・メモリO(N²)→O(N)
  • FA-3はH100以降でFP8/TMAを活用し理論性能の85%を達成
  • 2026年現在、vLLM/PyTorch/HF Transformers全てに統合済みのデファクト標準