Flash Attention
Belleği verimli kullanan attention ve -fa / OLLAMA_FLASH_ATTENTION
Attention'ı, N×N skor matrisini GPU belleğine hiç yazmadan, küçük bloklar hâlinde hesaplayan algoritma. Sonuç aynı, bellek trafiği çok daha az. Local inference'ta KV cache quantization'ın ön koşulu.
Standart attention, her token çifti için bir skor hesaplar ve bu N×N matrisi GPU'nun ana belleğine (HBM) yazıp geri okur. Bağlam uzadıkça hem bellek hem süre karesel büyür.
FlashAttention (Dao ve ark., 2022, arXiv 2205.14135) aynı sonucu yaklaşıklık olmadan üretir, ama hesabı çip üstündeki küçük ve hızlı belleğe (SRAM) sığan bloklara böler (tiling). Tam matris hiç oluşturulmaz; HBM'e yapılan okuma/yazma sayısı düşer. Devamı: FlashAttention-2 (2023, daha iyi iş bölümü, ~2× hız) ve FlashAttention-3 (2024, Hopper GPU'lar ve FP8).
Local motorlarda (Ekim 2026 itibarıyla):
| Motor | Ayar | Default |
|---|---|---|
| llama.cpp | -fa / --flash-attn (on, off, auto) | auto |
| Ollama | OLLAMA_FLASH_ATTENTION=1 / =0 | Backend ve cihaz destekliyorsa otomatik |
| llama.cpp KV cache | -ctk / -ctv (--cache-type-k/-v) | f16 |
| Ollama KV cache | OLLAMA_KV_CACHE_TYPE | f16 |
llama.cpp burada Dao'nun kütüphanesini değil, ggml içindeki kendi
FLASH_ATTN_EXT kernel'ini kullanır.
KV cache bağımlılığı: llama.cpp'de quantize edilmiş V cache
Flash Attention olmadan çalışmaz. -fa auto iken llama.cpp FA'yı
kendisi açar; -fa off iken "quantized V cache requires flash_attn"
hatasıyla model yüklenmez. Ollama dokümanı da KV cache
quantization'ını "Flash Attention açıkken" çalışan bir özellik olarak
tanımlar.
Büyük bir tabloyu toplamak için iki yol. Birincisi: tüm ara sonuçları depodaki (HBM) dev bir kâğıda yaz, sonra geri gidip oku. İkincisi: masandaki (SRAM) küçük bir not defterinde parça parça topla, depoya sadece sonucu götür. Sonuç aynı; ikincisinde depoya çok daha az gidip gelirsin.
16 GB VRAM'li bir GPU'da 8B Q4 model, 32K bağlamla çalışacak. f16 KV cache tek başına ~4 GB tutuyor (bkz. num_ctx).
Ollama dokümanındaki oranlarla KV cache tipleri:
OLLAMA_KV_CACHE_TYPE | Bellek (f16'ya göre) | Kalite |
|---|---|---|
f16 (default) | 1× | Tam hassasiyet |
q8_0 | ~1/2 | Çok küçük kayıp, çoğu zaman fark edilmez |
q4_0 | ~1/4 | Küçük-orta kayıp, uzun bağlamda belirginleşebilir |
q8_0 ile cache ~2 GB'a iner; aynı VRAM'e iki kat bağlam sığar.
``
OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0 ollama serve
``
# Yeni kurulum (llama.app): llama serve
# Eski binary adıyla: llama-server
llama serve -hf ggml-org/Qwen3.5-0.8B-GGUF \
-c 32768 \
-fa on \
-ctk q8_0 \
-ctv q8_0
# -fa off + quantize V cache = model yüklenmez# macOS uygulaması
launchctl setenv OLLAMA_FLASH_ATTENTION "1"
launchctl setenv OLLAMA_KV_CACHE_TYPE "q8_0"
# Ollama'yı yeniden başlat. Bu ayar global: tüm modeller q8_0 cache kullanır.- Uzun bağlam (16K+) — attention'ın bellek ve süre maliyeti en çok burada hissedilir
- KV cache'i quantize etmek istiyorsan — q8_0/q4_0 V cache için şart
- VRAM'e sığmayan bir num_ctx'i sığdırmaya çalışırken
-
Desteklenen bir GPU'da — çoğu durumda
autozaten açar, elle bir şey yapmana gerek kalmaz
- Backend ya da model desteklemiyorsa — örneğin llama.cpp Grok mimarisinde FA'yı zorla kapatır
-
Bir sürümde FA ile hatalı ya da yavaş çıktı görüyorsan —
-fa off/OLLAMA_FLASH_ATTENTION=0ile karşılaştır - Kısa prompt'lu basit işler — kazanç küçük kalır
FA'yı kapatıp cache'i quantize etmek
llama.cpp'de -fa off -ctv q8_0 kombinasyonu 'quantized V cache requires flash_attn to be enabled' hatasıyla model yüklemeyi durdurur. Ollama'da OLLAMA_FLASH_ATTENTION=0 ile birlikte OLLAMA_KV_CACHE_TYPE=q8_0 kullanmak da aynı sorunu çağırır.
Global KV cache ayarı
OLLAMA_KV_CACHE_TYPE tüm modellere uygulanır. Ollama dokümanına göre GQA oranı yüksek modeller (örn. Qwen2) cache quantization'ından daha çok etkilenebilir. Kritik bir model kalite kaybediyorsa f16'ya dön.
'Flash Attention ağırlıkları küçültür' sanmak
FA model ağırlıklarına dokunmaz; attention hesabının bellek trafiğini azaltır. Ağırlıkları küçültmek quantization işi, cache'i küçültmek ise KV cache tipi ayarının işi.