localaiforum
Iniciar sesión
Guía › Hardware

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 8192 no 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