Flash Attention 2:有効化(llama.cpp、Ollama、 vLLM)
Flash Attention 2 (FA2) は、長文脈のローカル LLM を使い物にならない状態から快適な状態に変える最適化技術です。Ollama では環境変数で、llama.cpp ではフラグで有効化でき、vLLM ではデフォルトで有効です。ただし、GPU が実際にサポートしている必要があります。このガイドでは、3つの主要ランタイムでこれを有効化する方法、コンテキストサイズに応じた実際の効果(KVキャッシュメモリとトークン/秒)を測定する方法、そして無意味なケースを特定する方法を示します。
#なぜ Flash Attention 2 を使うのか
トランスフォーマーの従来のアテンションは、コンテキスト長に対して二次的なメモリ複雑度を持ちます。コンテキストを2倍にすると、アテンションが消費するVRAMは4倍になります。32kトークンにおいて、FP16の8Bモデルでは、アテンション行列だけでモデルの重みよりも大きくなる可能性があります。
Flash AttentionはTri Daoが2022年に導入し、2023年にFA2として改良したものです。数学的な結果は変えず、計算方法を変えます。HBM上に行列全体を展開する代わりに、GPUのSRAM内で直接、アテンションをブロック単位で処理する(タイリング)という考え方です。数値精度による差を除けば、結果は素朴なアテンション計算と完全に同一です。
具体的には、ローカルLLMの推論において、FA2は同時に2つの効果をもたらします。アテンションに使うメモリ量が、コンテキストサイズに対して二次関数的ではなくほぼ線形に増えるようになり(KVキャッシュが大幅に軽量化)、さらに、コストの高いメモリアクセスが排除されることで、長いコンテキストではスループットが2〜4倍になります。
#GPU およびソフトウェアの前提条件
お使いのマシンで、プライベートかつ無料のChatGPTを1時間で構築 — LM Studio、Ollama、Open WebUI、ご自身のドキュメント、クラウド不要。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 生涯アップデート
Flash Attention 2は、特定の世代のGPUにしかない専用の行列演算命令(Tensorコア)を利用します。まず何よりも先に、この条件を確認してください。
- NVIDIA Ampere(RTX 3000、A100)以降
- FA2 を完全にサポートし、高い性能を発揮します。最適な条件は Compute Capability 8.0 以上です。
- NVIDIA Ada Lovelace (RTX 4000) および Blackwell (RTX 5000)
- ネイティブサポートは最適です。RTX 4090 / 5090では、HopperクラスのTensorコアにより最大の性能向上が得られます。
- NVIDIA Turing (RTX 2000, T4)
- サポートは部分的で、速度も遅くなります。FA2は動作しますが、BF16命令の恩恵は受けられません。有効にして測定してください。効果がない場合もあれば、改善する場合もあります。
- NVIDIA Pascal(GTX 1080 Ti、P40)およびそれ以前の世代
- 非対応です。Tensor Coresを搭載していません。フラグは通知なしで無視されるか、実行時にエラーになります。
- AMD RDNA 3/4(RX 7000/9000)
- Flash Attention の公式移植版(composable_kernel)を使い、ROCm 経由で対応します。RX 7900 XTX およびそれ以上のクラスの GPU では、ネイティブ実装に近い性能を発揮します。
- Apple シリコン(M1 から M4)
- 厳密にはFlash Attention 2ではありません。Metalには独自の融合アテンションカーネルがあります。ランタイム(llama.cpp Metal、MLX)が同等の処理を自動的に使用するため、有効化の操作は不要です。
#Ollama でFlash Attention 2を有効にする
Ollamaはバージョン0.3以降、環境変数によるFlash Attentionの利用に対応しています。古いグラフィックカードでは対応していない場合があるため、従来はデフォルトで有効になっていませんでした。ご自身で有効にしてください。
systemd を使って永続化する(一般的な Linux 環境の場合):
Windows では、コントロール パネル > システム > 環境変数からユーザー環境変数を追加し、その後 Ollama を再起動してください。macOS では、launchctl setenv を使うか、シェルの rc ファイルに変数を追加してください。
FA2が有効になっていることを確認するには、OLLAMA_DEBUG=1を設定してollamaを起動し、モデルの読み込み時のログでflash_attention=trueという行を探してください。
#llama.cpp で Flash Attention 2 を有効にする
llama.cppには、Ollamaよりも細かく制御できる明示的なフラグがあります。-fa(長い形式では--flash-attn)です。llama-cliでもllama-serverでも使用できます。
フラグ --cache-type-k と --cache-type-v は、KVキャッシュのキーと値をそれぞれ量子化します。q8_0 は堅実な選択肢(品質低下がほぼない)で、q4_0 はより積極的に量子化する選択肢です。なお、KVキャッシュの量子化には FA2 を有効にする必要があります。-fa を指定しないと、これらのフラグは拒否されます。
#vLLM で Flash Attention 2 を有効にする
vLLMはバージョン0.2以降、デフォルトでFlash Attention 2を使用し、Hopper(H100)とBlackwellでは可能な場合にFlashAttention-3へ切り替わります。通常、何かを有効にする必要はありません。操作が必要になるのは、バックエンドを強制的に指定する場合だけです。たとえば、比較を行う場合や、特殊なGPUで発生するバグを回避する場合が該当します。
利用可能なバックエンドは、FLASH_ATTN(FA2)、FLASHINFER(一部のサイズではさらに高速で、flashinferのインストールが必要)、XFORMERS(Ampereおよびそれ以前向けのフォールバック)、TORCH_SDPA(汎用フォールバック)です。比較的新しいGPUでは、FLASH_ATTNまたはFLASHINFERが適切な選択肢です。
#コンテキストサイズ別に測定した性能向上
Flash Attention 2 による効果は、コンテキストの長さに大きく依存します。短いコンテキストでは効果はわずかで、タイリングのオーバーヘッドにより、かえって性能が低下する場合もあります。長いコンテキストでは、実行できるかどうかを左右します。以下は、RTX 4090 24GB で Mistral Small 24B Q4_K_M を使用した場合の、代表的な目安となる値です。
- 2kトークンのコンテキスト
- FA2なし:40トークン/秒、VRAM使用量14.6GB。FA2あり:41トークン/秒、14.4GB。向上幅:約2%。この規模では不要です。
- 8kトークンのコンテキスト
- FA2なし:36トークン/秒、16.2GB。FA2あり:39トークン/秒、15.0GB。改善:速度+8%、メモリ使用量–1.2GB。
- 16kトークンのコンテキスト
- FA2 なし:29トークン/秒、18.8 GB。FA2 あり:37トークン/秒、16.0 GB。改善幅:速度+28%、メモリ使用量−2.8 GB。
- 32kトークンのコンテキスト
- FA2 なし:OOM(24 GB 超)。FA2 あり:32トークン/秒、18.6 GB。FA2 により、32k のコンテキストが使えるようになります。
- 64kトークンのコンテキスト (FA2 + KV q8_0)
- 30 tok/s、21.5 GB。FA2を無効にし、KVを量子化しない場合:24 GBでは実現不可能です
Qwen 3.5 9B(より小型で、アテンションヘッドの次元が異なるモデル)では、32kでの速度向上は比較的控えめです(+15%)。アテンションが計算コスト全体に占める割合が小さいためです。より重い推論モデルの Qwen 3.8 27B では、16kでの速度向上は大幅です(+45%)。アテンションとフィードフォワードの比率がFA2に有利に働くためです。
#効果がない(または悪影響を及ぼす)ケース
- GPU Pascal / Maxwell
- GTX 1080 Ti、P40、Tesla M40、Titan X Maxwell。対応するTensor Coreはありません。Ollamaではフラグが無視され、最近のllama.cppでは拒否されます。速度向上は見込めません。xformersを使うか、こうした最適化を使わないでください。
- 非常に短い推論 (チャット 500トークン)
- 短いプロンプトに対していつも短い回答を生成する場合、FA2は何の利点もないまま数%のオーバーヘッドを追加します。特に1B〜3Bの小型モデルで目立ちます。
- CPU だけ
- FA2 はGPU向けの最適化です。llama.cpp(CPU版)ではこのフラグは無視されます。CPU向けの最適化は他の方法(ARM SVE、AVX-512など)を通じて行われます。
- 非標準のスライディングウィンドウアテンションを使うモデル
- Gemma 4(グローバルアテンションとローカルアテンションを交互に使用)や、スライディングウィンドウを使うMistralの派生モデルでは、ランタイムのバージョンによってFA2がフォールバックすることがあります。ログを確認してください。バックエンドがまだ対応していない場合もあります。
- Apple Silicon
- M1~M4ではllama.cppの-faフラグは受け付けられますが、実装にはMetalが使われ、Metal自体がすでに独自の最適化を行っています。Metalのアテンション処理は標準ですでに融合されているため、測定された性能向上はごくわずかです。
#FA2 と xformers と PyTorch SDPAの比較
ランタイムのドキュメントを読むと、これらの三つの名前に出会います。これらは完全に同じことをしているわけではなく、歴史も異なります。
- xformers (Meta, 2021)
- memory_efficient_attentionを含む効率的なカーネルライブラリ。Flash Attentionの先駆けです。より多くのアテンションの種類に対応しているため、現在もファインチューニング(Unsloth、Axolotl)で使われています。Ampere以降のGPUでの推論ではFA2より遅くなります。
- Flash Attention 2(Tri Dao、2023年)
- Flash Attention 1の後継です。推論と学習に特化し、手作業で書かれたCUDAカーネルを使用します。AmpereとHopperでは最も高速です。2026年時点で事実上の標準です。
- PyTorch SDPA
- torch.nn.functional.scaled_dot_product_attention。PyTorch 2.0以降では、可能であれば自動的にFlash Attention 2に、それ以外の場合はxformersに、それ以外の場合は基本的な実装にディスパッチします。これはvLLMや多くのランタイムが内部で使用する方法です。
- FlashAttention-3(Tri Dao + NVIDIA、2024)
- Hopper(H100)およびBlackwell GPU向けに特化しています。FP8とワープ特化による非対称性を活用します。H100で実行する場合、FA3はFA2を上回ります。一般消費者向けのRTXでは、引き続きFA2が目標となります。
#トラブルシューティング
- フラグは無視されているようです(性能向上なし)
- ランタイムのバージョンを確認してください(Ollama ≥ 0.3、llama.cppの比較的新しいコミット)。詳細ログを有効にしてください:OLLAMA_DEBUG=1またはllama-cli --verbose。ログ内でflash_attention=trueまたはflash_attn=enabledを探してください。
- 「unsupported head dimension」エラー
- 一部のヘッド次元(96、192)は、FA2 のバージョンによってはサポートされていません。ランタイムを更新するか、デフォルトのバックエンドに戻してください。主に特殊なモデルで問題になります。
- 品質の低下が目立つ
- FA2だけで品質が低下することは非常にまれです(結果は数学的に同等です)。品質の低下が見られる場合、原因はおそらくFA2ではなく、KVキャッシュの量子化です。--cache-type-k/vを無効にして、問題が続くかどうか確認してください。
- FA2が有効になってもOOM(メモリ不足)が発生します
- FA2はアテンションに必要なメモリを削減しますが、重みに必要なメモリは削減しません。30B Q5モデルが16 GBのVRAMに収まらない場合、FA2では解決できません。量子化レベルを一段下げてQ4_K_Mにするか、より小さいモデルを使用してください。
- vLLMがFA2ではなくxformersを使用する
- インストールを確認してください:pip install flash-attn --no-build-isolation。TuringではFA2の最適化が十分でないため、vLLMはxformersを優先します。これは想定どおりの動作です。
#さらに詳しく
Flash Attention 2 は、与えられたVRAM上で利用可能なコンテキストを拡張するための最初の選択肢です。さらに高度な最適化を追求する場合は、以下の関連ガイドが役立ちます。
- 2026年のGGUF量子化:Q4_K_M・Q5_K_M・Q6_Kの比較
- 定番の併用策です。モデルのサイズを小さくして VRAM を空け、FA2 と組み合わせることで、さらに長いコンテキストを扱えます。
- CUDA対応でllama.cppをコンパイルする
- llama.cppで最新バージョンのFA2を使い、適切にベンチマークを行いたい場合には必須です。
- vLLMの本番環境デプロイ
- FA2の真価が発揮されるのは、複数のリクエストをバッチ処理するサーバー環境です。この環境では性能向上の幅が大きくなります。
2026年にllama.cppとLM StudioでFlash Attentionを有効にするにはどうすればよいですか?+
Flash Attention 3でローカルLLMに何か違いはありますか?+
使っているAMDカードでは、なぜFlash Attentionのほうが遅くなるのですか?+
Flash Attentionと量子化されたKVキャッシュを組み合わせることはできますか?+
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。