コラム 比較

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 2 / 3 とは 2026:標準 Attention との違い・世代別対応・llama.cpp と vLLM での効き方を解説

結論: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 ステップです。

  1. Q × K^T を計算して N×N の attention matrix を作る
  2. Softmax を適用してスケーリングする
  3. 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/BF16FA3 FP16/BF16FA3 FP8
AmpereA100 / RTX 3090 / RTX 3060対応非対応非対応
AdaRTX 4090 / RTX 4080 / RTX 4070対応非対応非対応
HopperH100 / H200対応対応対応
BlackwellB200 / RTX 5090 / RTX PRO 6000 Blackwell対応対応対応(加速)
Apple SiliconM3 / 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 の参考リンクです。


あなたに合う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 計算量が支配的なワークロードです。