El KV-cache, o Key-Value cache, es un mecanismo de almacenamiento en memoria diseñado para mejorar la eficiencia computacional de los modelos de lenguaje basados en la arquitectura Transformer, especialmente durante la fase de inferencia generativa. En el proceso de atención de un Transformer, cada token de entrada se transforma en tres vectores: Query (Q), Key (K) y Value (V). Para generar el siguiente token en una secuencia, el modelo necesita calcular la atención de este nuevo token con todos los tokens previos. Sin el KV-cache, los vectores K y V de los tokens ya procesados tendrían que ser recalculados en cada paso de generación, lo que es computacionalmente costoso y redundante. El KV-cache almacena estos vectores K y V una vez calculados, permitiendo que sean reutilizados directamente en pasos subsiguientes, reduciendo significativamente la latencia y el consumo de recursos.
La implementación del KV-cache es fundamental en la mayoría de los frameworks y runtimes de inferencia para LLMs. Por ejemplo, sistemas como Hugging Face Transformers, vLLM, y NVIDIA TensorRT-LLM integran optimizaciones de KV-cache para acelerar la inferencia. Plataformas de despliegue de modelos como OpenAI (para sus modelos GPT-x), Anthropic (para Claude) y Google (para Gemini) utilizan internamente técnicas de KV-caching para servir millones de solicitudes de generación de texto de manera eficiente. En el ámbito de la investigación, bibliotecas como DeepSpeed de Microsoft también ofrecen implementaciones avanzadas de KV-cache para entrenamiento e inferencia distribuida.
Para un arquitecto de sistemas, el KV-cache es un factor crítico en el diseño de infraestructuras para LLMs. Su gestión impacta directamente en el rendimiento (latencia y throughput) y el costo operativo. El principal trade-off es entre el ahorro computacional y el consumo de memoria: un KV-cache más grande permite secuencias más largas sin recálculos, pero consume más VRAM, lo que limita el número de usuarios concurrentes (batch size) o el tamaño del modelo que puede ejecutarse en un hardware dado. Decisiones de diseño incluyen la estrategia de evicción del cache (si es necesario), la precisión de los datos almacenados (ej. FP16 vs. INT8 para K/V), y la asignación de memoria dinámica versus estática. Optimizar el KV-cache es esencial para escalar servicios de inferencia de LLMs, balanceando la utilización de GPU, la latencia de respuesta y la capacidad de concurrencia.