Ventanas de contexto y la caché KV
La ventana de contexto tiene etiqueta de precio, y se paga en VRAM.
Cada token mantenido en contexto obliga al modelo a recordar dos vectores
pequeños por capa, y esa memoria — la caché KV — crece con cada token y
se come en silencio el margen que creías tener. Explica los fallos más
extraños del LLM local: el OOM en el turno cuarenta, el modelo que
parecía volverse más lento conforme crecía el chat, la tarjeta de 8 GB
que corre «contexto de 128k» solo en el folleto.
Qué almacena la caché
La atención necesita las proyecciones key y value de cada token pasado
antes de poder atender a ese token. Se calculan una vez durante el
prefill y se conservan por la vida de la petición: por capa, por token,
un vector K y un vector V de kv_heads × head_dim números cada uno. Ese
almacén es la caché KV, y es la razón de que el contexto cueste memoria
linealmente, para siempre, en cada petición que se sirve.
La fórmula
bytes por token = 2 (K y V) × capas × kv_heads × head_dim × 2 bytes (fp16)
Ejemplo resuelto, GQA clase llama-3-8B (32 capas, 8 cabezas KV, head_dim
128):
2 × 32 × 8 × 128 × 2 = 131,072 bytes = 128 KB por token.
A contexto de 32k eso son 32,768 × 128 KB ≈ 4 GB de caché KV —
comparables a los pesos Q4 que tiene al lado. Las configuraciones más
ligeras con 4 cabezas KV quedan cerca de 2 GB por 32k. Orden de magnitud
para modelos clase 8B con KV fp16: presupuesta 0.5–4 GB por 32k según
arquitectura. Los números exactos de un checkpoint salen directamente de
su config.json — num_key_value_heads, num_hidden_layers y el
tamaño de cabeza.
GQA es la razón de que el contexto largo se abaratara
La atención agrupada por consultas comparte un puñado de cabezas KV entre
muchas cabezas de consulta — digamos 32 cabezas de consulta servidas por
8 cabezas KV — encogiendo la caché 4× frente a la atención multicabeza
completa a un coste de calidad negligible. Sin GQA la tabla de abajo
sería 4–8× más grande y el contexto largo en una tarjeta de 24 GB sería
fantasía. Es el mayor regalo arquitectónico al trabajo local con contexto
largo, y la razón de que los modelos modernos de 7–9B traigan siquiera
ventanas de 32k–128k.
Qué tan rápido crece
Un modelo GQA clase 8B con KV fp16, 128 KB por token:
| Contexto | Tamaño de caché KV | En una tarjeta de 8 GB |
|---|---|---|
| 4k | ~0.5 GB | invisible |
| 16k | ~2.1 GB | perceptible junto a 5 GB de pesos |
| 64k | ~8.4 GB | no cabe, y punto |
| 128k | ~16.8 GB | 3× el modelo mismo |
La memoria crece linealmente por token, pero el cómputo de atención crece
con el cuadrado del contexto — así que los contextos largos cuestan VRAM
y tiempo por token a la vez.
Palancas cuando el KV explota
- Cuantiza la caché. q8_0 la parte a la mitad, q4_0 a la cuarta
parte, con un coste de calidad moderado — muchas veces el mejor
intercambio de capacidad de toda la pila. En llama.cpp, la cuantización
del KV requiere flash attention, mostrado abajo. - Sirve contexto más corto.
-c 8192no cuesta nada si tus prompts
son de 2k. Reservar los 128k anunciados «por si acaso» aparta VRAM que
nunca usarás productivamente. - Modelos de ventana deslizante. Algunas arquitecturas limitan la
ventana KV por capa sin importar el contexto nominal — comportamiento
de contexto largo sin la factura lineal, con algún coste de recuerdo
sobre material viejo. - Flash attention. En el fondo una ganancia de cómputo y eficiencia
de kernels — atención exacta sin la explosión cuadrática de
activaciones — y en llama.cpp es también la compuerta que desbloquea la
cuantización del KV.
llama-server -m model-8b-q4_k_m.gguf -c 65536 -fa --cache-type-k q8_0 --cache-type-v q8_0
Contexto anunciado vs efectivo
Un modelo que anuncia 128k correrá a 128k — la caché cabe y las cuentas
salen. Que razone a 128k es una afirmación distinta. El RoPE estirado
y el ajuste fino de contexto largo mantienen altas las puntuaciones de
recuperación de aguja mientras la comprensión amplia suele flaquear mucho
antes del límite. Trata la ventana anunciada como un máximo físico,
asume que la calidad se ablanda en la última mitad, y busca evaluaciones
comunitarias de contexto largo del checkpoint concreto antes de apostar
un flujo de trabajo a él.
Perderse en el medio, y hábitos de higiene
El sesgo posicional es real: los modelos atienden con más fuerza al
principio y al final del prompt y flaquean en el medio. Pon las
instrucciones y los hechos críticos al principio o al final; nunca
entierres la especificación que el modelo debe seguir dentro de un
documento pegado. Hábitos que mantienen los contextos pequeños y
afilados:
- Recorta o resume los turnos viejos en vez de reproducir todo el chat.
- Recupera e inyecta el fragmento relevante, no el archivo entero.
- Mantén corto el prompt de sistema; se reenvía con cada petición.
- Vigila la VRAM durante sesiones largas — el crecimiento del KV es la
variable silenciosa (cálculo de VRAM), y los flags
de servicio que lo controlan están catalogados en
Parámetros del motor.
Relacionados: cálculo de VRAM · Parámetros del motor ·
Velocidad