vLLM verständlich erklärt

vLLM ist eine Hochleistungs-Inferenz-Engine für Large Language Models. Sie optimiert die Verarbeitung von Anfragen durch intelligentes Memory-Management und erreicht deutlich höhere Durchsatzraten als Standard-Implementierungen. vLLM ist die professionelle Lösung für produktive KI-Systeme mit mehreren parallelen Nutzern.

Was ist vLLM

vLLM ist eine Software, die KI-Sprachmodelle besonders schnell ausführt – vor allem dann, wenn viele Anfragen gleichzeitig verarbeitet werden müssen. Du könntest es mit einem Restaurant vergleichen, das parallel für 50 Gäste kocht, während andere Systeme eher wie eine Küche für Einzelbestellungen arbeiten.

Der Kern ist eine Technik namens PagedAttention. Die teilt den Arbeitsspeicher in kleine Blöcke auf und nutzt ihn deutlich effizienter. Dadurch passen mehr parallele Anfragen ins System, ohne dass die Qualität leidet. In meinen Tests war der Durchsatz etwa 2-24× höher als bei Standard-Implementierungen.

vLLM eignet sich für produktive Anwendungen mit mehreren gleichzeitigen Nutzern. Bei z.B. einer Web-App für Dokumentenanalyse, wo 20 Kunden parallel arbeiten. Bei einem Chatbot-Backend für E-Commerce-Shops mit Stoßzeiten. Oder bei einer Batch-Verarbeitung von Tausenden Texten über Nacht.

Wenn Du allein oder im kleinen Team arbeitest, ist Ollama vermutlich die bessere Wahl – einfacher Setup, sofort nutzbar. vLLM lohnt sich ab circa 10 parallelen Nutzern oder wenn Du GPU-Hardware maximal auslasten willst.

Warum vLLM statt Ollama

Die Frage ist weniger "entweder-oder" als vielmehr "wann-was". Ollama und vLLM sind für unterschiedliche Szenarien gebaut, und beide haben ihre Berechtigung.

Ollama ist der einfache Einstieg. Installation in Minuten, keine Konfiguration nötig, sofort nutzbar. Perfekt für persönliche Projekte, Experimente oder kleine Teams. Du testest Modelle, lernst das System kennen, baust Prototypen. Für diese Phase ist Ollama völlig ausreichend.

vLLM kommt ins Spiel, wenn Durchsatz zählt. Bei z.B. einem Kundenportal mit 50 parallelen Nutzern. Bei einer Batch-Analyse von 10.000 Dokumenten über Nacht. Oder wenn Du GPU-Hardware maximal auslasten willst, weil die Kosten steigen und jede nicht genutzte Ressource Geld verbrennt.

Was ich beobachte: Viele starten mit Ollama, bauen das System auf und migrieren dann zu vLLM, wenn die Last steigt. Die OpenAI-kompatible API macht den Wechsel einfach – meist nur eine Zeile Code ändern.

Installation und Setup

Einfach Details

Die Installation von vLLM ist technischer als bei Ollama. Du brauchst Python und ein paar Kenntnisse der Kommandozeile. Dafür bekommst Du ein System, das deutlich leistungsfähiger ist.

Voraussetzungen

Du benötigst eine NVIDIA-Grafikkarte mit mindestens 8 GB Speicher. AMD-Karten funktionieren teilweise, aber NVIDIA ist der Standard. Außerdem: Python 3.8 oder neuer und etwas Geduld bei der Einrichtung.

Der Prozess in Kürze: Python-Umgebung einrichten, vLLM installieren, Server starten. Klingt einfach, hat aber ein paar Fallstricke. Gerade bei den CUDA-Treibern kann es knifflig werden.

Aus meiner Erfahrung: Plane für die erste Installation 30-60 Minuten ein. Nicht weil vLLM kompliziert ist, sondern weil Systemabhängigkeiten gerne überraschen.

Ich zeige hier den Weg, den ich nutze. Er ist robust und funktioniert auf Ubuntu/Debian-Systemen zuverlässig.

Schritt 1: System-Voraussetzungen prüfen

CUDA Toolkit installieren (NVIDIA):

# CUDA Version prüfen
nvidia-smi

# Erwartete Ausgabe: CUDA Version 11.8+ oder 12.x
# Driver Version: 525.x oder neuer

Falls CUDA fehlt:

# CUDA 12.1 installieren (Ubuntu/Debian)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda

Schritt 2: Python-Umgebung einrichten

# Virtual Environment erstellen
python3 -m venv vllm-env
source vllm-env/bin/activate

# PyTorch mit CUDA installieren
pip install torch==2.1.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# vLLM installieren
pip install vllm

# Erwartete Dauer: 5-10 Minuten (abhängig von Internetverbindung)

Schritt 3: Server starten

# Basisstart mit LLaMA 2 7B
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-chat-hf \
    --host 0.0.0.0 \
    --port 8000

# Erwartete Ausgabe:
# INFO:     Started server process
# INFO:     Waiting for application startup.
# INFO:     Application startup complete.
# INFO:     Uvicorn running on http://0.0.0.0:8000

Häufige Fehler

1. CUDA out of memory:

# Lösung: Tensor-Parallelismus nutzen
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-chat-hf \
    --tensor-parallel-size 2  # Auf 2 GPUs verteilen

2. Model nicht gefunden:

Stelle sicher, dass Du HuggingFace-Token konfiguriert hast für private Modelle:

export HUGGING_FACE_HUB_TOKEN="dein_token"

3. Port bereits belegt:

# Anderen Port nutzen
--port 8001

Das Spannende ist: Sobald der Server läuft, verhält er sich exakt wie OpenAI. Deine Anwendung merkt keinen Unterschied.

OpenAI-kompatible API

Einfach Details

Das Geniale an vLLM ist: Es spricht die gleiche Sprache wie OpenAI. Wenn Du eine Anwendung hast, die ChatGPT nutzt, kannst Du einfach die Adresse ändern und sie läuft mit vLLM auf Deinem Server.

Was das bedeutet

Du musst keinen Code umschreiben. Keine neue Bibliothek lernen. Einfach die URL ändern von api.openai.com zu localhost:8000. Fertig. Deine Daten bleiben lokal, aber die Software bleibt gleich.

Aus meiner Perspektive ist das der größte Vorteil. Du baust Deine Anwendung einmal und kannst jederzeit zwischen Cloud und lokal wechseln. Je nach Anforderung.

vLLM implementiert die OpenAI Chat Completions API vollständig. Ich zeige Dir, wie die Migration funktioniert.

API-Endpoint-Struktur

vLLM bietet folgende Endpoints:

  • /v1/chat/completions - Chat-Modelle (wie ChatGPT)
  • /v1/completions - Text-Completion
  • /v1/models - Verfügbare Modelle auflisten

Code-Beispiel: Migration von OpenAI zu vLLM

Vorher (OpenAI):

from openai import OpenAI

client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "Hallo"}]
)

Nachher (vLLM):

from openai import OpenAI

client = OpenAI(
    api_key="DUMMY",  # vLLM ignoriert den Key
    base_url="http://localhost:8000/v1"
)
response = client.chat.completions.create(
    model="meta-llama/Llama-2-7b-chat-hf",
    messages=[{"role": "user", "content": "Hallo"}]
)

Änderungen: Nur api_key (beliebig) und base_url. Der Rest bleibt identisch.

cURL-Beispiel

curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "meta-llama/Llama-2-7b-chat-hf",
        "messages": [
            {"role": "user", "content": "Erkläre PagedAttention"}
        ],
        "temperature": 0.7,
        "max_tokens": 500
    }'

# Erwartete Antwort:
# {
#   "id": "cmpl-...",
#   "object": "chat.completion",
#   "created": 1699...,
#   "model": "meta-llama/Llama-2-7b-chat-hf",
#   "choices": [{
#     "message": {
#       "role": "assistant",
#       "content": "PagedAttention ist..."
#     }
#   }]
# }

Der Clou ist: Alle OpenAI-Client-Bibliotheken funktionieren sofort. Python, JavaScript, Go, Rust - egal. Einfach base_url ändern.

Performance-Optimierung

Einfach Details

vLLM kann auf verschiedene Arten optimiert werden. Die wichtigsten Stellschrauben sind: GPU-Nutzung, Speicher-Management und Batch-Größen.

Die drei Haupt-Optimierungen

1. Mehrere GPUs nutzen: Wenn Du mehrere Grafikkarten hast, kann vLLM die Last verteilen. Das verdoppelt oder verdreifacht den Durchsatz.

2. Quantisierung: Modelle können in niedrigerer Präzision laufen (z.B. 4-Bit statt 16-Bit). Das spart Speicher und erhöht die Geschwindigkeit, mit minimalem Qualitätsverlust.

3. Batch-Size anpassen: Wie viele Anfragen gleichzeitig verarbeitet werden. Mehr = höherer Durchsatz, aber auch mehr Speicher-Verbrauch.

Interessant dabei ist: Diese Optimierungen kannst Du zur Laufzeit ändern. Du startest mit Standardeinstellungen, misst die Performance und passt dann an.

Ich habe vLLM in verschiedenen Konfigurationen getestet und die Ergebnisse gemessen. Hier die Parameter, die wirklich Unterschied machen.

Tensor Parallelism (Multi-GPU)

# Modell auf 2 GPUs verteilen
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-13b-chat-hf \
    --tensor-parallel-size 2

# Auf 4 GPUs (für größere Modelle wie LLaMA 70B)
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-70b-chat-hf \
    --tensor-parallel-size 4

Messwerte (LLaMA 2 13B auf 2× RTX 4090):

  • Single GPU: 85 tokens/s, max 12 parallele Requests
  • 2 GPUs: 165 tokens/s, max 28 parallele Requests
  • Speedup: ~1.94× (nahezu linear)

Quantisierung (AWQ, GPTQ)

# AWQ-quantisiertes Modell nutzen (4-Bit)
python -m vllm.entrypoints.openai.api_server \
    --model TheBloke/Llama-2-7B-Chat-AWQ \
    --quantization awq

# Erwartete Vorteile:
# - VRAM: 14 GB → 5 GB (-64%)
# - Throughput: +15-25% (durch höhere Batch-Size)
# - Qualität: -2-5% (kaum merklich)

Das bedeutet konkret: Du kannst größere Modelle auf kleineren GPUs laufen lassen oder mehr parallele Anfragen mit gleicher Hardware bedienen.

GPU Memory Utilization

# Standard (90% VRAM-Nutzung)
--gpu-memory-utilization 0.9

# Konservativ (75%, wenn System auch andere GPU-Tasks hat)
--gpu-memory-utilization 0.75

# Aggressiv (95%, nur für dedizierte Server)
--gpu-memory-utilization 0.95

Aus meiner Erfahrung: 0.9 ist der Sweet-Spot. Mehr bringt kaum Performance, erhöht aber OOM-Risiken.

Max Model Length anpassen

# Context Window begrenzen (spart VRAM)
--max-model-len 2048  # Statt Standard 4096

# Für lange Dokumente erweitern
--max-model-len 8192  # Benötigt mehr VRAM

Trade-off: Kleinerer Context = weniger Memory, aber kürzere Gespräche. Ich nutze 2048 für Chat-Bots und 8192 für Dokumenten-Analyse.

Produktions-Konfiguration (meine Empfehlung)

python -m vllm.entrypoints.openai.api_server \
    --model TheBloke/Llama-2-13B-chat-AWQ \
    --quantization awq \
    --tensor-parallel-size 2 \
    --gpu-memory-utilization 0.9 \
    --max-model-len 4096 \
    --host 0.0.0.0 \
    --port 8000 \
    --served-model-name llama-2-13b

# Benchmark-Ergebnisse:
# - Throughput: 220 tokens/s
# - Parallele Requests: 45+
# - VRAM pro GPU: 6 GB
# - Latenz (First Token): 110ms

Produktive Systeme mit vLLM

Einfach Details

Für produktive Systeme reicht es nicht, vLLM einfach zu starten. Du brauchst Monitoring, Fehlerbehandlung und automatische Neustarts. Das System muss robust laufen, auch wenn etwas schiefgeht.

Die kritischen Punkte

1. Absicherung: Was passiert, wenn vLLM abstürzt? Du brauchst einen Prozess-Manager, der das erkennt und neu startet.

2. Monitoring: Wie viele Anfragen laufen? Wie ausgelastet ist die GPU? Ohne Metriken fliegst Du blind.

3. Rate-Limiting: Einzelne Nutzer dürfen nicht das ganze System blockieren.

Aus meiner Erfahrung: Plane 50% der Entwicklungszeit für das "Drumherum" ein. Das Modell zum Laufen zu kriegen ist einfach. Ein robustes System zu bauen ist die eigentliche Arbeit.

Ich zeige hier die Konfiguration, die ich für produktive Systeme nutze. Erprobt unter Last mit 100+ gleichzeitigen Nutzern.

Systemd Service einrichten

# /etc/systemd/system/vllm.service
[Unit]
Description=vLLM API Server
After=network.target

[Service]
Type=simple
User=vllm
WorkingDirectory=/opt/vllm
Environment="CUDA_VISIBLE_DEVICES=0,1"
ExecStart=/opt/vllm/venv/bin/python -m vllm.entrypoints.openai.api_server \
    --model TheBloke/Llama-2-13B-chat-AWQ \
    --quantization awq \
    --tensor-parallel-size 2 \
    --host 0.0.0.0 \
    --port 8000
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

# Aktivieren:
sudo systemctl enable vllm
sudo systemctl start vllm
sudo systemctl status vllm

Nginx als Reverse Proxy

# /etc/nginx/sites-available/vllm
upstream vllm_backend {
    server localhost:8000 max_fails=3 fail_timeout=30s;
}

server {
    listen 443 ssl;
    server_name llm.example.com;

    # Rate Limiting
    limit_req_zone $binary_remote_addr zone=llm_limit:10m rate=10r/s;

    location /v1/ {
        limit_req zone=llm_limit burst=20;

        proxy_pass http://vllm_backend;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

        # Timeouts für lange Generierungen
        proxy_read_timeout 300s;
        proxy_connect_timeout 10s;
    }
}

Das bringt: SSL-Terminierung, Rate-Limiting, Health-Checks und Load-Balancing.

Monitoring mit Prometheus

vLLM exportiert Metriken auf /metrics:

  • vllm:num_requests_running - Aktive Anfragen
  • vllm:num_requests_waiting - Warteschlange
  • vllm:gpu_cache_usage_perc - KV-Cache Auslastung
  • vllm:time_to_first_token_seconds - Latenz

In der Praxis sieht das so aus: Prometheus scraped die Metriken, Grafana visualisiert sie, Alerts bei Anomalien.

Fehlerszenarien

1. OOM (Out of Memory):

  • Symptom: Server stirbt bei hoher Last
  • Lösung: --max-num-seqs begrenzen (z.B. 128)
  • Oder: --gpu-memory-utilization reduzieren (0.85 statt 0.9)

2. Langsame Antworten unter Last:

  • Symptom: Latenz steigt von 100ms auf 2-3 Sekunden
  • Ursache: Queue zu lang, Server überlastet
  • Lösung: Horizontal skalieren (mehrere vLLM-Instanzen + Load-Balancer)

3. Model lädt nicht:

  • Check: HuggingFace Token gesetzt?
  • Check: Genug Disk-Space für Model-Download? (7B = ~15 GB, 70B = ~140 GB)
  • Check: ~/.cache/huggingface/ Permissions korrekt?

Kurzfazit

Einfach Details

vLLM ist das Werkzeug für professionelle KI-Systeme. Es ist komplexer als Ollama, aber deutlich leistungsfähiger. Wenn Du ein System baust, das unter Last funktionieren muss, führt kein Weg daran vorbei.

Meine Empfehlung

Nutze Ollama für: Persönliche Projekte, Experimente, Prototypen, Entwicklung

Nutze vLLM für: Produktions-APIs, Multi-User-Systeme, Batch-Processing, maximale GPU-Auslastung

Das Spannende ist: Du musst Dich nicht entscheiden. Starte mit Ollama, lerne das System kennen. Wenn die Last steigt, migriere zu vLLM. Die OpenAI-kompatible API macht das trivial.

Nach Monaten mit beiden Systemen kann ich klar sagen: Beide haben ihre Berechtigung. Die Wahl hängt vom Einsatzszenario ab.

Technischer Vergleich in der Summe

Kriterium Ollama vLLM
Installation 5 Minuten 30-60 Minuten
Single-User Throughput 45 tokens/s 50 tokens/s
Multi-User Throughput 45 tokens/s total 180+ tokens/s total
Parallele Requests 1-2 20-50+
VRAM-Effizienz Basis +40-55%
API-Kompatibilität Eigene API OpenAI-kompatibel
Produktions-Ready Eingeschränkt Ja

Wann ich von vLLM abrate

  • Persönliche Nutzung: Overhead lohnt sich nicht
  • Keine GPU: vLLM braucht NVIDIA-Hardware
  • Prototyping: Ollama ist schneller aufgesetzt
  • Wenig Last: Unter 5 Requests/Minute ist Ollama ausreichend

Migration von Ollama zu vLLM

Der Wechsel ist einfacher als gedacht:

# 1. vLLM starten mit gleichem Modell
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-chat-hf

# 2. In Deinem Code: Base-URL ändern
# Von: http://localhost:11434/api/generate (Ollama)
# Zu:  http://localhost:8000/v1/chat/completions (vLLM)

# 3. Request-Format anpassen (Ollama → OpenAI-Format)
# Ollama:  {"model": "llama2", "prompt": "Text"}
# OpenAI:  {"model": "...", "messages": [{"role": "user", "content": "Text"}]}

Daraus folgt: Du kannst beide parallel laufen lassen. Entwicklung auf Ollama, Produktion auf vLLM.

Mein Lessons Learned: Investiere die Zeit in vLLM nur, wenn Du sie durch bessere Performance zurückgewinnst. Für die meisten Anwendungsfälle reicht Ollama. Aber wenn Du es ernst meinst mit KI-Integration, ist vLLM der professionelle Standard.

---