Cuantizar la caché KV: ahorrar VRAM (contexto largo contexte)
Tienes suficiente VRAM para cargar el modelo, pero en cuanto aumentas el contexto a 16k o 32k tokens, la memoria necesaria supera la capacidad disponible. La culpable es la caché KV: una memoria caché que crece linealmente con el contexto y que, con prompts largos, puede ocupar tanto como el propio modelo. La cuantización de la caché KV la comprime en Q8 o Q4 para duplicar el contexto que admite la misma tarjeta. Aquí te explicamos cómo activarla en Ollama y llama.cpp, las mejoras expresadas en cifras y el impacto real en la calidad.
#¿Por qué el caché KV consume tu VRAM?
Cuando un LLM genera texto, no recalcula la atención sobre todo el prompt con cada nuevo token: mantiene en memoria los vectores de claves (K) y valores (V) de cada token ya visto. Es el KV cache, y es lo que hace que la generación sea rápida. El problema: esta memoria crece linealmente con la longitud del contexto. Si duplicas el contexto, duplicas el KV cache.
Con un prompt corto de unos cientos de tokens, es insignificante. Pero en cuanto se utiliza RAG con documentos grandes, se resumen transcripciones o se usan agentes con memoria larga, el contexto se dispara, y la caché KV también. En un 70B con 32k de contexto, puede superar los 10 GB por sí sola, además de los ~40 GB del modelo. A menudo es esta caché, y no el modelo, la que provoca el error de falta de memoria en los prompts largos.
#¿Cuánto pesa tu caché KV?
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
El tamaño del caché KV depende de cuatro factores: el número de capas del modelo, la dimensión de atención, la longitud de contexto y la precisión de almacenamiento. En FP16 (por defecto), la fórmula aproximada es: 2 (K y V) × capas × dim_kv × contexto × 2 bytes. En la práctica, recuerda estos órdenes de magnitud en FP16 con un contexto de 32k tokens:
- 7-9B (por ejemplo, Qwen 3.5 9B, Granite 4.2 8B)
- ≈ 2 a 4 GB de caché KV a 32k, según la arquitectura (GQA ayuda mucho).
- 14B
- ≈ 4 a 6 GB a 32k tokens.
- 32B
- ≈ 8 a 10 GB con 32k tokens.
- 70B
- ≈ 10 a 16 GB para 32k tokens — a menudo el factor limitante.
#Lo que cambia con la cuantización de la caché KV
La idea es la misma que para los pesos del modelo: en lugar de almacenar cada valor de la caché en 16 bits (FP16), se almacena en 8 bits (Q8_0) o 4 bits (Q4_0). Así, la memoria de la caché se divide por 2 (Q8) o por 4 (Q4). Como la caché KV puede representar una gran parte de la VRAM en contextos largos, el ahorro es directo: con la misma cantidad de VRAM, se puede duplicar aproximadamente la longitud de contexto que se puede manejar en Q8.
- FP16
- Precisión de referencia, sin pérdida, pero la que más recursos consume. La opción predeterminada.
- Q8_0
- La mitad de memoria, con una pérdida de calidad casi indetectable en la mayoría de los modelos. El mejor equilibrio.
- Q4_0
- Una cuarta parte de la memoria, pero con una pérdida de calidad medible que varía según el modelo. Reservar para los casos en los que la VRAM sea realmente el factor limitante.
#Activar la cuantización KV en Ollama
Ollama permite configurar la cuantización de la caché KV mediante dos variables de entorno del demonio. Hay que activar Flash Attention y luego elegir el tipo de caché. Estas variables se configuran en el servicio Ollama, no al ejecutar ollama run.
- 01Activar Flash AttentionConfigura OLLAMA_FLASH_ATTENTION=1 en el entorno del demonio. Es el requisito previo para cualquier caché que no sea FP16.
- 02Elegir el tipo de cachéEstablece OLLAMA_KV_CACHE_TYPE en el valor deseado: f16 (predeterminado), q8_0 (recomendado) o q4_0 (agresivo).
- 03Reiniciar el daemonLas variables de entorno solo se leen al iniciar el servicio. Reinicia Ollama para que tengan efecto.
- 04Verificar la mejoraCarga un modelo con un contexto amplio y monitorea la VRAM con nvidia-smi o ollama ps. Debes poder aumentar num_ctx a un valor más alto que antes.
#Activar en llama.cpp
En la línea de comandos de llama.cpp, la cuantización de la caché KV se controla con dos opciones distintas para las claves (K) y los valores (V), además de la opción de Flash Attention. Se pueden cuantizar K y V de forma independiente, pero en la práctica se ponen al mismo nivel.
- -fa
- Activa Flash Attention. Sin esta bandera, -ctk/-ctv por debajo de f16 falla.
- -ctk q8_0
- Cuantiza la caché de claves a 8 bits. Valores posibles: f16, q8_0, q4_0, q4_1, q5_0, q5_1.
- -ctv q8_0
- Cuantiza la caché de valores. Mismo conjunto de valores que -ctk.
- -c 32768
- El tamaño de contexto al que apuntas. La cuantización te permite aumentarlo sin desbordar la memoria disponible.
#Cuánto contexto se gana: cifras reales
La ganancia concreta depende de la proporción de tu presupuesto de VRAM que ocupa la caché KV. Si el modelo cabe con mucho margen, cuantizar la caché solo libera un poco de espacio. Si el modelo ya satura la VRAM, puede marcar la diferencia entre 8k y 24k de contexto. Estos son algunos órdenes de magnitud observados, manteniendo constante la VRAM:
- FP16 → Q8_0
- Cache dividido por 2. En la práctica, contexto soportable aproximadamente duplicado cuando el cache dominaba el presupuesto.
- FP16 → Q4_0
- Caché dividida por 4. Permite mantener un contexto hasta ~3-4 veces más largo, a costa de una pérdida de calidad medible.
- Ejemplo de 14B en RTX 4080 de 16 GB
- De ~16k de contexto en FP16 a ~32k+ en Q8_0, manteniendo el modelo y el resto dentro de los mismos 16 GB.
- Ejemplo de 32B en RTX 4090 24GB
- Pasar la caché a Q8_0 suele permitir trabajar con documentos RAG largos sin descargar parte del procesamiento en la CPU.
#El impacto en la calidad según los modelos
Esa es la verdadera pregunta. Cuantizar la caché introduce ruido en la atención, y no todos los modelos reaccionan igual. La regla empírica que se desprende de las pruebas de la comunidad:
- Q8_0 en el caché
- Diferencia prácticamente indetectable en la gran mayoría de los modelos. Perplejidad y calidad percibida casi idénticas a las de FP16. Es el ajuste que conviene activar por defecto, casi sin pensarlo.
- Q4_0 en el caché
- Pérdida visible y variable. Algunos modelos la soportan muy bien; otros empiezan a divagar en contextos muy largos, a perder el hilo o a alucinar más. Probar en TU caso.
- Modelos con GQA
- Generalmente más resistentes a la cuantización de la caché, ya que su caché es compacta y está bien estructurada.
- Tareas sensibles (código, cálculo, extracción estricta)
- Más expuestas a la degradación con Q4. Mantente en Q8 para todo lo que requiera precisión factual.
#Solución de problemas
- « flash attention required » o caché ignorado
- Has olvidado -fa (llama.cpp) o OLLAMA_FLASH_ATTENTION=1 (Ollama). La caché cuantizada vuelve a FP16 sin avisar, o se genera un error.
- No se observa ahorro de VRAM
- Tu contexto es demasiado corto para que la caché ocupe una cantidad significativa de memoria. El ahorro solo se aprecia con prompts largos. Aumenta num_ctx / -c para comprobarlo.
- Calidad que se degrada en prompts largos
- Probablemente estés usando Q4 en un modelo que no lo tolera bien. Vuelve a configurar K en q8_0 (o incluso todo en q8_0) y prueba de nuevo.
- Variables Ollama sin efecto
- Solo se leen al arrancar el daemon. Reinicia el servicio después de configurarlas y verifica que el proceso ollama pueda verlas.
- Sigue dando OOM pese a la cuantización
- Es el propio modelo el que excede la memoria disponible, no la caché. Cuantiza también los pesos (Q4_K_M) o elige un modelo de menor tamaño.
#Para ir más allá
La cuantización de la caché KV es una de las opciones para manejar contextos grandes en local. Estas guías completan el panorama:
- Flash Attention 2 en un LLM local: activar y medir la mejora de rendimiento
- El requisito previo para la cuantización del KV cache, que además aporta por sí mismo mejoras en el uso de memoria y en la velocidad. Leer primero si Flash Attention aún no está activo en tu equipo.
- Elegir tu cuantización (Q4, Q5, Q8, FP16)
- Para cuantizar los pesos del modelo —el otro gran componente del consumo de VRAM—, como complemento a la cuantización de la caché.
- Instalar Ollama: Windows, macOS y Linux
- Si tu stack aún no está en marcha, con los requisitos de GPU para dimensionarlo adecuadamente.
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.