Servir Llama 3.3 70B en un nodo.
De una máquina entregada hace cinco minutos a un endpoint compatible con OpenAI que responde solicitudes — con los dos flags que reducen a la mitad su rendimiento sin que se note, y el que le deja comprometido.
La respuesta corta
- Memoria necesaria
- 43 GB en 4 bits, 82 GB en FP8, 164 GB en BF16 — todo con contexto de 8k
- Máquina más sencilla
- Una tarjeta de 80 GB. Sin sharding, sin interconexión, sin sincronización
- Tiempo hasta el primer token
- Menos de quince minutos desde la entrega, la mayor parte descargando los pesos
- El único error
- Publicar el puerto 8000 en una dirección pública. No tiene autenticación
Lo que necesita
70 000 millones de parámetros. En 4 bits son 35 GB de pesos; la caché KV añade 2.5 GB con un contexto de 8k para una sola solicitud, y la sobrecarga de tiempo de ejecución, un 15 % aproximadamente. Todo lo demás se deduce de estas tres cifras — la guía de dimensionamiento muestra de dónde salen.
| Precisión | Pesos | Total a 8k | Total a 32k | Total a 128k |
|---|---|---|---|---|
| BF16 / FP16 | 140 GB | 164 GB | 173 GB | 207 GB |
| FP8 | 70 GB | 82 GB | 86 GB | 103 GB |
| 4-bit (AWQ, GPTQ) | 35 GB | 43 GB | 52 GB | 86 GB |
Fíjese en la fila de 4 bits a 128k: los pesos se reducen a 35 GB, pero la caché no se reduce en absoluto, porque AWQ y GPTQ solo cuantizan los pesos. Ese único hecho decide la mayor parte de la elección de máquina que sigue.
Elegir el nodo
Las máquinas más baratas de nuestro catálogo que alojan este modelo en una sola tarjeta, que es la configuración que conviene tener si es posible — sin sharding significa sin sincronización, y una cosa menos que depurar.
| Nodo | Precisión que cabe | Memoria de la tarjeta | tok/s estimados | Al mes |
|---|---|---|---|---|
| NVIDIA RTX A6000 | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $286/mes |
| 2 × NVIDIA RTX A6000 | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $597/mes |
| NVIDIA L40S | 4-bit (AWQ, GPTQ) | 48 GB | ~11 | $714/mes |
| NVIDIA A100 PCIe | 4-bit (AWQ, GPTQ) | 80 GB | ~25 | $1,091/mes |
El rendimiento es generación de flujo único, limitado por el ancho de banda de memoria, y deliberadamente conservador. Con el procesamiento continuo por lotes, el total agregado entre solicitudes concurrentes es varias veces mayor — ese es precisamente el objetivo de vLLM.
Diez minutos de configuración
Nada de esto es específico de nosotros salvo la dirección. Docker, el NVIDIA Container Toolkit y una pila de controladores en funcionamiento ya están en la máquina.
$ ssh root@203.0.113.42
$ nvidia-smi --query-gpu=name,memory.total --format=csv
# Weights on the fast local NVMe, not the system volume.
$ mkdir -p /scratch/models
$ df -h /scratch
# A gated model needs a token. Skip if yours is open.
$ export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxx
Iniciar el servidor
Un contenedor. La primera ejecución descarga unos 40 GB de pesos cuantizados, lo que en un puerto 1 Gbit/s tarda unos minutos; cada reinicio posterior es cuestión de segundos.
$ docker run -d --name vllm --restart unless-stopped \
--gpus all --ipc=host \
-v /scratch/models:/root/.cache/huggingface \
-e HF_TOKEN="$HF_TOKEN" \
-p 127.0.0.1:8000:8000 \
vllm/vllm-openai:latest \
--model casperhansen/llama-3.3-70b-instruct-awq \
--quantization awq_marlin \
--max-model-len 8192 \
--gpu-memory-utilization 0.92
# Watch it load. "Application startup complete" is the signal.
$ docker logs -f vllm
$ curl -s http://127.0.0.1:8000/v1/models | head
$ curl -s http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"casperhansen/llama-3.3-70b-instruct-awq",
"messages":[{"role":"user","content":"In one sentence: what is a KV cache?"}],
"max_tokens":80}'
Los flags que importan
No publicarlo para todo el mundo
0.0.0.0 en una dirección pública, es un servidor de inferencia abierto, y los escáneres encuentran ese tipo de servidores en cuestión de horas. Fíjese en -p 127.0.0.1:8000:8000 del comando anterior — esa dirección inicial es lo que lo mantiene fuera de internet, y es el carácter que más a menudo se omite al copiar un comando de otro sitio.
Acceda a él desde su propia máquina a través de un túnel SSH — sin abrir puertos, sin certificados que gestionar, sin nada que configurar mal:
$ ssh -N -L 8000:127.0.0.1:8000 root@203.0.113.42
# Now http://127.0.0.1:8000 on your laptop is the server.
Si de verdad tiene que ser público, coloque un proxy inverso delante con TLS y una clave de API, y restrinja también las direcciones de origen en el cortafuegos. La documentación tiene un conjunto de reglas mínimo. Cinturón y tirantes es la postura correcta para un endpoint que responderá a quien pregunte.
Aumentar el rendimiento
En el orden en que merece la pena probarlos. Los dos primeros son gratis y normalmente ofrecen las mayores ganancias.
- Reduzca
--max-model-lena su contexto real. Casi siempre es la mayor ganancia por sí sola, y no le cuesta nada que estuviera usando. - Suba
--gpu-memory-utilizationa 0.95. Es una máquina dedicada; no hay nada más en la tarjeta para lo que dejar espacio. - Active la caché KV en FP8 si la tarjeta lo permite. Duplica lo que puede contener.
- Agrupe por lotes desde el cliente. El procesamiento continuo por lotes solo ayuda si las solicitudes llegan de forma concurrente. Las solicitudes de una en una dejan la mayor parte de la tarjeta inactiva, sea cual sea la configuración.
- Solo entonces, y no antes, plantéese una tarjeta más rápida. La generación está limitada por el ancho de banda de memoria, así que una H200 a 4800 GB/s es aproximadamente 2,4× una H100 PCIe a 2000 para el mismo modelo — una ganancia real, y la más cara de esta lista.
$ docker exec vllm python -m vllm.entrypoints.openai.api_server --help | head -1
$ docker exec vllm vllm bench serve \
--model casperhansen/llama-3.3-70b-instruct-awq \
--num-prompts 200 --request-rate 8
# And watch the card while it runs: if utilisation sits below 90%,
# the bottleneck is your client, not the GPU.
$ nvidia-smi dmon -s um
Mantenerlo en marcha
Tres cosas que merece la pena hacer el primer día, porque las tres son molestas de descubrir el día catorce.
Política de reinicio
--restart unless-stopped está en el comando anterior. Tras un reinicio, el contenedor vuelve a arrancar y los pesos ya están en /scratch, así que está listo en menos de un minuto.
Vigile la tarjeta, no el proceso
Una GPU que se ha caído del bus mantiene un contenedor con aspecto saludable. nvidia-smi -q -d PERFORMANCE en una comprobación de estado la detecta; una comprobación de puerto no.
Los pesos no tienen copia de seguridad
Están en su NVMe local y en ningún otro sitio. Eso está bien — se pueden volver a descargar. Sus adaptadores de fine-tuning no, así que guárdelos en algún lugar fuera de la máquina.
Y cuando el plazo termina, los discos se borran en menos de una hora, sin periodo de gracia. Todo lo que hay en /scratch desaparece con ellos. Es deliberado — es la misma garantía que asegura que la máquina que le entregaron no tenía datos de nadie más — pero significa que el último día de un plazo no es el momento de empezar a copiar cosas fuera.
Compruebe este modelo con cada nodo que alquilamos.
El configurador indica qué configuraciones la alojan en una sola tarjeta, cuáles tienen que dividirla, y cuánto cuesta cada una.
Otras guías
- Práctica · 10 min
Fine-tuning de un modelo de 70B en una sola tarjeta
QLoRA en una sola GPU de 48 GB: qué cabe, cuánto cuesta al mes y por qué el fine-tuning completo exige otro tipo de máquina.
Leer la guía - Pago · 8 min
Pagar un servidor en cripto
Qué ocurre realmente entre pulsar pagar y obtener root, qué moneda elegir, y los cuatro errores que hacen perder dinero en un primer pago.
Leer la guía - Dimensionamiento · 9 min
Cuánta VRAM necesita realmente un modelo
La aritmética que hay detrás de «¿cabe?»: los pesos, la caché KV, y los dos puntos en los que una regla general se equivoca por un factor de tres.
Leer la guía