Avanzado 12 minOptimización

Flash Attention 2: activarlo (llama.cpp, Ollama, vLLM)

Flash Attention 2 (FA2) es la optimización que hace que un LLM local con un contexto largo pase de ser inutilizable a resultar cómodo de usar. Se activa mediante una variable de entorno en Ollama, una opción de línea de comandos en llama.cpp y está activado por defecto en vLLM; eso sí, tu GPU debe ser realmente compatible. Esta guía muestra cómo activarlo en los tres principales entornos de ejecución, medir la mejora real (memoria de la caché KV y tokens/segundo) según el tamaño del contexto e identificar los casos en los que no sirve de nada.

Por Mohamed Meguedmi·Actualización 2026-08-31·Probado en Windows, macOS y Linux
i
En resumen
Flash Attention 2 recalcula la atención por bloques en la SRAM de la GPU en lugar de materializar toda la matriz, sin cambiar el resultado. · Se activa con OLLAMA_FLASH_ATTENTION=1 en Ollama, con la opción -fa en llama.cpp y por defecto desde la versión 0.2 en vLLM. · Requiere una GPU reciente (NVIDIA Ampere o posterior, AMD RDNA 3/4 mediante ROCm); en Apple Silicon, Metal ya gestiona el equivalente de forma nativa. · Mejora medida en RTX 4090 (Mistral Small 24B Q4_K_M, 16k tokens): +28 % de velocidad y -2,8 GB de VRAM.

#¿Por qué Flash Attention 2?

La atención clásica de un transformador tiene una complejidad de memoria cuadrática en función de la longitud del contexto. Duplicar el contexto cuadruplica la VRAM consumida por la atención. A 32k tokens, en un modelo de 8B en FP16, la matriz de atención sola puede pesar más que los pesos del modelo.

Flash Attention, introducido por Tri Dao en 2022 y perfeccionado en FA2 en 2023, no cambia el resultado matemático: cambia la forma de calcularlo. La idea es procesar la atención por bloques (tiling) directamente en la SRAM de la GPU en lugar de materializar la matriz completa en HBM. El resultado es estrictamente idéntico al de la implementación ingenua de la atención, salvo por las diferencias de precisión numérica.

En concreto, durante la inferencia con un LLM local, FA2 aporta dos beneficios que se acumulan: la memoria dedicada a la atención pasa a crecer de forma casi lineal con el tamaño del contexto en lugar de cuadrática (la caché KV se reduce considerablemente), y la tasa de procesamiento aumenta entre 2 y 4 veces en contextos largos porque se eliminan los costosos accesos a memoria.

i
Lo que FA2 no es
No es una compresión. La calidad de generación es idéntica bit a bit (salvo por el orden de las sumas en coma flotante). Tampoco es una cuantización: FA2 y la cuantización del caché KV (por ejemplo, Q8_0) son dos optimizaciones distintas que puedes combinar.

#Requisitos de GPU y software

El kit de IA Local

Tu ChatGPT privado y gratuito en tu máquina en 1 hora — LM Studio, Ollama, Open WebUI, tus documentos, sin nube.

  • Espacio en línea de por vida
  • PDF + archivos
  • Reembolsado 30 j

Flash Attention 2 utiliza instrucciones matriciales específicas (tensor cores) que solo existen en ciertas generaciones de GPU. Es el primer criterio que debes comprobar antes de cualquier otra cosa.

NVIDIA Ampere (RTX 3000, A100) y más recientes
Compatibilidad completa con FA2 y buen rendimiento. Es el punto ideal: compute capability 8.0+.
NVIDIA Ada Lovelace (RTX 4000) y Blackwell (RTX 5000)
Soporte nativo óptimo. Ganancias máximas en RTX 4090 / 5090 gracias a los tensor cores de clase Hopper.
NVIDIA Turing (RTX 2000, T4)
Soporte parcial y más lento. FA2 funciona, pero no aprovecha las instrucciones BF16. Actívalo, mide: a veces neutro, a veces positivo.
NVIDIA Pascal (GTX 1080 Ti, P40) y anterior
No compatible. No hay núcleos tensoriales. El parámetro se ignora sin avisar o produce un error durante la ejecución.
AMD RDNA 3/4 (RX 7000/9000)
Compatibilidad mediante ROCm con la adaptación oficial de Flash Attention (composable_kernel). Rendimiento cercano al nativo en la RX 7900 XTX y en modelos superiores.
Apple Silicon (M1 a M4)
No hay Flash Attention 2 en sentido estricto. Metal tiene sus propios kernels de atención fusionada. Los runtimes (llama.cpp Metal, MLX) los usan automáticamente, no necesitas activar nada.
!
Precisión requerida: FP16 o BF16
FA2 no funciona en FP32. Los modelos GGUF (Q4_K_M, Q5_K_M, etc.) se descuantizan sobre la marcha a FP16 para la atención, así que funciona. Pero si cargas un modelo en FP32 (caso raro en inferencia), desactiva FA2 o el runtime lo rechazará.

#Activar Flash Attention 2 en Ollama

Desde la versión 0.3, Ollama admite Flash Attention mediante una variable de entorno. Históricamente, no se ha activado de forma predeterminada porque las tarjetas antiguas pueden no ser compatibles. Te corresponde activarlo.

Activación puntual (Linux/macOS)
OLLAMA_FLASH_ATTENTION=1 ollama serve

Para hacerlo persistente mediante systemd (caso común en 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

En Windows, añade la variable de entorno de usuario a través de Panel de control > Sistema > Variables de entorno y luego reinicia Ollama. En macOS, utiliza launchctl setenv o añade la variable al archivo rc de tu shell.

→
Combínalo con la cuantización de la caché KV
OLLAMA_KV_CACHE_TYPE=q8_0 cuantiza la caché KV a 8 bits, reduciendo de nuevo su tamaño a la mitad con una pérdida de calidad casi nula. Combinado con FA2, puedes triplicar el tamaño del contexto que cabe en tu VRAM. q4_0 es aún más agresivo, pero su efecto empieza a notarse en los modelos de razonamiento.

Para verificar que FA2 esté activo, ejecuta ollama con OLLAMA_DEBUG=1 y busca la línea flash_attention=true en los logs al cargar el modelo.

#Activar Flash Attention 2 en llama.cpp

llama.cpp ofrece una opción explícita, más controlable que en Ollama: -fa (o --flash-attn en su forma larga). Se utiliza tanto con llama-cli como con llama-server.

llama-cli con FA2
./llama-cli -m models/mistral-small-24b-instruct-q4_k_m.gguf \
  --flash-attn \
  --ctx-size 32768 \
  -p "Résume ce document..."
llama-server con 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

Las opciones --cache-type-k y --cache-type-v cuantizan respectivamente las claves y los valores de la caché KV. q8_0 es una apuesta segura (pérdida casi nula), mientras que q4_0 es la opción agresiva. Ten en cuenta que la cuantización de la caché KV requiere que FA2 esté activado: sin -fa, estas opciones se rechazan.

i
Compilación requerida
Si compilaste llama.cpp con -DGGML_CUDA=ON, FA2 se incluye automáticamente. En las compilaciones con Vulkan, el soporte de FA2 es más reciente y menos maduro: pruébalo antes de ponerlo en producción. Con Metal (macOS), FA2 está integrado de forma nativa; se acepta la opción -fa, pero la implementación utiliza los kernels de Apple.

#Activar Flash Attention 2 en vLLM

vLLM utiliza Flash Attention 2 por defecto desde la versión 0.2 y pasa a FlashAttention-3 en Hopper (H100) y Blackwell cuando es posible. Generalmente no necesitas activar nada. El único caso en el que debes intervenir es para forzar un backend, por ejemplo para comparar o para sortear un error en una GPU poco habitual.

Forzar el backend Flash Attention
VLLM_ATTENTION_BACKEND=FLASH_ATTN \
  vllm serve mistralai/Mistral-Small-24B-Instruct-2501 \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.90

Los backends disponibles son FLASH_ATTN (FA2), FLASHINFER (aún más rápido para ciertos tamaños, requiere instalar flashinfer), XFORMERS (alternativa para Ampere y generaciones anteriores) y TORCH_SDPA (alternativa genérica). En GPU recientes, FLASH_ATTN o FLASHINFER son buenas opciones.

→
FlashInfer en Hopper / Blackwell
Si sirves Qwen 3.6 35B o más en H100/B200 con muchas peticiones concurrentes, instala flashinfer y establece VLLM_ATTENTION_BACKEND=FLASHINFER. El aumento del rendimiento al procesar por lotes es medible (10–20 % según la carga) porque FlashInfer optimiza mejor las cachés KV paginadas de vLLM.

#Ganancia medida por tamaño de contexto

La mejora que aporta Flash Attention 2 depende enormemente del tamaño del contexto. Con un contexto corto, es marginal o incluso negativa (sobrecarga del tiling). Con un contexto largo, marca la diferencia entre poder ejecutarse o no. Estos son algunos órdenes de magnitud representativos en una RTX 4090 de 24 GB con Mistral Small 24B Q4_K_M.

Contexto de 2k tokens
Sin FA2: 40 tok/s, 14,6 GB VRAM. Con FA2: 41 tok/s, 14,4 GB. Aumento: ~2%. Inútil a esta escala.
Contexto de 8k tokens
Sin FA2: 36 tok/s, 16.2 GB. Con FA2: 39 tok/s, 15.0 GB. Ganancia: +8% de velocidad, –1.2 GB.
Contexto de 16k tokens
Sin FA2: 29 tok/s, 18,8 GB. Con FA2: 37 tok/s, 16,0 GB. Ganancia: +28% de velocidad, –2,8 GB.
Contexto de 32k tokens
Sin FA2: OOM (>24 GB). Con FA2: 32 tok/s, 18.6 GB. FA2 hace simplemente accesible el contexto de 32k.
Contexto de 64k tokens (FA2 + KV q8_0)
30 tok/s, 21,5 GB. Sin FA2 + sin cuantización KV: imposible en 24 GB.

Con Qwen 3.5 9B (un modelo más pequeño, con una dimensión diferente de las cabezas de atención), la mejora a 32k es más modesta (+15 % de velocidad) porque la atención representa una parte menor del coste total. Con Qwen 3.8 27B, un modelo de razonamiento más pesado, la mejora a 16k es enorme (+45 %) porque la relación entre atención y feedforward favorece a FA2.

i
Mide en tu propio equipo
Estas cifras sirven para hacerse una idea del orden de magnitud. El tamaño de las cabezas de atención, la cuantización del modelo, la frecuencia de la GPU y la versión del runtime hacen que la mejora varíe en ±20 %. Ejecuta tu prompt habitual con y sin -fa para decidir.

#Casos en los que no ayuda (o empeora)

GPU Pascal / Maxwell
GTX 1080 Ti, P40, Tesla M40, Titan X Maxwell. Sin núcleos tensoriales compatibles. La opción se ignora en Ollama y se rechaza en las versiones recientes de llama.cpp. No se puede obtener ninguna mejora: usa xformers o nada.
Inferencia muy corta (chat 500 tokens)
Si generas sistemáticamente respuestas cortas a prompts cortos, FA2 añade una sobrecarga de un pequeño porcentaje sin aportar nada. Se nota especialmente en modelos pequeños de 1B-3B.
Solo CPU
FA2 es una optimización para GPU. En llama.cpp en CPU, la opción se ignora. Las optimizaciones para CPU pasan por otros caminos (ARM SVE, AVX-512, etc.).
Modelos con atención de ventana deslizante no estándar
Gemma 4 (alternancia entre atención global y local) y las variantes de Mistral con ventana deslizante: según la versión del entorno de ejecución, FA2 puede recurrir a una alternativa de respaldo. Revisa los logs; a veces es el backend el que aún no lo admite.
Apple Silicon
En M1-M4, se acepta la opción -fa de llama.cpp, pero la implementación pasa por Metal, que ya realiza sus propias optimizaciones. La mejora medida es marginal porque la atención de Metal ya está fusionada de forma nativa.

#FA2 vs xformers vs PyTorch SDPA

Encontrarás estos tres nombres al leer la documentación de los runtimes. No hacen exactamente lo mismo ni tienen la misma antigüedad.

xformers (Meta, 2021)
Biblioteca de kernels eficientes que incluye memory_efficient_attention. Precursora de Flash Attention. Todavía se utiliza en fine-tuning (Unsloth, Axolotl) porque admite más variantes de atención. Más lenta que FA2 en inferencia sobre Ampere+.
Flash Attention 2 (Tri Dao, 2023)
Sucesor de Flash Attention 1. Especializado en inferencia y entrenamiento, con kernels CUDA escritos a mano, el más rápido en Ampere y Hopper. Estándar de facto en 2026.
PyTorch SDPA
torch.nn.functional.scaled_dot_product_attention. Desde PyTorch 2.0, redirige automáticamente hacia Flash Attention 2 cuando es posible, de lo contrario hacia xformers, de lo contrario hacia la implementación básica. Es lo que vLLM y muchos runtimes utilizan internamente.
FlashAttention-3 (Tri Dao + NVIDIA, 2024)
Específico para las GPU Hopper (H100) y Blackwell. Aprovecha FP8 y la asimetría con especialización de warps. Si usas H100, FA3 supera a FA2. En las RTX de consumo, FA2 sigue siendo la opción a la que apuntar.
→
En la práctica, no tienes que elegir
El runtime decide por ti: vLLM elige el mejor backend según la GPU detectada, llama.cpp utiliza su propia implementación de FA2 mediante la opción -fa y Ollama hace lo mismo. Las distinciones anteriores importan cuando escribes código PyTorch o realizas un ajuste fino.

#Solución de problemas

Parece que se ignora el flag (sin mejora)
Verifica la versión del runtime (Ollama ≥ 0.3, commit reciente de llama.cpp). Activa los logs verbosos: OLLAMA_DEBUG=1 o llama-cli --verbose. Busca flash_attention=true o flash_attn=enabled.
Error unsupported head dimension
Algunas dimensiones de cabezas (96, 192) no son compatibles con todas las versiones de FA2. Actualiza el runtime o vuelve al backend predeterminado. Especialmente relevante para modelos exóticos.
Disminución de calidad visible
Muy raro con FA2 solo (resultado matemáticamente equivalente). Si ves una degradación, probablemente sea la cuantización del caché KV, no FA2. Desactiva --cache-type-k/v y verifica si el problema persiste.
OOM a pesar de tener FA2 activado
FA2 reduce la memoria de atención, no la de los pesos. Si tu modelo de 30B Q5 no cabe en 16 GB de VRAM, FA2 no ayuda. Desciende un nivel de cuantización (Q4_K_M) o usa un modelo más pequeño.
vLLM utiliza xformers en lugar de FA2
Verifica la instalación: pip install flash-attn --no-build-isolation. En Turing, vLLM prefiere xformers porque FA2 está menos optimizado para esa arquitectura. Es lo esperado.

#Para ir más allá

Flash Attention 2 es la primera opción para ampliar el contexto utilizable con una cantidad determinada de VRAM. Si quieres ir más allá en la optimización, estas guías relacionadas son un buen complemento:

Cuantización GGUF en 2026: Q4_K_M vs Q5_K_M vs Q6_K
El complemento evidente: reducir el tamaño del modelo para liberar VRAM y combinar esta reducción con FA2 para ampliar el contexto.
Compilar llama.cpp con CUDA
Indispensable si quieres la versión más reciente de FA2 en llama.cpp y realizar pruebas de rendimiento correctamente.
Desplegar vLLM en producción
FA2 cobra pleno sentido en un servidor que procesa múltiples solicitudes por lotes: ahí es donde la mejora se dispara.
Preguntas frecuentes sobre Flash Attention
¿Cómo activar Flash Attention en llama.cpp y en LM Studio en 2026?+
En llama.cpp, la opción -fa basta en la línea de comandos (o --flash-attn on para el servidor). LM Studio la activa ahora por defecto en CUDA, Metal y Vulkan: si tu versión es más antigua, marca la opción en la configuración del motor de inferencia. En Ollama, la variable OLLAMA_FLASH_ATTENTION=1 sigue siendo el método descrito anteriormente.
¿Flash Attention 3 cambia algo para un LLM local?+
No para el hardware de consumo: FA3 está dirigida a las GPU Hopper (H100) para centros de datos y a sus instrucciones específicas. En una tarjeta de consumo (RTX 30/40/50, Mac, Radeon), las mejoras se obtienen mediante la implementación de FA2 integrada en llama.cpp; no hay que añadir ningún flag adicional.
¿Por qué Flash Attention es más lento en mi tarjeta AMD?+
Una trampa conocida de ROCm/HIP: el kernel fusionado solo se utiliza si los dos tipos de la caché KV son simétricos (por ejemplo, q4_0 tanto para K COMO para V). Una mezcla como q4_0 + f16 pasa silenciosamente a una ruta de ejecución no fusionada, más lenta, sin ningún aviso. Alinea los dos tipos y vuelve a medir el rendimiento.
¿Puedo combinar Flash Attention y caché KV cuantizada?+
Sí, en NVIDIA, siempre que tu compilación de llama.cpp se haya compilado con FA_ALL_QUANTS; de lo contrario, la atención pasa a la CPU y el rendimiento cae en picado. En Mac, LM Studio gestiona la combinación de forma nativa mediante Metal. Si tienes dudas, compara los tok/s con y sin cuantización de la caché: la diferencia se ve inmediatamente.
¿Esta guía te ha ayudado?

¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.