Todos los 6 centros de datos operativos

Pagado en cripto · Sin verificación de identidad · Acceso root en en menos de 5 minutos

Guía de Práctica · 11 min de lectura

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.

Memoria necesaria para Llama 3.3 70B, por precisión y contexto
PrecisiónPesos Total a 8kTotal a 32kTotal a 128k
BF16 / FP16Calidad de referencia 140 GB 164 GB 173 GB 207 GB
FP8Casi de referencia, Hopper y Blackwell 70 GB 82 GB 86 GB 103 GB
4-bit (AWQ, GPTQ)Pesos más pequeños, la caché se mantiene en FP16 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.

Nodos que alojan Llama 3.3 70B en una tarjeta
NodoPrecisión que cabeMemoria de la tarjetatok/s estimadosAl mes
NVIDIA RTX A6000PCIe 5.0 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $286/mes
2 × NVIDIA RTX A6000PCIe 5.0 ×16 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $597/mes
NVIDIA L40SPCIe 5.0 · 864 GB/s 4-bit (AWQ, GPTQ) 48 GB ~11 $714/mes
NVIDIA A100 PCIePCIe 5.0 · 1,935 GB/s 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.

Confirme la máquina y, después, proporcione a los pesos un lugar donde alojarse
$ 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.

vLLM, una tarjeta, 4 bits
$ 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
Primera solicitud
$ 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

--max-model-lenAjústelo al contexto que sirvevLLM reserva caché KV para el máximo declarado. Declarar 131072 cuando sirve 8192 desperdicia dieciséis veces la memoria que necesita, y el síntoma es «concurrencia insuficiente», no un error.
--gpu-memory-utilization0.90 to 0.95La fracción de la tarjeta que vLLM puede reclamar. Todo lo que no reclama se desperdicia; dejar el valor predeterminado de 0.90 en una máquina dedicada le cuesta concurrencia real. No supere 0.95.
--ipc=hostObligatorio, no opcionalSin ella, la memoria compartida del contenedor queda limitada a 64 MB. En una sola tarjeta puede que no pase nada; en un modelo con sharding, NCCL se queda colgado sin ningún error útil.
--tensor-parallel-sizeSolo cuando el modelo no cabeAplicar sharding a un modelo que cabe en una tarjeta lo hace más lento. Consulte la guía de interconexión — esta es la forma más habitual de hacer que un nodo caro rinda peor que uno barato.
--kv-cache-dtype fp8Reduce su caché a la mitadEn Hopper y Blackwell. Duplica el contexto o la concurrencia que puede contener, a un coste de calidad que normalmente no es medible. La ganancia más fácil de esta lista.
--max-num-seqsLimítelo a su concurrencia realDejarlo en 256 en una máquina que sirve a ocho usuarios significa que vLLM planifica para 256 y admite solicitudes que no puede contener, lo que se manifiesta como picos de latencia en lugar de rechazos.

No publicarlo para todo el mundo

La API compatible con OpenAI no tiene autenticación de forma predeterminada. Vinculado a 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:

Desde su portátil
$ 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.

  1. Reduzca --max-model-len a su contexto real. Casi siempre es la mayor ganancia por sí sola, y no le cuesta nada que estuviera usando.
  2. Suba --gpu-memory-utilization a 0.95. Es una máquina dedicada; no hay nada más en la tarjeta para lo que dejar espacio.
  3. Active la caché KV en FP8 si la tarjeta lo permite. Duplica lo que puede contener.
  4. 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.
  5. 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.
Mida antes y después — no adivine.
$ 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.

Iniciar sesión

Consola, facturas y acceso fuera de banda.

¿Aún no tiene cuenta?

No hay un registro aparte. Su cuenta se crea mientras realiza su primer pedido — elige el correo electrónico y la contraseña en el paso de pago, y la consola está abierta para cuando lo está la máquina.

Configurar un servidor

Language