Tutti i 6 data center operativi

Pagamento in cripto · Nessuna verifica d’identità · Accesso root in in meno di 5 minuti

Guida Pratica · 11 min di lettura

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.

Memoria necessaria per Llama 3.3 70B, per precisione e contesto
PrecisionePesi Totale a 8kTotale a 32kTotale a 128k
BF16 / FP16Qualità reference 140 GB 164 GB 173 GB 207 GB
FP8Quasi reference, Hopper e Blackwell 70 GB 82 GB 86 GB 103 GB
4-bit (AWQ, GPTQ)Pesi più piccoli, la cache resta FP16 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.

Nodi che contengono Llama 3.3 70B su una scheda
NodoLa precisione che ci staMemoria della schedatok/s stimatiAl mese
NVIDIA RTX A6000PCIe 5.0 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $286/mese
2 × NVIDIA RTX A6000PCIe 5.0 ×16 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $597/mese
NVIDIA L40SPCIe 5.0 · 864 GB/s 4-bit (AWQ, GPTQ) 48 GB ~11 $714/mese
NVIDIA A100 PCIePCIe 5.0 · 1,935 GB/s 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.

Confermare la macchina, poi dare ai pesi un posto dove stare
$ 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.

vLLM, scheda singola, 4 bit
$ 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
Prima richiesta
$ 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

--max-model-lenImpostarlo al contesto realmente servitovLLM riserva la cache KV per il massimo dichiarato. Dichiarare 131072 quando si serve 8192 spreca sedici volte la memoria necessaria, e il sintomo è «concorrenza insufficiente», non un errore.
--gpu-memory-utilization0.90 to 0.95La frazione della scheda che vLLM può riservarsi. Tutto ciò che non riserva viene sprecato; lasciare il valore predefinito di 0.90 su una macchina dedicata costa concorrenza reale. Non superi 0.95.
--ipc=hostObbligatorio, non facoltativoSenza di esso, la memoria condivisa del container è limitata a 64 MB. Su una scheda singola può capitare di cavarsela; su un modello suddiviso NCCL si blocca senza un errore utile.
--tensor-parallel-sizeSolo quando il modello non ci staApplicare lo sharding a un modello che ci sta su una scheda sola lo rende più lento. Consulti la guida all’interconnessione — è il modo più comune in assoluto per far rendere un nodo costoso peggio di uno economico.
--kv-cache-dtype fp8Dimezza la cacheSu Hopper e Blackwell. Raddoppia il contesto o la concorrenza gestibile, a un costo in qualità di norma non misurabile. Il guadagno più facile di questo elenco.
--max-num-seqsLimitarla alla concorrenza realeLasciarlo a 256 su una macchina che serve otto utenti significa che vLLM pianifica per 256 e ammette richieste che non può gestire, il che si manifesta come picchi di latenza piuttosto che rifiuti.

Non pubblicarlo al mondo

L’API compatibile con OpenAI non ha autenticazione per impostazione predefinita. Associato a 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:

Dal proprio laptop
$ 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.

  1. Riduca --max-model-len al contesto realmente utilizzato. Quasi sempre il singolo miglioramento più grande, e non costa nulla di ciò che stava già usando.
  2. Alzi --gpu-memory-utilization a 0.95. Questa è una macchina dedicata; non c’è nient’altro sulla scheda per cui lasciare spazio.
  3. Attivi la cache KV FP8 se la scheda la supporta. Raddoppia ciò che può contenere.
  4. 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.
  5. 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.
Misuri prima e dopo — non indovini
$ 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.

Accedi

Console, ricevute e accesso fuori banda.

Non ha ancora un account?

Non esiste una registrazione separata. Il suo account viene creato mentre effettua il suo primo ordine — sceglie l’email e la password nella fase di pagamento, e la console è già aperta quando lo è la macchina.

Configura un server

Language