Flash Attention 2: attivarla (llama.cpp, Ollama, vLLM)
Flash Attention 2 (FA2) è l'ottimizzazione che rende agevole l'uso di un LLM locale con un contesto lungo, altrimenti inutilizzabile. Si attiva tramite una variabile d'ambiente in Ollama e un flag in llama.cpp, mentre è attivo per impostazione predefinita in vLLM — a condizione che la tua GPU lo supporti davvero. Questa guida mostra come attivarlo nei tre principali runtime, misurare il beneficio reale (memoria della cache KV e token/sec) in base alla dimensione del contesto e individuare i casi in cui non serve a nulla.
#Perché Flash Attention 2
L'attenzione classica di un transformer ha una complessità spaziale quadratica in funzione della lunghezza del contesto. Raddoppiare il contesto quadruplica la VRAM consumata dall'attenzione. A 32k token, su un modello 8B in FP16, la sola matrice di attenzione può occupare più memoria dei pesi del modello.
Flash Attention, introdotta da Tri Dao nel 2022 e poi perfezionata in FA2 nel 2023, non cambia il risultato matematico: cambia il modo in cui viene calcolato. L'idea è elaborare l'attenzione per blocchi (tiling) direttamente nella SRAM della GPU anziché materializzare la matrice completa in HBM. Il risultato è identico a quello dell'implementazione naïve dell'attenzione, salvo le differenze dovute alla precisione numerica.
In pratica, durante l'inferenza con un LLM locale, FA2 offre due vantaggi che si sommano: la memoria dedicata all'attenzione cresce in modo quasi lineare rispetto alla dimensione del contesto anziché quadratico (cache KV notevolmente alleggerita), e il throughput aumenta da 2 a 4 volte sui contesti lunghi perché vengono eliminati i costosi accessi alla memoria.
#Prerequisiti GPU e software
Il tuo ChatGPT privato e gratuito sulla tua macchina in 1 ora — LM Studio, Ollama, Open WebUI, i tuoi documenti, senza cloud.
- Spazio online a vita
- PDF + file
- Aggiornamenti a vita
Flash Attention 2 utilizza istruzioni matriciali specifiche (tensor cores) che esistono solo su certe generazioni di GPU. È il primo criterio da verificare prima di tutto.
- NVIDIA Ampere (RTX 3000, A100) e successivi
- Supporto completo e performante per FA2. È il punto ideale: compute capability 8.0+
- NVIDIA Ada Lovelace (RTX 4000) e Blackwell (RTX 5000)
- Supporto nativo ottimale. Massimi guadagni su RTX 4090 / 5090 grazie ai tensor cores Hopper-class.
- NVIDIA Turing (RTX 2000, T4)
- Supporto parziale e più lento. FA2 funziona ma non beneficia delle istruzioni BF16. Attivalo e misura: l'effetto è a volte neutro, a volte positivo.
- NVIDIA Pascal (GTX 1080 Ti, P40) e generazioni precedenti
- Non supportato. I tensor cores non esistono. L'opzione viene ignorata silenziosamente o genera un errore all'esecuzione.
- AMD RDNA 3/4 (RX 7000/9000)
- Supporto tramite ROCm con il porting ufficiale di Flash Attention (composable_kernel). Prestazioni vicine a quelle native sulla RX 7900 XTX e sui modelli di fascia superiore.
- Apple Silicon (da M1 a M4)
- Non si tratta di Flash Attention 2 in senso stretto. Metal ha i propri kernel di attenzione fusa. I runtime (llama.cpp Metal, MLX) usano automaticamente l'equivalente: non devi attivare nulla.
#Attivare Flash Attention 2 in Ollama
Dalla versione 0.3, Ollama supporta Flash Attention tramite una variabile d'ambiente. Storicamente non è attivata per impostazione predefinita, perché le schede più vecchie potrebbero non supportarla. Sta a te attivarla.
Per renderlo persistente tramite systemd (situazione comune su Linux):
Su Windows, aggiungi la variabile d'ambiente utente tramite Pannello di controllo > Sistema > Variabili d'ambiente, poi riavvia Ollama. Su macOS, usa launchctl setenv o aggiungi la variabile nel file rc della tua shell.
Per verificare che FA2 sia attivo, avvia ollama con OLLAMA_DEBUG=1 e cerca la riga flash_attention=true nei log al caricamento del modello.
#Attivare Flash Attention 2 in llama.cpp
llama.cpp offre un flag esplicito che consente un maggiore controllo rispetto a Ollama: -fa (o --flash-attn nella forma lunga). Si utilizza sia con llama-cli sia con llama-server.
I flag --cache-type-k e --cache-type-v quantizzano rispettivamente le chiavi e i valori della cache KV. q8_0 è una scelta affidabile (perdita quasi nulla), q4_0 è l'opzione aggressiva. Nota che la quantizzazione della cache KV richiede FA2 attivato: senza -fa, questi flag vengono rifiutati.
#Attivare Flash Attention 2 in vLLM
vLLM utilizza per impostazione predefinita Flash Attention 2 dalla versione 0.2 e passa a FlashAttention-3 su Hopper (H100) e Blackwell quando è possibile. In generale non hai nulla da attivare. L'unico caso in cui devi intervenire è per forzare un backend, ad esempio per fare un confronto o per aggirare un bug su una GPU poco comune.
I backend disponibili sono FLASH_ATTN (FA2), FLASHINFER (ancora più veloce su certe dimensioni, richiede l'installazione di flashinfer), XFORMERS (fallback per Ampere e architetture precedenti) e TORCH_SDPA (fallback generico). Su GPU recenti, FLASH_ATTN o FLASHINFER sono le scelte giuste.
#Guadagno misurato in base alla dimensione del contesto
Il vantaggio di Flash Attention 2 dipende fortemente dalla dimensione del contesto. Con un contesto breve, è marginale o addirittura negativo (overhead del tiling). Con un contesto lungo, fa la differenza tra riuscire a eseguire il modello e non riuscirci. Ecco alcuni ordini di grandezza rappresentativi su RTX 4090 da 24 GB con Mistral Small 24B Q4_K_M.
- Contesto 2k token
- Senza FA2: 40 tok/s, 14,6 GB VRAM. Con FA2: 41 tok/s, 14,4 GB. Guadagno: ~2%. Inutile a questo livello.
- Contesto 8k token
- Senza FA2: 36 tok/s, 16,2 GB. Con FA2: 39 tok/s, 15,0 GB. Guadagno: +8% di velocità, –1,2 GB.
- Contesto 16k token
- Senza FA2: 29 tok/s, 18,8 GB. Con FA2: 37 tok/s, 16,0 GB. Guadagno: +28% velocità, –2,8 GB.
- Contesto di 32k token
- Senza FA2: OOM (>24 GB). Con FA2: 32 tok/s, 18,6 GB. FA2 rende semplicemente il contesto 32k accessibile.
- Contesto 64k token (FA2 + KV q8_0)
- 30 tok/s, 21,5 GB. Senza FA2 e senza quantizzazione KV: impossibile su 24 GB.
Su Qwen 3.5 9B (modello più piccolo, con una dimensione diversa delle teste di attenzione), il guadagno a 32k è più modesto (+15% di velocità) perché l'attenzione incide meno sul costo totale. Su Qwen 3.8 27B, un modello di ragionamento più pesante, il guadagno a 16k è enorme (+45%) perché il rapporto tra attenzione e feedforward favorisce FA2.
#Casi in cui non aiuta (o peggiora la situazione)
- GPU Pascal / Maxwell
- GTX 1080 Ti, P40, Tesla M40, Titan X Maxwell. Nessun tensor core compatibile. L'opzione è ignorata su Ollama, rifiutata su llama.cpp recente. Nessun vantaggio possibile — usa xformers o niente.
- Inferenza molto breve (chat da 500 token)
- Se generi sistematicamente risposte brevi a prompt brevi, FA2 aggiunge un overhead di qualche punto percentuale senza apportare alcun beneficio. È particolarmente evidente sui piccoli modelli da 1B a 3B.
- Solo CPU
- FA2 è un'ottimizzazione GPU. Su llama.cpp CPU, l'opzione è ignorata. Le ottimizzazioni CPU vanno per altre vie (ARM SVE, AVX-512, ecc.).
- Modelli con attenzione a finestra scorrevole non standard
- Gemma 4 (alternanza tra attenzione globale e locale) e le varianti Mistral con finestra scorrevole: a seconda della versione del runtime, FA2 può ricorrere a un meccanismo di fallback. Controlla i log: a volte è il backend a non supportarlo ancora.
- Apple Silicon
- Su M1-M4, il flag -fa di llama.cpp è accettato, ma l'implementazione passa attraverso Metal, che effettua già le proprie ottimizzazioni. Il guadagno misurato è marginale perché l'attenzione in Metal è già fusa nativamente.
#FA2 vs xformers vs PyTorch SDPA
Incontrerai questi tre nomi leggendo la documentazione dei runtime. Non fanno esattamente la stessa cosa e non hanno la stessa età.
- xformers (Meta, 2021)
- Libreria di kernel efficienti che include memory_efficient_attention. Precursore di Flash Attention. Ancora utilizzata nel fine-tuning (Unsloth, Axolotl) perché supporta più varianti di attenzione. Più lenta di FA2 in inferenza su Ampere+.
- Flash Attention 2 (Tri Dao, 2023)
- Successore di Flash Attention 1. Specializzato nell'inferenza e nell'addestramento, con kernel CUDA scritti a mano, il più veloce su Ampere e Hopper. Standard di fatto nel 2026.
- PyTorch SDPA
- torch.nn.functional.scaled_dot_product_attention. Da PyTorch 2.0, seleziona automaticamente Flash Attention 2 quando è possibile, altrimenti xformers e, in ultima istanza, l'implementazione naïve. È ciò che vLLM e molti runtime usano internamente.
- FlashAttention-3 (Tri Dao + NVIDIA, 2024)
- Specifico per le GPU Hopper (H100) e Blackwell. Sfrutta FP8 e l'asimmetria con specializzazione dei warp. Se usi un H100, FA3 supera FA2. Sulle RTX consumer, FA2 resta la scelta da puntare.
#Risoluzione dei problemi
- Il flag sembra ignorato (nessun vantaggio)
- Verifica la versione del runtime (Ollama ≥ 0.3, commit recente di llama.cpp). Abilita i log dettagliati: OLLAMA_DEBUG=1 o llama-cli --verbose. Cerca flash_attention=true o flash_attn=enabled.
- Errore unsupported head dimension
- Alcune dimensioni delle teste (96, 192) non sono supportate da tutte le versioni di FA2. Aggiorna il runtime o torna al backend predefinito. Il problema riguarda soprattutto i modelli esotici.
- Calo visibile della qualità
- Molto raro con il solo FA2 (risultato matematicamente equivalente). Se noti un peggioramento, è probabilmente dovuto alla quantizzazione della cache KV, non a FA2. Disattiva --cache-type-k/v e verifica se il problema persiste.
- OOM anche con FA2 attivato
- FA2 riduce la memoria usata dall'attenzione, non quella dei pesi. Se il tuo modello 30B Q5 non entra in 16 GB di VRAM, FA2 non aiuta. Scendi di un livello di quantizzazione (Q4_K_M) o usa un modello più piccolo.
- vLLM ripiega su xformers invece di FA2
- Verifica l'installazione: pip install flash-attn --no-build-isolation. Su Turing, vLLM preferisce xformers perché FA2 vi è meno ottimizzato. È un comportamento previsto.
#Per approfondire
Flash Attention 2 è la prima opzione da considerare per estendere il contesto utilizzabile con una determinata quantità di VRAM. Se vuoi spingerti oltre nell'ottimizzazione, queste guide correlate sono un buon complemento:
- Quantizzazione GGUF nel 2026: Q4_K_M vs Q5_K_M vs Q6_K
- L'abbinamento naturale: ridurre le dimensioni del modello per liberare VRAM, da combinare con FA2 per gestire contesti più lunghi.
- Compilare llama.cpp con CUDA
- Indispensabile se vuoi la versione più recente di FA2 in llama.cpp ed eseguire benchmark correttamente.
- Mettere vLLM in produzione
- FA2 dà il meglio di sé su un server che gestisce più richieste in batch: è lì che il guadagno aumenta enormemente.
Come abilitare Flash Attention in llama.cpp e LM Studio nel 2026?+
Flash Attention 3 cambia qualcosa per un LLM locale?+
Perché Flash Attention è più lento sulla mia scheda AMD?+
Posso combinare Flash Attention e cache KV quantizzata?+
Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.