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.
No comments to display
No comments to display