Skip to main content

vLLM (Motor de Inferencia de Alto Rendimiento)

Servidor de inferencia y servicio LLM de código abierto líder que ha revolucionado el rendimiento gracias al algoritmo de virtualización de memoria PagedAttention y el batching continuo.

1. Visión general del concepto y problema sistémico

Las bibliotecas tradicionales de aprendizaje profundo (PyTorch puro o Hugging Face Transformers) fueron diseñadas para investigación, no para producción de alta carga. Al intentar atender a decenas de usuarios simultáneamente, se produce un desperdicio catastrófico de recursos de memoria de video:

  • Asignación estática continua: Para procesar una solicitud, el marco asigna un bloque continuo de VRAM para la longitud máxima de la ventana (por ejemplo, 8,192 tokens), incluso si el usuario hace una pregunta de tres palabras.
  • Fragmentación interna y externa: Más del 60-80% de la costosa memoria de las GPUs A100/H100 permanece inactiva, bloqueada "por si acaso".
  • Batching bloqueante: Si una solicitud requiere la generación de 10 tokens y una vecina 2000, la primera debe esperar a que la segunda complete el bloque de cálculo.

vLLM (desarrollado en el laboratorio LMSYS / UC Berkeley) ha resuelto este problema de una vez por todas. Gracias al algoritmo PagedAttention y la programación iterativa continua, vLLM se ha convertido en el estándar industrial para el autoalojamiento de modelos de lenguaje, permitiendo maximizar el rendimiento de cada GPU.

2. Taxonomía arquitectónica y modelo mental

El stack arquitectónico de vLLM se construye en torno a la optimización del acceso a la memoria y la multihilo:

┌─────────────────────────────────────────────────────────────┐
│                    ARQUITECTURA DEL MOTOR vLLM             │
├─────────────────────────────────────────────────────────────┤
│ 1. Capa Frontal Asíncrona:                                 │
│    • Servidor HTTP Compatible con OpenAI (FastAPI / Uvicorn)│
│    • Gestor de Respuestas en Streaming (Eventos Enviados por el Servidor)│
├─────────────────────────────────────────────────────────────┤
│ 2. Programador de Batching Continuo:                       │
│    • Programación a nivel de iteración (Sin pausas de batch estáticas)│
│    • Caching Automático de Prefijos (Compartición de KV-Cache)│
├─────────────────────────────────────────────────────────────┤
│ 3. Subsistema de Memoria (Motor PagedAttention):           │
│    • Pool de Bloques Físicos (Páginas de memoria de 16 tokens)│
│    • Tabla de Bloques (Tabla de correspondencia lógica y física)│
├─────────────────────────────────────────────────────────────┤
│ 4. Subsistema de Cómputo: Kernels CUDA / ROCm Personalizados, FP8, TP│
└─────────────────────────────────────────────────────────────┘
  1. Motor PagedAttention:
    • Divide el KV Cache de la secuencia en pequeñas páginas de tamaño fijo (normalmente 16 o 32 tokens).
    • Las páginas físicas pueden ubicarse en cualquier parte de la VRAM sin necesidad de ser contiguas, eliminando completamente la fragmentación externa.
  2. Batching Continuo:
    • Los cálculos se programan a nivel de una iteración de generación de tokens. Una vez que una solicitud termina su respuesta, sus páginas se liberan inmediatamente, y una nueva solicitud de la cola toma su lugar.
  3. Caching Automático de Prefijos (APC):
    • Si cientos de solicitudes comienzan con el mismo prompt del sistema o archivos de código similares, vLLM almacena estas páginas en caché y las reutiliza entre diferentes usuarios sin costos computacionales.
  4. Ejecución Distribuida:
    • Soporte para Tensor Parallelism (TP) y Pipeline Parallelism (PP) basado en protocolos NCCL para dividir modelos sin problemas entre 2, 4 o 8 GPUs.

3. Pipeline técnico y mecánica interna

Ciclo de vida del procesamiento de solicitudes en el servidor vLLM:

  1. Recepción de la solicitud a través de la API de OpenAI: El cliente envía una solicitud POST a /v1/chat/completions.
  2. Tokenización y verificación de prefijo: El tokenizador divide el texto en identificadores. El gestor de memoria verifica el hash de los primeros tokens: si el prompt del sistema ya está cargado en el Paged Cache por otro usuario, estas páginas no se vuelven a calcular (Cache Hit).
  3. Asignación de páginas de memoria físicas: El gestor de bloques asigna exactamente tantas páginas de 16 tokens como se necesitan para mantener el contexto de entrada.
  4. Paso de generación iterativa (Model Forward Step): Kernels CUDA personalizados de alta velocidad leen las páginas fragmentadas del KV Cache en paralelo y calculan el siguiente token.
  5. Streaming y asignación dinámica de memoria: El token generado se envía inmediatamente al cliente a través de SSE. Si la página actual se llena, el gestor de bloques asigna una nueva página de 16 tokens del pool.
  6. Limpieza de recursos: Tras la aparición de un token de finalización o la desconexión del cliente, todas las páginas asignadas se devuelven inmediatamente al pool de memoria libre.

4. Escenarios prácticos de ingeniería en producción

01. Despliegue de un clúster de IA corporativo para 500 empleados

La empresa construye un servicio interno para ayudar a los desarrolladores:

  • Servidor con 4 GPUs NVIDIA A100 (80GB).
  • Comando de inicio:
    vllm serve Qwen/Qwen2.5-Coder-32B-Instruct --tensor-parallel-size 4 --enable-prefix-caching
    
  • El servidor soporta el trabajo simultáneo de cientos de ingenieros en Cursor y VS Code con una latencia del primer token de menos de 100 ms.

02. Sistema RAG de alta carga con un flujo de documentos millonario

Indexación por lotes y búsqueda interactiva en la base de conocimientos:

  • Gracias al Batching Continuo, el servidor procesa simultáneamente 128 solicitudes de usuarios, mostrando una capacidad total de más de 3,500 tokens por segundo por nodo.

03. Generación estructurada forzada de JSON (Guided Decoding)

El servicio requiere un cumplimiento absoluto de un esquema complejo de Zod:

  • vLLM integra motores sintácticos de gramáticas (Outlines / Guidance).
  • A nivel de logits, se enmascaran todos los tokens que violan las reglas de sintaxis JSON, garantizando un 100% de validez de la respuesta sin fallos en el parser.

5. Errores comunes, trampas y seguridad

  • Errores OOM debido a gpu_memory_utilization: Por defecto, vLLM reserva el 90% de la memoria disponible para el cache. Si se ejecuta otro proceso en paralelo o se establece un coeficiente de 0.98, un pico de activaciones durante un prefill largo puede causar que el proceso falle con un error de CUDA Out of Memory.
  • Falta de autenticación incorporada: vLLM fue diseñado como un motor de cómputo. Ejecutarlo directamente en internet público sin un proxy inverso externo (Nginx/Caddy) y validación de claves API abre el acceso sin control a tus GPUs.
  • Vulnerabilidades por detención incorrecta de procesos (Zombie Processes): Al usar paralelismo tensorial, la terminación abrupta del proceso principal de Python puede dejar procesos hijos de NCCL bloqueados en la memoria de video. Es necesario limpiar los restos con pkill -f vllm.
  • Alta sensibilidad a las versiones de los controladores CUDA: vLLM utiliza kernels C++/CUDA extremadamente optimizados. La incompatibilidad entre la versión de PyTorch, el controlador NVIDIA y la versión del CUDA Toolkit puede causar fallos de compilación al inicio.
/ Preguntas frecuentesSchema.org FAQPage

FAQ: vLLM (Motor de Inferencia de Alto Rendimiento)

Ha trasladado el concepto de memoria virtual de los sistemas operativos (OS Paging) al mundo de la IA: en lugar de asignar gigabytes de memoria continua para el contexto máximo de cada solicitud, la memoria para el KV Cache se asigna en páginas fijas bajo demanda. Esto ha eliminado hasta el 96% del desperdicio y la fragmentación de VRAM.
/ Enlaces internos
Todos los términos