上級 12 分最適化

Flash Attention 2:有効化(llama.cpp、Ollama、 vLLM)

Flash Attention 2 (FA2) は、長文脈のローカル LLM を使い物にならない状態から快適な状態に変える最適化技術です。Ollama では環境変数で、llama.cpp ではフラグで有効化でき、vLLM ではデフォルトで有効です。ただし、GPU が実際にサポートしている必要があります。このガイドでは、3つの主要ランタイムでこれを有効化する方法、コンテキストサイズに応じた実際の効果(KVキャッシュメモリとトークン/秒)を測定する方法、そして無意味なケースを特定する方法を示します。

著者 Mohamed Meguedmi·更新 2026-08-31·Windows・macOS・Linuxでテスト済み
i
要約
Flash Attention 2は、行列全体をメモリ上に展開する代わりに、GPUのSRAM内でアテンションをブロック単位で再計算します。計算結果は変わりません。 · OllamaではOLLAMA_FLASH_ATTENTION=1、llama.cppでは-faフラグで有効にでき、vLLMではバージョン0.2以降、デフォルトで有効です。 · 比較的新しいGPU(NVIDIA Ampere以降、またはROCm経由で利用するAMD RDNA 3/4)が必要です。Apple Siliconでは、Metalがすでに同等の処理を標準で行います。 · RTX 4090(Mistral Small 24B Q4_K_M、16kトークン)での実測:速度が28%向上し、VRAM使用量が2.8GB減少。

#なぜ 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倍になります。

i
FA2 についての誤解
これは圧縮ではありません。生成品質はビット単位で同一です(浮動小数点加算の順序による差を除く)。また、量子化(quantization)でもありません。FA2とKVキャッシュの量子化(例:Q8_0)は、組み合わせることができる2つの異なる最適化です。

#GPU およびソフトウェアの前提条件

ローカルAIキット

お使いのマシンで、プライベートかつ無料の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)が同等の処理を自動的に使用するため、有効化の操作は不要です。
!
精度要件:FP16またはBF16
FA2はFP32では動作しません。GGUFモデル(Q4_K_M、Q5_K_Mなど)は、アテンション計算時にFP16へ動的に逆量子化されるため、正常に動作します。ただし、FP32モデルを読み込む場合(推論ではまれです)は、FA2を無効にしてください。そうしないとランタイムに拒否されます。

#Ollama でFlash Attention 2を有効にする

Ollamaはバージョン0.3以降、環境変数によるFlash Attentionの利用に対応しています。古いグラフィックカードでは対応していない場合があるため、従来はデフォルトで有効になっていませんでした。ご自身で有効にしてください。

一時的な有効化(Linux/macOS)
OLLAMA_FLASH_ATTENTION=1 ollama serve

systemd を使って永続化する(一般的な Linux 環境の場合):

systemd drop-in
sudo systemctl edit ollama.service

# Dans l'éditeur, ajoutez :
[Service]
Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"

# Puis :
sudo systemctl daemon-reload
sudo systemctl restart ollama

Windows では、コントロール パネル > システム > 環境変数からユーザー環境変数を追加し、その後 Ollama を再起動してください。macOS では、launchctl setenv を使うか、シェルの rc ファイルに変数を追加してください。

→
KVキャッシュの量子化と併用してください
OLLAMA_KV_CACHE_TYPE=q8_0 は KV キャッシュを 8 ビットに量子化し、そのサイズをさらに半分に縮小します。品質の低下はほぼありません。FA2 と組み合わせることで、VRAM に収まるコンテキストサイズを 3 倍に拡大できます。q4_0 はさらにアグレッシブですが、推論モデルでは影響が見え始めます。

FA2が有効になっていることを確認するには、OLLAMA_DEBUG=1を設定してollamaを起動し、モデルの読み込み時のログでflash_attention=trueという行を探してください。

#llama.cpp で Flash Attention 2 を有効にする

llama.cppには、Ollamaよりも細かく制御できる明示的なフラグがあります。-fa(長い形式では--flash-attn)です。llama-cliでもllama-serverでも使用できます。

FA2を使用するllama-cli
./llama-cli -m models/mistral-small-24b-instruct-q4_k_m.gguf \
  --flash-attn \
  --ctx-size 32768 \
  -p "Résume ce document..."
llama-server と FA2 の組み合わせ
./llama-server -m models/mistral-small-24b-instruct-q4_k_m.gguf \
  -fa \
  --ctx-size 32768 \
  --cache-type-k q8_0 \
  --cache-type-v q8_0 \
  --host 0.0.0.0 --port 8080

フラグ --cache-type-k と --cache-type-v は、KVキャッシュのキーと値をそれぞれ量子化します。q8_0 は堅実な選択肢(品質低下がほぼない)で、q4_0 はより積極的に量子化する選択肢です。なお、KVキャッシュの量子化には FA2 を有効にする必要があります。-fa を指定しないと、これらのフラグは拒否されます。

i
コンパイルが必要です
llama.cppを-DGGML_CUDA=ONでコンパイルした場合、FA2は自動的に含まれます。VulkanベースのビルドではFA2のサポートは比較的新しく、成熟度が低いため、本番環境への展開前にテストを行ってください。Metal(macOS)ではFA2がネイティブで統合されており、-faフラグは受け入れられますが、実装はAppleのカーネルを経由します。

#vLLM で Flash Attention 2 を有効にする

vLLMはバージョン0.2以降、デフォルトでFlash Attention 2を使用し、Hopper(H100)とBlackwellでは可能な場合にFlashAttention-3へ切り替わります。通常、何かを有効にする必要はありません。操作が必要になるのは、バックエンドを強制的に指定する場合だけです。たとえば、比較を行う場合や、特殊なGPUで発生するバグを回避する場合が該当します。

Flash Attention バックエンドを強制する
VLLM_ATTENTION_BACKEND=FLASH_ATTN \
  vllm serve mistralai/Mistral-Small-24B-Instruct-2501 \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.90

利用可能なバックエンドは、FLASH_ATTN(FA2)、FLASHINFER(一部のサイズではさらに高速で、flashinferのインストールが必要)、XFORMERS(Ampereおよびそれ以前向けのフォールバック)、TORCH_SDPA(汎用フォールバック)です。比較的新しいGPUでは、FLASH_ATTNまたはFLASHINFERが適切な選択肢です。

→
Hopper / Blackwell向けのFlashInfer
H100/B200でQwen 3.6 35B以上のモデルを提供し、多数のリクエストを同時に処理する場合は、flashinferをインストールし、VLLM_ATTENTION_BACKEND=FLASHINFERに切り替えてください。FlashInferはvLLMのページ化されたKVキャッシュをより効率よく最適化するため、バッチ処理時のスループット向上を実測できます(負荷に応じて10〜20%)。

#コンテキストサイズ別に測定した性能向上

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に有利に働くためです。

i
ご自身の環境で測定してください
これらの数値は、おおよその目安です。アテンションヘッドのサイズ、モデルの量子化、GPUの動作周波数、ランタイムのバージョンによって、性能向上幅は±20%変動します。普段使うプロンプトを-faありとなしの両方で実行し、判断してください。

#効果がない(または悪影響を及ぼす)ケース

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が目標となります。
→
実際には選択する必要はありません
ランタイムが自動的に選択します。vLLMは検出されたGPUに応じて最適なバックエンドを選び、llama.cppは-faフラグで独自のFA2実装を使います。Ollamaも同様です。上記の違いが重要になるのは、PyTorchのコードを書く場合やファインチューニングを行う場合です。

#トラブルシューティング

フラグは無視されているようです(性能向上なし)
ランタイムのバージョンを確認してください(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の真価が発揮されるのは、複数のリクエストをバッチ処理するサーバー環境です。この環境では性能向上の幅が大きくなります。
Flash Attentionに関するよくある質問
2026年にllama.cppとLM StudioでFlash Attentionを有効にするにはどうすればよいですか?+
llama.cppでは、コマンドラインならフラグ -fa だけで有効にできます(サーバーでは --flash-attn on)。LM Studioでは現在、CUDA、Metal、Vulkanでデフォルトで有効になっています。古いバージョンをお使いの場合は、推論エンジンの設定で該当するオプションにチェックを入れてください。Ollamaでは、引き続き変数 OLLAMA_FLASH_ATTENTION=1 を使う、前述の方法で有効にします。
Flash Attention 3でローカルLLMに何か違いはありますか?+
一般向けGPUでは変わりません。FA3はデータセンター向けのHopper GPU(H100)と、その固有の命令を対象としています。一般向けのGPU(RTX 30/40/50、Mac、Radeon)では、llama.cppに組み込まれたFA2の実装によって性能が向上します。追加のフラグを指定する必要はありません。
使っているAMDカードでは、なぜFlash Attentionのほうが遅くなるのですか?+
ROCm/HIPの既知の落とし穴です。融合カーネルが使われるのは、KVキャッシュの二つの型が一致している場合だけです(たとえば、KとVの両方をq4_0にする場合)。q4_0 + f16のように異なる型を組み合わせると、警告は一切出ず、融合されていない低速な処理経路に切り替わります。二つの型を揃えて、ベンチマークを再実行してください。
Flash Attentionと量子化されたKVキャッシュを組み合わせることはできますか?+
NVIDIAでは可能です。ただし、llama.cppがFA_ALL_QUANTSを有効にしてコンパイルされていることが条件です。そうでない場合、アテンションの処理がCPU側に切り替わり、性能が大幅に低下します。Macでは、LM StudioがMetal経由でこの組み合わせを標準でサポートしています。判断に迷う場合は、キャッシュを量子化した場合と量子化しない場合のtok/sを比較してください。違いはすぐにわかります。
このガイドは役に立ちましたか?

ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。