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)

$ docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi

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)

$ docker run -d --name vllm --gpus all -p 8000:8000 \ -v vllm_hf_cache:/root/.cache/huggingface \ --restart unless-stopped \ vllm/vllm-openai:latest \ --model Qwen/Qwen3.6-27B-Instruct-AWQ \ --max-model-len 16384 \ --gpu-memory-utilization 0.92

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)

$ curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model": "Qwen/Qwen3.6-27B-Instruct-AWQ", "messages": [{"role": "user", "content": "Rispondi con una parola: funziona?"}]}'

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):

services: vllm: image: vllm/vllm-openai:latest command: --model Qwen/Qwen3.6-27B-Instruct-AWQ --max-model-len 16384 --gpu-memory-utilization 0.92 ports: ["8000:8000"] volumes: ["vllm_hf_cache:/root/.cache/huggingface"] restart: unless-stopped deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] open-webui: image: ghcr.io/open-webui/open-webui:main ports: ["3000:8080"] environment: - OPENAI_API_BASE_URL=http://vllm:8000/v1 - OPENAI_API_KEY=local volumes: ["open_webui:/app/backend/data"] restart: unless-stopped depends_on: [vllm] volumes: vllm_hf_cache: open_webui:
$ docker rm -f vllm # rimuovi prima il container del passo 3
$ docker compose up -d

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.

Prossimi passi