Inferencia

KV-Cache

KV-Cache (Caché de Clave-Valor) es un búfer de memoria que almacena los tensores de clave y valor producidos por las capas de atención de un transformador para tokens ya procesados, eliminando la recomputación redundante durante la generación autorregresiva. Es el mecanismo principal que hace que la generación de LLM por token sea práctica en latencia de producción.

En el mecanismo de atención multi-cabeza de un transformador, cada token de entrada produce tres vectores: una consulta (Q), una clave (K) y un valor (V). Durante la generación autorregresiva —donde el modelo emite un token a la vez— la consulta de cada nuevo token debe atender sobre las claves y valores de todos los tokens anteriores. Sin almacenamiento en caché, esos tensores K y V se recomputarían desde cero en cada paso de generación, causando que el costo de inferencia se escale cuadráticamente con la longitud de la secuencia. El KV-cache almacena tensores K y V computados en memoria GPU o CPU para que cada par se compute exactamente una vez y se reutilice para todos los pasos de generación posteriores.

Al inicio de una solicitud de generación, el modelo ejecuta una fase de «prefill»: el prompt de entrada completo se procesa en un único paso hacia adelante paralelo y los tensores K y V resultantes para cada token de prompt se escriben en el caché. La fase de «decode» posterior procesa un nuevo token por paso; cada paso lee el KV-cache completo para calcular la atención y añade la propia entrada K/V del nuevo token al caché. El tamaño de caché se escala como O(num_capas × num_cabezas_clave_valor × dim_cabeza × longitud_secuencia), alcanzando decenas de gigabytes para contextos largos en modelos grandes, haciendo que la capacidad de memoria GPU sea una restricción principal en la entrega de producción.

Sin un KV-cache, el costo de decodificación por token crecería como O(n) porque la secuencia creciente completa se reprocessaría en cada paso. Con el caché, cada paso de decodificación es O(1) en computación (excluyendo ancho de banda de memoria), manteniendo la latencia aproximadamente constante independientemente de cuántos tokens ya se hayan generado. El KV-cache también habilita optimizaciones avanzadas de entrega: PagedAttention de vLLM (2023) aplica paginación de memoria virtual al almacenamiento de KV-cache para eliminar fragmentación y admitir tamaños de lote concurrentes más grandes; la decodificación especulativa utiliza un KV-cache compartido entre un modelo borrador pequeño y un verificador grande para aumentar el rendimiento efectivo.

A partir de 2026, la gestión de KV-cache es un enfoque central de la ingeniería de inferencia de LLM. La cuantización de tensores de KV-cache a INT8 o INT4 (independientemente de la cuantización de pesos) es práctica estándar en pilas de entrega de producción que incluyen vLLM, TensorRT-LLM y SGLang, reduciendo aproximadamente a la mitad el uso de memoria de activación en caché. Flash Attention 2 y 3 reducen el costo de ancho de banda de memoria de lectura y escritura del caché. La investigación en descarga de caché (derramar tensores a CPU o NVMe cuando se agota la memoria GPU) y compresión de caché (Infini-Attention, evicción de tokens H2O) es activa, dirigida a implementaciones donde la longitud del contexto excede la memoria GPU disponible.

Ejemplo

Al generar una respuesta de 500 tokens a un prompt de 4.000 tokens, el KV-cache almacena todos los tensores de clave y valor para los 4.000 tokens de prompt después de un único paso de prefill; cada uno de los 500 pasos de decodificación luego lee el caché en lugar de reprocesar el prompt, reduciendo la latencia por token en aproximadamente un orden de magnitud en comparación con inferencia sin caché.

Términos relacionados

Últimas noticias sobre el tema

← Glosario