La inferencia de Large Language Models (LLMs) presenta desafíos fundamentales en la gestión de recursos computacionales y de memoria, especialmente la memoria KV-cache, y en la optimización de la latencia y el throughput. A medida que los modelos crecen en tamaño y la demanda de inferencia en tiempo real aumenta, los enfoques tradicionales de batching estático y gestión de memoria se vuelven ineficientes, llevando a subutilización de GPUs y latencias elevadas.
vLLM aborda estos problemas introduciendo un conjunto de optimizaciones a nivel de sistema que transforman la forma en que los LLMs son servidos. Al integrar PagedAttention, un algoritmo de gestión de memoria inspirado en la paginación de sistemas operativos, junto con batching continuo y caching de prefijos, vLLM maximiza la utilización de la GPU y reduce significativamente la latencia y el costo por token. La relevancia de estas optimizaciones es crítica en el panorama actual de la IA, donde la eficiencia en el servicio de LLMs es un factor determinante para la viabilidad económica y la experiencia del usuario en aplicaciones a gran escala.
Arquitectura del Sistema
La arquitectura de vLLM se construye alrededor de un "Engine Core" que encapsula la lógica fundamental de inferencia. Este core incluye un "Model Executor" para las pasadas hacia adelante del modelo, un "Scheduler" que gestiona las colas de solicitudes (waiting y running) y decide qué solicitudes procesar en cada paso, y un "KV Cache Manager" que implementa PagedAttention. PagedAttention gestiona el KV-cache de manera granular, asignando bloques de memoria física a tokens lógicos, similar a cómo un sistema operativo gestiona la memoria virtual, lo que permite un uso eficiente de la VRAM y evita la fragmentación.
El "Scheduler" de vLLM es capaz de mezclar solicitudes de "prefill" (procesamiento inicial del prompt) y "decode" (generación de tokens subsiguientes) en el mismo paso, priorizando las solicitudes de "decode" para mantener baja la "inter-token latency" (ITL). El "Continuous Batching" es una técnica clave que permite procesar múltiples solicitudes simultáneamente, incluso si tienen diferentes longitudes, concatenando las secuencias en una "super secuencia" y utilizando máscaras de atención para asegurar que cada secuencia solo atienda a sus propios tokens. Esto elimina el padding ineficiente y maximiza el throughput.
Para escalar, vLLM utiliza "MultiProcExecutor" que coordina múltiples procesos GPU (workers) para "tensor parallelism" (TP) y "pipeline parallelism" (PP) dentro de un nodo. Para el escalado distribuido, se introduce "Data Parallelism" (DP) con un "DP Coordinator" y "API Servers" que distribuyen las solicitudes entre réplicas del motor. Características avanzadas como "Chunked Prefill" dividen prompts largos en trozos más pequeños para evitar que una sola solicitud monopolice la GPU, "Prefix Caching" reutiliza los KV-caches de prefijos comunes entre solicitudes, y "Speculative Decoding" utiliza un modelo "draft" más pequeño para proponer múltiples tokens que luego son verificados por el modelo grande, acelerando la generación sin comprometer la calidad. La "Guided Decoding" permite restringir la salida del modelo mediante gramáticas basadas en Finite State Machines (FSMs), y el "Disaggregated P/D" separa la ejecución de prefill y decode en instancias dedicadas para optimizar sus perfiles de rendimiento distintos.
Fundamentos Teóricos
La técnica central de PagedAttention en vLLM se inspira directamente en los principios de gestión de memoria virtual de los sistemas operativos, donde las páginas de memoria se asignan de forma no contigua a un espacio de direcciones virtual. Este concepto, fundamental en la computación desde los años 60, se adapta aquí para gestionar los bloques de Key-Value (KV) cache de los transformadores, como se detalla en el paper "Efficient Memory Management for Large Language Model Serving with PagedAttention" (2023).
El "Continuous Batching" y la optimización del throughput en sistemas de inferencia distribuida tienen sus raíces en trabajos como "Orca: A Distributed Serving System for Transformer-Based Generative Models" (2022), que exploró cómo maximizar la utilización de recursos en modelos generativos. La "Speculative Decoding" se basa en el principio de que un modelo más pequeño puede proponer rápidamente secuencias de tokens que un modelo más grande puede verificar eficientemente, una idea formalizada en "Accelerating Large Language Model Decoding with Speculative Sampling" (2023). La "Guided Decoding" con FSMs conecta con la teoría de autómatas y lenguajes formales, permitiendo la imposición de gramáticas complejas en la generación de texto, como se explora en "XGrammar: Flexible and Efficient Structured Generation Engine for Large Language Models" (2024).