Lokale Installation und Betrieb von LLMs mit vLLM
vLLM ist ein hochdurchsatzorientiertes Inference-Framework für Hugging-Face-Modelle. Im Vergleich zu llama.cpp liegt der Fokus auf kontinuierlichem Batching und PagedAttention — das macht vLLM besonders interessant wenn mehrere Requests gleichzeitig bedient werden sollen. Für Einzelnutzer im Homelab ist llama.cpp oft die einfachere Wahl; vLLM lohnt sich wenn der Throughput wichtiger ist als unkomplizierte Konfiguration.
Voraussetzungen
- NVIDIA GPU mit CUDA-Support (Ampere oder neuer empfohlen)
- Mindestens 8 GB VRAM für kleinere Modelle; für 7B-Klasse realistisch 10–12 GB
- Python 3.10–3.12
- CUDA 12.1 oder neuer
CUDA und Treiber prüfen:
nvcc --version
nvidia-smi
System vorbereiten und uv installieren
uv ist ein moderner Python-Paketmanager von Astral — deutlich
schneller als pip, zuverlässigere Dependency-Resolution, empfehlenswert für alle
Python-basierten AI-Projekte.
Linux:
sudo apt update && sudo apt upgrade -y
sudo apt install curl
curl -LsSf https://astral.sh/uv/install.sh | sh
Shell neu laden damit uv im PATH liegt:
source ~/.bashrc
# oder
source ~/.zshrc
Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
vLLM installieren
Eine virtuelle Umgebung anlegen und vLLM darin installieren:
uv venv vllm-env --python 3.12
source vllm-env/bin/activate
uv pip install vllm
Auf Windows:
uv venv vllm-env --python 3.12
vllm-env\Scripts\activate
uv pip install vllm
Die Installation zieht PyTorch mit CUDA-Support automatisch — das sind mehrere GB, also etwas Geduld einplanen.
Installation verifizieren:
python -c "import vllm; print(vllm.__version__)"
Erstes Modell starten
vLLM lädt Modelle direkt von Hugging Face. Beim ersten Start wird das Modell
heruntergeladen und im Cache gespeichert (~/.cache/huggingface).
Beispiel mit Qwen3 4B (passt gut auf 12 GB VRAM):
vllm serve Qwen/Qwen3-4B-Instruct \
--host 0.0.0.0 \
--port 8000
Beispiel mit Gemma 3 12B auf 24 GB VRAM (Arbeitsumgebung):
vllm serve google/gemma-3-12b-it \
--host 0.0.0.0 \
--port 8000 \
--dtype bfloat16
Wenn der Server läuft, ist die API unter http://localhost:8000 erreichbar und
OpenAI-kompatibel — LiteLLM, Open WebUI und andere Clients können direkt damit
arbeiten.
API testen
Verfügbare Modelle anzeigen:
curl http://localhost:8000/v1/models
Chat-Request absetzen:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-4B-Instruct",
"messages": [
{"role": "user", "content": "Was ist der Unterschied zwischen vLLM und llama.cpp?"}
]
}'
Wichtige Start-Parameter
| Parameter | Beschreibung | Beispiel |
|---|---|---|
--host |
Bind-Adresse | 0.0.0.0 für Netzwerkzugriff |
--port |
Port | 8000 |
--max-model-len |
Maximale Kontextlänge | 8192 |
--gpu-memory-utilization |
VRAM-Auslastung (0–1) | 0.85 |
--dtype |
Datentyp | bfloat16 oder float16 |
--quantization |
Quantisierungsmethode | awq, gptq |
--tensor-parallel-size |
Multi-GPU-Parallelität | 2 für zwei GPUs |
--gpu-memory-utilization ist praktisch wenn vLLM zu viel VRAM belegt und OOM
wirft. Default ist 0.9 — auf 0.8 oder 0.85 reduzieren wenn andere Prozesse auch
VRAM brauchen.
--max-model-len begrenzt den KV-Cache. Bei 12 GB VRAM macht es Sinn, diesen
Wert explizit zu setzen:
vllm serve Qwen/Qwen3-4B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.85
Quantisierte Modelle verwenden
Wer auf VRAM-Budget achten muss, nutzt AWQ- oder GPTQ-quantisierte Varianten — die meisten großen Modellreihen haben diese direkt auf Hugging Face:
vllm serve Qwen/Qwen3-7B-Instruct-AWQ \
--quantization awq \
--host 0.0.0.0 \
--port 8000
Als systemd-Service betreiben
Für dauerhaften Betrieb auf einem Linux-Server:
[Unit]
Description=vLLM Inference Server
After=network.target
[Service]
Type=simple
User=DEIN_USER
WorkingDirectory=/home/DEIN_USER
ExecStart=/home/DEIN_USER/vllm-env/bin/vllm serve Qwen/Qwen3-4B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
Speichern als /etc/systemd/system/vllm.service, dann:
sudo systemctl daemon-reload
sudo systemctl enable vllm
sudo systemctl start vllm
sudo systemctl status vllm
Fehlerbehebung
CUDA out of memory beim Start
--gpu-memory-utilization reduzieren oder --max-model-len kleiner setzen. vLLM
reserviert beim Start den gesamten kalkulierten KV-Cache — das ist kein Bug,
sondern das Design.
Modell lädt aber Requests schlagen fehl
Prüfen ob der --max-model-len mit der Kontextlänge des Modells kompatibel ist.
Manche Modelle haben eine maximale Länge die vLLM nicht automatisch erkennt.
Langsame erste Anfrage Normal — vLLM kompiliert beim ersten Request CUDA-Kernel. Ab der zweiten Anfrage läuft es mit voller Geschwindigkeit.
vLLM vs. llama.cpp — wann was?
| vLLM | llama.cpp | |
|---|---|---|
| Modellformat | Safetensors (HF) | GGUF |
| Stärke | Hoher Durchsatz, Parallelität | Feingranulare Kontrolle, Offline |
| VRAM-Overhead | Höher | Niedriger |
| Konfiguration | Einfacher für HF-Modelle | Flexibler für GGUF-Ökosystem |
| Produktionstauglich | Ja | Ja (llama-server) |
Für meinen Arbeitscluster bleibt llama.cpp die erste Wahl — das GGUF-Ökosystem, die LiteLLM-Integration und der niedrigere VRAM-Overhead passen besser. vLLM kommt ins Spiel wenn ein Modell nur als Safetensors verfügbar ist oder wenn ich unter echter Parallellast testen will.