Avanzado 11 minvLLM

Desplegar vLLM en production

Respuesta directa

Para desplegar vLLM en producción: instálalo en Linux (mediante pip o la imagen Docker vllm/vllm-openai), arranca vllm serve con tu modelo, configura --gpu-memory-utilization y --max-model-len, activa --api-key y, después, coloca un proxy inverso delante. El servidor escucha en el puerto 8000 con una API compatible con OpenAI. Solo sirve un modelo a la vez y está diseñado para ofrecer un alto rendimiento con muchos usuarios simultáneos.

vLLM es el servidor de inferencia diseñado para compartir una GPU entre muchas solicitudes en paralelo. Esta guía cubre el dimensionamiento de la memoria (el verdadero tema), la instalación, el arranque, Docker y systemd, los parámetros que importan, la medición de la tasa de procesamiento y la seguridad, con una corrección importante: la opción --api-key protege solo parte de las rutas.

Por Mohamed Meguedmi·Actualización 2026-09-30·Probado en Windows, macOS y Linux

#Lo que hace vLLM y lo que exige

vLLM es un motor de inferencia de código abierto nacido en el laboratorio Sky Computing de UC Berkeley. Su idea central, PagedAttention, gestiona por páginas la caché de claves y valores de la atención, como la memoria virtual de un sistema operativo. Según el anuncio inicial del proyecto en 2023, los sistemas existentes desperdiciaban una gran parte de su memoria y vLLM alcanzaba hasta 24 veces la tasa de procesamiento de Hugging Face Transformers y hasta 3,5 veces la de TGI, en pruebas de aquella época. Estas cifras son antiguas y específicas de ese banco de pruebas: indican una tendencia, no lo que obtendrás con tu modelo y tu tarjeta.

En cuanto a los requisitos previos, la documentación actual exige Linux y Python entre 3.10 y 3.13; en Mac, existe una vía alternativa, vLLM-Metal, que se basa en MLX. El servidor expone una API compatible con OpenAI, escucha por defecto en el puerto 8000 y solo sirve un modelo a la vez: para múltiples modelos, se necesitan varias instancias.

#¿Cuándo elegir vLLM en lugar de Ollama?

El kit de IA Local

Tu ChatGPT privado y gratuito en tu máquina en 1 hora — LM Studio, Ollama, Open WebUI, tus documentos, sin nube.

  • Espacio en línea de por vida
  • PDF + archivos
  • Reembolsado 30 j

La diferencia no radica en la capacidad de procesar consultas en paralelo, que también ofrece Ollama, sino en la forma en que se comparte la memoria. Según la FAQ de Ollama, el procesamiento en paralelo de un modelo multiplica el tamaño del contexto por el número de consultas: un contexto de 2.000 tokens con 4 consultas en paralelo se convierte en un contexto de 8.000 tokens en memoria, reservado por adelantado. vLLM asigna su caché por bloques, a demanda, y agrupa las consultas en curso en los mismos cálculos.

Ollama o vLLM: criterios de decisión
CriterioOllamavLLM
Usuarios simultáneosDe 1 a unos pocos; OLLAMA_NUM_PARALLEL regula el paralelismoDecenas de consultas simultáneas
Modelos servidosVarios, cargados y descargados según se necesitenUno por instancia
ImplementaciónUna orden de instalaciónPython, CUDA y parámetros que ajustar
CuantizacionesGGUF, amplia selecciónFormatos del Hub (AWQ, GPTQ, FP8); GGUF parcialmente
Métricas de seguimientoNo detalladas en esta guíaPunto de acceso /metrics documentado
Uso típicoEquipo personal, equipo pequeñoServicio interno o producto

Regla práctica: si menos de tres personas usan el modelo al mismo tiempo, o si quieres cambiar de modelo con frecuencia, Ollama basta. Por encima de ese número de usuarios, o con un solo modelo servido de forma continua, vLLM compensa su complejidad. La guía comparativa detalla la elección.

#Cuando vLLM es una mala opción

vLLM no aporta nada a un único usuario con una GPU de 8 a 12 GB: no hay suficiente memoria para una caché compartida, y Ollama o llama.cpp se ponen en marcha más fácilmente. Resulta poco adecuado si alternas entre cinco modelos a lo largo del día, ya que hay que volver a iniciar una instancia para cada modelo. En un Mac, la vía es distinta y se basa en MLX. Por último, si necesitas una interfaz de chat para el equipo en lugar de una API sometida a una carga elevada, una solución con Ollama y Open WebUI responde mejor a esa necesidad y requiere menos trabajo de administración.

#Dimensionar la memoria: el cálculo que hay que hacer antes que nada

Un servidor vLLM se dimensiona según la caché clave-valor, no según los pesos. Una vez cargado el modelo, vLLM reserva una fracción de la memoria de la GPU, el 92 % por defecto según el código de configuración actual, y dedica todo lo que queda a la caché. Ese espacio restante determina cuántos tokens de conversación pueden coexistir y, por tanto, a cuántos usuarios simultáneos puedes atender.

Tomemos Qwen2.5-7B-Instruct, cuya ficha indica 7,61 mil millones de parámetros, 28 capas y 4 cabezas de clave-valor (atención agrupada). Los pesos en 16 bits ocupan aproximadamente 15,2 GB. La caché de un token ocupa 2 (claves y valores) × 28 capas × 4 cabezas × 128 dimensiones × 2 bytes, es decir, 57 344 bytes, aproximadamente 56 KiB.

Caché disponible según la GPU (Qwen2.5-7B en 16 bits, 92 % de la memoria, antes de los búferes de cálculo)
Memoria del GPUReserva del 92 %Memoria restante para la cachéTokens de caché (límite superior)Equivalente en consultas de 4.096 tokens
24 GB22,1 GB6,9 GBaproximadamente 120.000alrededor de 29
48 GB44,2 GB28,9 GBalrededor de 500.000alrededor de 120
80 GB73,6 GB58,4 GBaproximadamente 1.000.000alrededor de 250

Estos límites son elevados: los búferes de cálculo y los grafos CUDA consumen parte de la memoria restante, y el modelo puede tener otro perfil. El método sigue siendo válido para cualquier modelo: consulta los números de capas y de cabezas de clave-valor en la ficha, calcula el coste por token y divide lo que queda. Si los registros indican preempciones, la documentación recomienda aumentar gpu_memory_utilization o reducir max_num_seqs.

Dos mecanismos amplían el caché sin cambiar la tarjeta: cargar una versión cuantizada del modelo, que libera parte de los pesos, o limitar --max-model-len, lo que evita reservar espacio para contextos que nadie utiliza. El primer mecanismo puede costar un poco de calidad; el segundo no cuesta nada siempre que tus consultas sigan siendo cortas.

→
Un modelo de 7B en 16 bits con 24 GB puede atender unas treinta conversaciones de 4000 tokens
Este cálculo explica por qué vLLM destaca en tarjetas de 48 o 80 GB: el margen de memoria para la caché, no la velocidad para un único usuario, marca la diferencia. En una tarjeta de 12 GB, el mismo modelo apenas deja memoria para la caché.

#1. Instalación

Instalación recomendada por la documentación (NVIDIA CUDA)
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto

La documentación recomienda uv, que elige automáticamente la versión adecuada de PyTorch según tu controlador CUDA. Para un GPU AMD, la instalación se realiza a través de un índice dedicado; para Intel, TPU o Ascend, existen plugins. En producción, la imagen Docker evita conflictos de versiones CUDA y se actualiza con un simple cambio de etiqueta.

#2. Iniciar el servidor

Iniciar con vllm serve
vllm serve Qwen/Qwen2.5-7B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --gpu-memory-utilization 0.90 \
  --max-model-len 8192 \
  --api-key "$VLLM_API_KEY"

El comando vllm serve reemplaza la antigua invocación python -m vllm.entrypoints.openai.api_server, que ya no se utiliza en la documentación actual. En el primer arranque, los pesos se descargan desde Hugging Face: prevé espacio en disco (alrededor de 15 GB para un 7B en 16 bits). El servidor aplica por defecto el archivo generation_config.json del repositorio del modelo y, por tanto, los parámetros de muestreo recomendados por su editor; --generation-config vllm restablece los valores por defecto de vLLM.

Verificar el servidor
curl http://localhost:8000/v1/models \
  -H "Authorization: Bearer $VLLM_API_KEY"

#3. Docker y systemd

La imagen oficial vllm/vllm-openai es la vía más segura. Monta la caché de Hugging Face para no volver a descargar los pesos y un volumen para la caché de compilación: de lo contrario, cada nuevo contenedor arranca con una caché vacía y recompila los artefactos de su modelo. Ten en cuenta que la imagen se ejecuta como root por defecto; la documentación describe cómo ejecutarla con un usuario sin privilegios (--user 2000:0).

Contenedor con la caché montada
docker run --rm --gpus all \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -v vllm-cache:/root/.cache/vllm \
  -p 8000:8000 \
  --ipc=host \
  -e VLLM_API_KEY=$VLLM_API_KEY \
  vllm/vllm-openai:latest \
  Qwen/Qwen2.5-7B-Instruct
Unidad systemd (instalación sin Docker)
[Unit]
Description=vLLM OpenAI API
After=network.target

[Service]
Type=simple
User=vllm
EnvironmentFile=/etc/vllm/env
ExecStart=/opt/vllm/bin/vllm serve Qwen/Qwen2.5-7B-Instruct --port 8000
Restart=always

[Install]
WantedBy=multi-user.target

#4. Los parámetros que importan

Parámetros clave de vllm serve
ParámetroRolConsejo
--gpu-memory-utilizationFracción de la memoria del GPU reservada (0,92 por defecto)Bajar si otro proceso utiliza la GPU; subir si los registros muestran preempciones
--max-model-lenContexto máximo aceptadoLo más bajo posible: cada token de contexto consume espacio en la caché
--max-num-seqsNúmero máximo de solicitudes en un loteBajar en caso de falta de memoria
--tensor-parallel-sizeDistribuye el modelo entre varios GPUs de un nodoSolo si el modelo no cabe en una GPU
--api-keyRequiere una clave para ciertas rutasVer la sección de seguridad: insuficiente por sí solo
--generation-config vllmIgnora generation_config.json del modeloUsar si las respuestas difieren de tus expectativas

Un principio de la documentación: si el modelo cabe en una sola GPU, la distribución probablemente sea innecesaria; si no cabe en una GPU pero sí en un nodo, se utiliza el paralelismo tensorial con --tensor-parallel-size. Los modelos ya cuantizados se cargan directamente desde el Hub, sin ninguna opción especial: la opción --quantization solo sirve para la cuantización dinámica.

#5. Medir correctamente la tasa de procesamiento

El comando vllm bench serve envía solicitudes al servidor e informa de la tasa de procesamiento, el tiempo hasta el primer token (TTFT) y la latencia entre tokens. La documentación especifica que estos benchmarks sirven principalmente para evaluar funciones y detectar regresiones, y recomienda GuideLLM para probar un servidor de producción.

Prueba de carga
vllm bench serve \
  --backend vllm \
  --model Qwen/Qwen2.5-7B-Instruct \
  --endpoint /v1/completions \
  --dataset-name sharegpt \
  --dataset-path CHEMIN/ShareGPT_V3_unfiltered_cleaned_split.json \
  --num-prompts 200
!
Repetir una prueba de rendimiento infla la tasa de procesamiento
La documentación advierte que volver a ejecutar vllm bench serve en el mismo servidor puede reutilizar prompts que hayan quedado en la caché de prefijos e inflar los resultados. Cambia la semilla con --seed o reinicia el servidor entre dos mediciones.

#Puesta en servicio y operación

Una vez realizado el dimensionado, la puesta en servicio sigue siempre la misma secuencia. Se aplica a un equipo de unas veinte personas que consultan un mismo modelo de 7 a 8 mil millones de parámetros en una tarjeta de 24 o 48 GB.

  1. 01
    Elegir el modelo y el formato
    Un solo modelo por instancia. Prefiere un repositorio ya cuantizado o en 16 bits, según la memoria disponible.
  2. 02
    Calcular el caché
    Aplica el cálculo por token de la sección de dimensionado para fijar --max-model-len y --max-num-seqs.
  3. 03
    Iniciar en Docker
    Usa la imagen oficial con la caché de Hugging Face montada y una etiqueta de versión fija en lugar de latest, para evitar que una actualización cambie el comportamiento.
  4. 04
    Añadir el proxy
    Proxy inverso con lista blanca de rutas, TLS y limitación de la frecuencia de solicitudes, y después la clave de API como complemento.
  5. 05
    Medir
    Ejecuta una prueba de carga con vllm bench serve variando la semilla y anota el TTFT y el rendimiento total.
  6. 06
    Supervisar
    Conecta la recopilación de datos del endpoint /metrics a tu herramienta de supervisión.

Las señales que debes vigilar son las que anuncian una falta de caché: preempciones en los registros, un TTFT que aumenta y colas que se alargan. La documentación indica que la preempción, cuyo modo predeterminado es el recálculo, protege el servicio pero empeora la latencia de extremo a extremo. Si se vuelve frecuente, aumenta gpu_memory_utilization, reduce el contexto o limita el número de solicitudes simultáneas. Como último recurso, añade una GPU y reparte el modelo mediante el paralelismo tensorial.

#6. Seguridad y exposición: --api-key no basta

Contrario a lo que a menudo se lee, vLLM sabe verificar una clave de API, con --api-key o la variable VLLM_API_KEY. Pero la documentación de seguridad insiste: la clave solo protege las rutas bajo /v1, /v2, /inference y /cohere. Otras rutas permanecen sin autenticación, como rutas de inferencia fuera de /v1, rutas de control como /pause o /abort_requests, y /health. Por lo tanto, nunca confíes únicamente en --api-key.

Reverse proxy
Coloca nginx, Envoy o una puerta de enlace de Kubernetes delante de vLLM, con una lista blanca que incluya únicamente las rutas que se deben exponer, y bloquea todas las demás.
Red
Una VPN o una red aislada: la comunicación entre los nodos de un despliegue distribuido no está protegida de forma predeterminada.
Modo de desarrollo
Nunca actives VLLM_SERVER_DEV_MODE=1 en producción: expone rutas peligrosas.
Límites
Aplica la limitación de la tasa de solicitudes y la validación de las peticiones en el proxy, como recomienda la documentación.
Registros
Registra quién envía qué, para depuración y auditoría.
FAQ
¿Es vLLM mejor que Ollama en producción?+
Es mejor cuando varios usuarios consultan el mismo modelo al mismo tiempo: comparte el caché por bloques y agrupa las peticiones. Ollama sigue siendo más sencillo para un equipo personal o un pequeño grupo de trabajo, y permite cambiar de modelo sobre la marcha. vLLM solo sirve un modelo por instancia.
¿Cómo lanzar un servidor vLLM con una API compatible con OpenAI?+
Con el comando vllm serve seguido del nombre del modelo. El servidor escucha por defecto en http://localhost:8000 y ofrece las rutas compatibles con OpenAI, como /v1/models y /v1/chat/completions. Especifica --host y --port para abrirlo a la red, y añade --api-key y un proxy inverso antes de exponerlo.
¿Cuánta VRAM se necesita para vLLM?+
Suficiente para los pesos del modelo, más el caché de clave-valor de tus usuarios simultáneos. Un 7B en 16 bits pesa aproximadamente 15 GB; con 24 GB y 92 % reservados, quedan aproximadamente 7 GB de caché, lo que equivale a unos treinta diálogos de 4.000 tokens. Con 48 GB, unas cuatro veces más diálogos.
¿Basta con la opción --api-key para proteger vLLM?+
No. Solo protege las rutas bajo /v1, /v2, /inference y /cohere; rutas como /health, /invocations o /pause permanecen accesibles sin clave. La documentación recomienda colocar un reverse proxy que permita solo las rutas deseadas y nunca exponer directamente el servidor en Internet.
¿Funciona vLLM en Mac o con una tarjeta AMD?+
Sí, con reservas. La documentación indica compatibilidad con GPU AMD a través de ROCm, GPU Intel y otros aceleradores. En Mac, remite a vLLM-Metal, que se basa en MLX en lugar de PyTorch y exige modelos en formato MLX. La vía principal sigue siendo Linux con una GPU NVIDIA.
¿Esta guía te ha ayudado?

¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.