Servire Llama 3.3 70B su un nodo.
Da una macchina consegnata cinque minuti fa a un endpoint compatibile con OpenAI che risponde alle richieste — con i due flag che dimezzano silenziosamente il throughput e quello che espone a una compromissione.
La risposta breve
- Memoria necessaria
- 43 GB a 4-bit, 82 GB a FP8, 164 GB a BF16 — tutti a un contesto di 8k
- La macchina più semplice
- Una scheda da 80 GB. Nessuno sharding, nessuna interconnessione, nessuna sincronizzazione
- Tempo al primo token
- Meno di quindici minuti dalla consegna, la maggior parte spesa a scaricare i pesi
- L’unico errore
- Pubblicare la porta 8000 su un indirizzo pubblico. Non ha autenticazione
Cosa serve
70 miliardi di parametri. A 4 bit sono 35 GB di pesi; la cache KV aggiunge 2.5 GB a un contesto di 8k per una singola richiesta, e l’overhead di runtime è di circa il 15%. Tutto il resto discende da questi tre numeri — la guida al dimensionamento della VRAM mostra da dove provengono.
| Precisione | Pesi | Totale a 8k | Totale a 32k | Totale 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 |
Noti la riga a 4 bit e 128k: i pesi si riducono a 35 GB ma la cache non si riduce affatto, perché AWQ e GPTQ quantizzano solo i pesi. Questo unico fatto decide gran parte della scelta della macchina qui sotto.
Scegliere il nodo
Le macchine più economiche del nostro catalogo che contengono questo modello su una scheda singola, la configurazione da preferire quando possibile — niente sharding significa niente sincronizzazione e una cosa in meno da correggere.
| Nodo | La precisione che ci sta | Memoria della scheda | tok/s stimati | Al mese |
|---|---|---|---|---|
| NVIDIA RTX A6000 | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $286/mese |
| 2 × NVIDIA RTX A6000 | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $597/mese |
| NVIDIA L40S | 4-bit (AWQ, GPTQ) | 48 GB | ~11 | $714/mese |
| NVIDIA A100 PCIe | 4-bit (AWQ, GPTQ) | 80 GB | ~25 | $1,091/mese |
Il throughput è la generazione a flusso singolo, limitata dalla larghezza di banda della memoria, ed è deliberatamente conservativa. Con il batching continuo il totale aggregato tra le richieste concorrenti è più volte superiore — è proprio questo il senso di vLLM.
Dieci minuti di configurazione
Qui nulla è specifico di noi tranne l’indirizzo. Docker, il NVIDIA Container Toolkit e uno stack di driver funzionante sono già sulla macchina.
$ 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
Avviare il server
Un container. La prima esecuzione scarica circa 40 GB di pesi quantizzati, il che su una porta da 1 Gbit/s richiede pochi minuti; ogni riavvio successivo è questione di secondi.
$ 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}'
I flag che contano
Non pubblicarlo al mondo
0.0.0.0 su un indirizzo pubblico, diventa un server di inferenza aperto, e gli scanner li trovano in poche ore. Noti il -p 127.0.0.1:8000:8000 nel comando sopra — quell’indirizzo iniziale è ciò che lo tiene fuori da internet, ed è il singolo carattere più spesso perso quando si copia un comando da un’altra fonte.
Lo raggiunga dalla propria macchina tramite un tunnel SSH — nessuna porta aperta, nessun certificato da gestire, niente da configurare male:
$ 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.
Se deve davvero essere pubblico, metta un reverse proxy davanti con TLS e una chiave API, e limiti anche gli indirizzi di origine nel firewall. La documentazione contiene un set minimo di regole. Prudenza ridondante è l’atteggiamento corretto per un endpoint che risponde a chiunque lo interroghi.
Aumentare il throughput
Nell’ordine in cui vale la pena provarli. I primi due sono gratuiti e di solito danno i guadagni maggiori.
- Riduca
--max-model-lenal contesto realmente utilizzato. Quasi sempre il singolo miglioramento più grande, e non costa nulla di ciò che stava già usando. - Alzi
--gpu-memory-utilizationa 0.95. Questa è una macchina dedicata; non c’è nient’altro sulla scheda per cui lasciare spazio. - Attivi la cache KV FP8 se la scheda la supporta. Raddoppia ciò che può contenere.
- Raggruppi le richieste lato client. Il batching continuo aiuta solo se le richieste arrivano in concorrenza. Le richieste una alla volta lasciano la maggior parte della scheda inattiva, qualunque sia la configurazione.
- Solo a quel punto, e non prima, consideri una scheda più veloce. La generazione è limitata dalla larghezza di banda della memoria, quindi una H200 a 4.800 GB/s è circa 2,4× una H100 PCIe a 2.000 per lo stesso modello — un guadagno reale, ed è la voce più costosa di questo elenco.
$ 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 attivo
Tre cose che vale la pena fare il primo giorno, perché scoprirle tutte e tre il quattordicesimo è fastidioso.
Politica di riavvio
--restart unless-stopped è nel comando sopra. Dopo un riavvio il container torna attivo e i pesi sono già su /scratch, quindi è di nuovo operativo in meno di un minuto.
Osservi la scheda, non il processo
Una GPU caduta dal bus mantiene un container dall’aspetto integro. nvidia-smi -q -d PERFORMANCE in un controllo di salute la rileva; un controllo della porta no.
I pesi non hanno backup
Sono sul suo NVMe locale e da nessun’altra parte. Va bene così — sono riscaricabili. I suoi adapter di fine-tuning non lo sono, quindi li metta al sicuro fuori dalla macchina.
E quando la durata termina, i dischi vengono cancellati entro l’ora, senza periodo di tolleranza. Tutto ciò che è su /scratch scompare con essi. È una scelta deliberata — è la stessa garanzia per cui la macchina consegnata non conteneva dati di nessun altro — ma significa che l’ultimo giorno della durata non è il giorno in cui iniziare a copiare i dati altrove.
Verifichi questo modello su ogni nodo che noleggiamo.
Il configuratore indica quali configurazioni lo contengono su una scheda singola, quali devono suddividerlo, e quanto costa ciascuna.
Altre guide
- Pratica · 10 min
Fine-tuning di un modello da 70B su una scheda
QLoRA su una sola GPU da 48 GB: cosa ci sta, quanto costa al mese, e perché il fine-tuning completo richiede una macchina di un altro livello.
Leggi la guida - Pagamento · 8 min
Pagare un server in cripto
Cosa succede realmente tra il clic su paga e l’ottenimento del root, quale moneta scegliere, e i quattro errori che fanno perdere denaro al primo pagamento.
Leggi la guida - Dimensionamento · 9 min
Quanta VRAM serve davvero a un modello
L’aritmetica dietro «ci sta»: pesi, cache KV, e i due punti dove una regola empirica sbaglia di un fattore tre.
Leggi la guida