Cosa ti serve
- Un host Linux (o Windows + WSL2) con GPU NVIDIA, 24GB di VRAM consigliati
- Docker + NVIDIA Container Toolkit installati (il toolkit รจ ciรฒ che passa la GPU nei container)
- ~30GB liberi su disco per la cache dei modelli
Passo 1 โ Verifica il passthrough GPU (2 min)
Se vedi la tua GPU elencata, il collegamento DockerโGPU funziona. Se ottieni "could not select device driver", installa l'NVIDIA Container Toolkit (nvidia-ctk runtime configure) e riavvia Docker.
Passo 2 โ Scegli il modello: AWQ, non GGUF (2 min)
L'errore classico in questo passo: il percorso nativo di vLLM serve pesi full-precision, AWQ, GPTQ o FP8 โ non i file GGUF che usa Ollama (vedi la guida alla quantizzazione). Per una scheda da 24GB, una build AWQ classe ~27B (โ16GB di pesi) lascia spazio sano per la KV-cache. Useremo una build AWQ di Qwen3.6-27B come esempio โ sostituisci con il repo AWQ del tuo modello preferito da Hugging Face.
Passo 3 โ Avvia vLLM (10 min incluso download)
I tre flag che contano:
--max-model-lenโ il contesto massimo per richiesta. vLLM pre-pianifica la memoria della KV-cache attorno a questo valore: piรน grande = meno sequenze concorrenti. 16K รจ un buon default da team.--gpu-memory-utilizationโ frazione di VRAM che vLLM riserva (default 0,9). Alza a 0,92โ0,95 su una scheda dedicata; abbassala se la GPU pilota anche il monitor.-v vllm_hf_cacheโ rende persistente il modello scaricato, cosรฌ ricreare il container non riscarica 16GB.
Osserva l'avvio con docker logs -f vllm โ รจ pronto quando stampa la riga Uvicorn "running on 0.0.0.0:8000".
Passo 4 โ Testa la API (2 min)
Una risposta JSON = il tuo team ha ora un endpoint privato compatibile OpenAI. Qualsiasi SDK OpenAI ci funziona impostando base_url su http://IP-SERVER:8000/v1 (api_key puรฒ essere qualsiasi stringa, o imponine una con --api-key).
Passo 5 โ Aggiungi Open WebUI con docker-compose (10 min)
Per un setup durevole, sposta entrambi i servizi in un unico file compose (docker-compose.yml):
Apri http://IP-SERVER:3000, crea l'account amministratore e invita il team. Entrambi i servizi ora ripartono automaticamente con l'host.
Passo 6 โ Monitora e dimensiona per la concorrenza (continuativo)
- vLLM esporta metriche Prometheus su http://IP-SERVER:8000/metrics โ quelle da osservare sono le richieste running/waiting (coda che cresce = saturazione) e l'uso della KV-cache. Graficale in Grafana dal giorno uno.
- Matematica della concorrenza: memoria KV-cache โ cache per token ร contesto ร sequenze concorrenti. Se gli utenti segnalano code, abbassa --max-model-len (libera cache โ piรน sequenze concorrenti) o passa a una GPU piรน grande/una seconda. La matematica completa รจ nella guida VRAM.
- Occhio ai consumi: una GPU di serving lavora 9-18 โ un power limit (nvidia-smi -pl) scambia ~5โ10% di velocitร per 25โ30% di energia.
Risoluzione dei problemi
- CUDA out of memory all'avvio โ modello + cache pianificata non entrano: abbassa --max-model-len (prima leva), abbassa --gpu-memory-utilization, o scegli un modello AWQ piรน piccolo.
- "Cannot load GGUF" / errori di formato โ hai puntato vLLM a un repo GGUF. Usa invece la build AWQ (o GPTQ/FP16) del modello.
- La prima richiesta รจ lenta โ normale: warmup dei grafi CUDA. Giudica la latenza dalla seconda richiesta in poi.
- La WebUI non vede il modello โ verifica che OPENAI_API_BASE_URL punti a http://vllm:8000/v1 (nome del servizio, non localhost) e che il container vllm sia healthy in docker compose ps.