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 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.
#Requisitos de GPU y software
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.
#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.
Para hacerlo persistente mediante systemd (caso común en Linux):
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.
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.
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.
#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.
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.
#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.
#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.
#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.
¿Cómo activar Flash Attention en llama.cpp y en LM Studio en 2026?+
¿Flash Attention 3 cambia algo para un LLM local?+
¿Por qué Flash Attention es más lento en mi tarjeta AMD?+
¿Puedo combinar Flash Attention y caché KV cuantizada?+
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.