Flash Attention 2 / 3 とは 2026年版:ローカルLLM の推論・学習を速くする Attention 実装、Blackwell FP8 対応と llama.cpp・vLLM での効き方
Flash Attention(FA2 / FA3)はローカルLLM の推論と学習を数倍速くする Attention 実装です。標準の Attention と何が違うか(IO 削減・タイル化・SRAM 活用)、Ampere / Ada / Hopper / Blackwell での対応差、FA3 の FP8 と非同期演算、llama.cpp の -fa フラグ、vLLM / SGLang / TGI での既定対応、SDPA・xformers との住み分けまで整理し、tok/sec と VRAM の両方をどう改善するかを実データで示します。
- #Flash Attention
- #FA2
- #FA3
- #ローカルLLM
- #llama.cpp
- #vLLM
- #Blackwell
- #FP8
- #SDPA
本記事は Amazon.co.jp および各販売店のアフィリエイトリンクを含む場合があります。推奨は性能・コスパ・実機ベンチマーク基準で編集判断しており、提供記事は受け付けていません。詳細は プライバシーポリシー をご覧ください。

結論:Flash Attention は標準の Attention と同じ数学結果を保ったまま、GPU 上のメモリアクセス回数を N の 2 乗から N の 1 乗に削減するアルゴリズムです。FA2 は Ampere(A100 / RTX 3090)以降で動き、FA3 は Hopper(H100)以降と Blackwell(B200 / RTX 5090)で FP8 対応まで拡張されます。実用面では llama.cpp の -fa フラグと vLLM の既定バックエンドとして日常的に使われており、長文プロンプトで prefill を 2〜3 倍・VRAM を 20〜40% 削減します。この記事は仕組み・世代別対応・実際の効き方を、ローカル LLM ユーザーの目線で整理します。
「Flash Attention を有効にすると速い」というのは llama.cpp や vLLM のドキュメントでよく見る話ですが、なぜ速いのか、どの世代の GPU で効くのか、KV キャッシュ量子化とどう組み合わさるのか、を体系的に説明した記事は日本語で意外と少ないです。私はローカル LLM を llama.cpp と vLLM で毎日使っていて、-fa を付けた瞬間に 128K プロンプトの体感が変わる経験を何度もしています。この記事はその「なぜ効くのか」を、標準 Attention の何が問題かから順に解きほぐします。
標準 Attention の何が問題か:IO が O(N²) で爆発する
Flash Attention を理解するには、まず標準の Attention 実装がなぜ遅いかを押さえる必要があります。
Attention の計算は、大まかに以下の 3 ステップです。
- Q × K^T を計算して N×N の attention matrix を作る
- Softmax を適用してスケーリングする
- attention matrix × V を計算して出力を得る
問題は 1 の attention matrix です。シーケンス長 N が 8K なら 8192×8192 = 6700 万要素、32K なら 10 億要素、128K なら 164 億要素になります。この巨大な行列を GPU の HBM(High Bandwidth Memory、いわゆる VRAM)に書き戻し、Softmax の入力として読み直し、V との積の入力として再度読み直す。結果として、シーケンス長 N に対して IO 量が N の 2 乗で増えます。
ここが致命的です。GPU の計算性能は年々上がっていますが、HBM の帯域はそこまで伸びていません。RTX 5090 の HBM 帯域は約 1,792 GB/s、Blackwell B200 でも約 8 TB/s。演算ユニットの理論性能に対して、メモリ帯域は圧倒的に足りません。長文プロンプトの Attention は「演算器は暇なのに、メモリからのデータ供給待ちで止まっている」状態になります。この構造は「メモリ帯域幅(GB/s)がローカルLLMの tok/sec を決める仕組み 2026年版」で扱った decode 律速の話と同じで、Attention でも同じ壁にぶつかります。
Flash Attention の解決策:SRAM でタイル化して融合カーネルにする
Flash Attention(Tri Dao et al., 2022)が提案したのは、以下の 3 点セットです。
- タイル分割:N×N の attention matrix を全体で作らず、小さなタイル(例:128×128)に分割して逐次処理
- SRAM 上での融合:Q × K^T → Softmax → × V の 3 ステップを 1 つの CUDA カーネルにまとめ、中間結果を GPU 上の SRAM(on-chip cache)に置く。HBM への書き戻しをしない
- オンライン Softmax:タイルを増えるたびに Softmax の分母(sum of exp)を更新する数式変形。全タイルを見終わる前に部分結果を出せる
この 3 点で、attention matrix を HBM に置く必要が消えます。結果として IO 量が N の 2 乗から N の 1 乗に落ちます。演算量(FLOPs)は同じですが、GPU がメモリ帯域律速だったので、実効速度は数倍速くなります。
数式面では標準 Attention と完全に等価で、出力は 1 bit も変わりません。近似を持ち込まず厳密なアルゴリズム変更だけで速くする、という点が Flash Attention の面白いところです。
FA2 の改善:forward pass の並列化
初代 Flash Attention(FA1)は forward pass のシーケンス次元の並列化が不十分で、SM(Streaming Multiprocessor)の使用率が低い問題がありました。FA2(2023)は以下の 2 点を改善しました。
- シーケンス次元の並列化:異なるシーケンス位置を異なる SM に割り当て、SM 使用率を大きく向上
- causal mask の最適化:自己回帰言語モデル特有の下三角 mask を、無駄な計算を避ける形で実装
結果として FA1 の 2 倍、標準実装の 5〜10 倍の速度が出るようになりました。現在の PyTorch 2.6 の SDPA が内部で使っているのはこの FA2 です。
FA3 の飛躍:Hopper の TMA / WGMMA / warp specialization
FA3(Tri Dao, Jay Shah et al., 2024)は Hopper(H100)以降の GPU に特化して設計されています。使う新命令は以下の 3 つです。
- TMA(Tensor Memory Accelerator):非同期でメモリコピーを走らせる専用ユニット
- WGMMA(Warp Group Matrix Multiply Accumulate):4 warp を 1 グループとして行列積を実行する新命令
- warp specialization:グループ内の warp を「メモリロード担当」「行列積担当」「Softmax 担当」に役割分担して同時実行
これにより FA2 の 1.5〜2 倍高速化されます。FP16/BF16 で H100 のピーク性能に近い 75% 前後の実効を出します(FA2 は 30〜35% 程度)。
さらに FA3 の重要な追加要素が FP8 Attention 対応です。Hopper では FP8 テンソルコアが使えますが、標準 Attention では FP8 化しても Softmax の精度低下が問題でした。FA3 は per-tile での再スケーリングと block-wise の quantization で精度を保ったまま FP8 化を実現し、FP16/BF16 と比べて追加で 1.5〜2 倍速くなります。Blackwell(B200 / RTX 5090 / RTX PRO 6000 Blackwell)では FP8 Attention が第 5 世代テンソルコアで加速され、H100 世代からさらに 2 倍近い性能が出ます。FP8 の詳細は「NVFP4 / MXFP4 / FP8 とは:Blackwell の低精度フォーマット解説 2026年版」で扱っています。
世代別対応表:どの GPU で何が使えるか
Flash Attention のバージョンと GPU 世代の対応関係を整理します。
| GPU 世代 | 代表機種 | FA2 FP16/BF16 | FA3 FP16/BF16 | FA3 FP8 |
|---|---|---|---|---|
| Ampere | A100 / RTX 3090 / RTX 3060 | 対応 | 非対応 | 非対応 |
| Ada | RTX 4090 / RTX 4080 / RTX 4070 | 対応 | 非対応 | 非対応 |
| Hopper | H100 / H200 | 対応 | 対応 | 対応 |
| Blackwell | B200 / RTX 5090 / RTX PRO 6000 Blackwell | 対応 | 対応 | 対応(加速) |
| Apple Silicon | M3 / M4 / M5 | 非対応(MLX で相当機能) | 非対応 | 非対応 |
RTX 4090 まで(Ada 世代)のユーザーは FA2 が使える最上位で、FA3 の恩恵は受けられません。RTX 5090 や RTX PRO 6000 Blackwell を持つユーザーは FA3 + FP8 まで使え、長文プロンプトで H100 相当の実効速度が出ます。Apple Silicon は CUDA 実装の Flash Attention は動かず、MLX 側で類似のアルゴリズム(Unified Memory 前提で最適化)が提供されます。
llama.cpp の -fa フラグ:長文で 2〜3 倍、VRAM 20〜40% 削減
llama.cpp では Flash Attention は -fa または --flash-attn フラグで有効化します。有効時の効果は以下の通りです。
- prefill 時間の短縮:8K プロンプトで 1.3〜1.5 倍、32K で 2〜2.5 倍、128K で 2.5〜3.5 倍高速化
- VRAM 削減:KV キャッシュ量子化(
-ctk q8_0 -ctv q8_0)と併用で 20〜40% 削減 - decode 速度:長文コンテキスト時に 1.1〜1.3 倍高速化。短文単発では体感差なし
典型的な使い方は以下です。
./llama-server \
-m Qwen3-32B-Q4_K_M.gguf \
-ngl 99 \
-c 65536 \
-fa \
-ctk q8_0 -ctv q8_0
-fa は GPU offload レイヤー数(-ngl)が多いほど効きます。数レイヤーだけ GPU に載せる構成では、CPU 側の Attention 計算にオーバーヘッドが発生して逆効果になるケースがあります。llama.cpp のチューニング全般は「ローカルLLM 推論のチューニング 2026年版」を参照してください。
vLLM / SGLang / TGI:既定で有効、切り替えは環境変数で
サーバ用途の推論エンジンでは Flash Attention は既定で有効です。
- vLLM:v0.5 まで FA2、v0.6 以降で FA3 + PagedAttention の併用が選べる。強制的に切り替えたい場合は環境変数
VLLM_ATTENTION_BACKEND=FLASH_ATTN/XFORMERS/TORCH_SDPA - SGLang:FlashInfer(FA 系の派生実装)を既定で使用。RadixAttention と組み合わさる
- TGI(Text Generation Inference):FA2 を既定、v3.x で FA3 対応
継続バッチング + PagedAttention + Flash Attention の 3 段を組み合わせると、単発 llama.cpp と比べて throughput が 5〜10 倍出ます。多ユーザ同時アクセスのサービスなら vLLM や SGLang が事実上の標準で、その裏で Flash Attention が働いています。
PyTorch SDPA / xformers / flash-attn パッケージの住み分け
Python コードから直接 Attention を呼ぶ場合、選択肢は 3 つあります。
torch.nn.functional.scaled_dot_product_attention(SDPA):PyTorch 2.0 以降の標準 API。内部で FA2 を呼ぶが、FA3 は使えないflash-attnパッケージ:Tri Dao 公式実装。FA2 最新版と FA3 が使える。Blackwell FP8 対応もこちらxformers:Meta の memory-efficient attention。FA が対応しない古い GPU 向け
一般的な用途では SDPA を呼ぶだけで FA2 の恩恵が入ります。以下は SDPA を使ったコード例で、Backend が自動で FA2 を選択します。
import torch
import torch.nn.functional as F
# Q, K, V shape: (batch, head, seq, dim)
out = F.scaled_dot_product_attention(q, k, v, is_causal=True)
Hopper 以降で FA3 を使いたい場合や FP8 Attention を試したい場合のみ、flash-attn パッケージを別途インストールします。
KV キャッシュとの相互作用
Flash Attention は KV キャッシュ量子化と相性がよく、両方使うと VRAM 削減効果が積み重なります。KV キャッシュがコンテキスト長で線形に増える構造は「ローカルLLMのコンテキスト長と VRAM 消費・KV キャッシュ 2026年版」で解説していますが、Flash Attention は以下の 2 点で KV キャッシュに効きます。
- 読み込み時のタイル化:KV キャッシュ全体を HBM から読まず、タイル単位で SRAM に載せて処理する
- 量子化 KV との併用:
-ctk q8_0 -ctv q8_0で KV を 8bit 化しても、Flash Attention が per-tile で正しく計算する
この結果、128K コンテキストで動く 32B モデルの VRAM が、FP16 KV + 標準 Attention の 34GB から FA + Q8 KV の 22GB まで落ちます。RTX 5090(32GB)で 128K が現実的になる境界線が、この組み合わせでようやく越えられます。
効くケース / 効かないケース早見表
Flash Attention をどこで有効化すべきか、逆にどこで無効化しても問題ないかを整理します。
| ケース | 効く / 効かない | 理由 |
|---|---|---|
| 長文プロンプト(32K トークン超) | 効く | Attention 計算量が支配的 |
| Vision-Language Model | 効く | 画像トークンが多くシーケンス長が長い |
| QLoRA / SFT 学習 | 効く | forward + backward 両方で IO 削減 |
| 投機的デコードと併用 | 効く | ドラフトモデルの Attention も加速 |
| 短文単発推論(8B + 1K プロンプト) | 微妙 | カーネル起動オーバーヘッドが上回る場合あり |
| CPU-only 推論 | 効かない | GPU の SRAM が無いので原理的に使えない |
| Apple Silicon(M シリーズ) | 効かない(MLX で相当機能) | CUDA 実装のため。MLX 側で類似アルゴリズムを提供 |
| GPU offload レイヤー数が少ない | 効かない〜逆効果 | CPU/GPU 境界でオーバーヘッド |
多くのユースケースで効くので「基本オン、効かない条件で切る」の判断で問題ありません。
他の高速化手法との組み合わせ
Flash Attention は他の高速化手法と直交して効きます。組み合わせで効果が積み上がります。
- 量子化(Q4 / Q8 / FP8):モデル重みを小さくし、decode の tok/sec を上げる。Flash Attention とは別軸で効く。詳しくは「ローカルLLMの量子化フォーマットとは 2026年版」
- 投機的デコード:ドラフトモデルで先読みし、大モデルで一括検証する。Flash Attention とは無関係に 1.5〜3 倍効く。「投機的デコード(Speculative Decoding)とは 2026年版」で解説
- PagedAttention(vLLM):KV キャッシュをページ単位で管理してメモリ断片化を防ぐ。Flash Attention と併用が前提
- 継続バッチング:複数リクエストを効率的にまとめる。vLLM / SGLang / TGI の標準機能
decode の速度そのものはメモリ帯域律速で、Flash Attention では原理的に上げられません(Attention の IO を減らしても、モデル重み全体の読み出しが残る)。tok/sec を上げたければ帯域を上げるか、量子化で重みを小さくするか、投機的デコードで確定を稼ぐか、の 3 方向です。
まとめ:GPU で長文を扱うなら基本オン
Flash Attention の使いどころを 1 行でまとめると:
GPU で 8K トークンを超えるプロンプトを扱うなら、llama.cpp の
-faと KV 量子化を組み合わせる。vLLM / SGLang / TGI では既定で有効なので気にしなくてよい。
これだけです。世代別の細かい話(FA2 か FA3 か、FP16 か FP8 か)はライブラリ側が自動で選ぶので、ユーザーが意識する場面は少ないです。RTX 5090 や Blackwell 系を買った人が「FP8 Attention 有効になっているか」を確認したい場合のみ、flash-attn パッケージ側で明示指定します。
長文プロンプトの prefill が体感で遅い、KV キャッシュで VRAM が足りない、というローカル LLM の 2 大不満は、Flash Attention と KV 量子化の 2 つでかなり緩和されます。試したことがない場合は、まず -fa -ctk q8_0 -ctv q8_0 を llama.cpp のコマンドに足すところから始めてみてください。128K プロンプトの世界が現実味を帯びます。
入手先・関連商品
当サイトは Amazon.co.jp アソシエイト・プログラムに参加予定です。下記リンク経由で購入された場合、紹介料を受け取ることがあります。読者の負担は増えません。リンクは記事評価とは独立しており、編集判断には影響しません。
Flash Attention 3 と FP8 Attention の恩恵を最大限受けられる Blackwell 世代 GPU の参考リンクです。
- NVIDIA GeForce RTX 5090 を Amazon.co.jp で見る
- NVIDIA RTX PRO 6000 Blackwell を Amazon.co.jp で見る
- NVIDIA GeForce RTX 5080 を Amazon.co.jp で見る
あなたに合うPCを診断する
用途や予算をもう少し細かく入力すると、3つの候補構成を提案します。
→ 診断スタート
関連記事
よくある質問
- Flash Attention と標準の Attention の一番の違いは何ですか?
- メモリアクセス回数(IO)の削減です。標準 Attention はシーケンス長 N に対して Q・K・V の N×N の attention matrix を GPU の HBM(VRAM)に書き戻すため、IO 量が N の 2 乗で増えます。Flash Attention は SRAM(GPU on-chip cache)にタイル分割して attention matrix を HBM に書き戻さず、fused kernel で処理します。結果として IO 量が N の 1 乗に落ち、長文プロンプトで数倍速くなります。演算量そのものは変わりませんが、GPU の性能はメモリ帯域律速なので実効速度が大きく変わります。
- FA2 と FA3 は何が違いますか?
- FA3 は Hopper(H100)以降の TMA・WGMMA・warp specialization という新命令を使い、FA2 の 1.5〜2 倍高速になります。さらに Blackwell(B200 / RTX 5090 系)では FP8 Attention に対応し、FP16/BF16 と比べて追加で 2 倍近い高速化が入ります。FA2 は Ampere・Ada でも動くのに対し、FA3 は Hopper 以降でしか性能が出ません。RTX 4090 までのユーザーは FA2、RTX 5090 / RTX PRO 6000 Blackwell を持つユーザーは FA3 という住み分けです。
- llama.cpp の `-fa` フラグは常に付けるべきですか?
- GPU で 32K トークン以上を扱うなら基本的に付けるべきです。長文プロンプトで prefill 時間が 2〜3 倍短縮し、KV キャッシュ量子化(`-ctk q8_0 -ctv q8_0`)と併用すれば VRAM も 20〜40% 削減できます。ただし CPU-only 推論では効果が無く、GPU offload レイヤーが少ない場合(数レイヤーだけ GPU に載せる構成)は逆効果になるケースがあります。8B モデルの短文単発では体感差が出にくく、無理に付ける必要はありません。
- vLLM や SGLang は自動で Flash Attention を使いますか?
- はい、vLLM は既定で FA2 を使い、v0.6 以降は FA3 と PagedAttention の併用も選べます。SGLang と TGI(Text Generation Inference)も既定で Flash Attention 系バックエンドを有効化しています。ユーザーが明示的に指定する必要は基本ありません。強制的にバックエンドを切り替えたい場合のみ、vLLM なら環境変数 `VLLM_ATTENTION_BACKEND=FLASH_ATTN` / `XFORMERS` / `TORCH_SDPA` で選択できます。
- PyTorch の SDPA と Flash Attention は同じですか?
- 厳密には別物ですが、PyTorch 2.6 の `torch.nn.functional.scaled_dot_product_attention`(SDPA)は内部で Flash Attention 2 を呼び出します。標準的な用途ならユーザーは SDPA を呼ぶだけで FA2 の恩恵を受けられます。ただし FA3(Hopper 以降)や FP8 Attention は SDPA 経由では使えず、`flash-attn` パッケージを別途インストールする必要があります。xformers は Meta 独自の memory-efficient attention で、Flash Attention が対応しない古い GPU 向けの選択肢です。
- Flash Attention が効かないケースはありますか?
- 3 つあります。第1に CPU-only 推論:GPU の SRAM が無いので原理的に使えません。第2に短文単発の小さいモデル(8B 以下 + プロンプト 1K トークン以下):カーネル呼び出しのオーバーヘッドが上回るケースがあります。第3に Apple Silicon(M シリーズ):CUDA 実装の Flash Attention は動かず、MLX 側で相当機能を提供します。逆に効くのは、長文プロンプト(32K トークン超)、Vision-Language Model の画像トークン、QLoRA・SFT 学習、投機的デコードとの併用など、Attention 計算量が支配的なワークロードです。