Zum Inhalt springen

Ollama GPU-Performance
systematisch optimieren

Von 36 auf 60 tokens/s: Die komplette Diagnose und Optimierung eines Ollama-Servers mit NVIDIA RTX 4000. Zwei identische Systeme, eine 64% Performance-Differenz. Was lief schief und wie behebt man es systematisch?

Zum Inhalt

Die Ausgangslage


Bitte wähle die Ausführlichkeit:


Zwei baugleiche Hetzner GEX44 Server mit NVIDIA RTX 4000 SFF Ada (20GB VRAM), Debian 13, Ollama für lokale LLM-Inferenz. Beide mit dem gleichen Modell: gpt-oss:20b (20.9 Milliarden Parameter, MXFP4 Quantisierung).

Server A: 59.98 tokens/s bei Benchmark-Tests. Läuft sauber, GPU wird voll genutzt.

Server B: 36.54 tokens/s bei identischen Tests. Gleiche Hardware, gleiches Modell. Was lief schief?

Das sind nicht nur ein paar Prozent Differenz. Das sind 39% weniger Performance. Ich mag solche Probleme, weil sie nicht offensichtlich sind. Das System funktionierte ja, nur eben mit angezogener Handbremse.

Zur Diagnose-Checkliste

Die systematische Diagnose-Checkliste



Wenn Ollama zu langsam ist, gibt es eine klare Checkliste. Ich arbeite die immer der Reihe nach durch, vom größten Impact zum kleinsten:

  1. Ollama-Version prüfen: Alles unter 0.12.x ist veraltet
  2. Flash Attention aktiviert? Ohne geht es deutlich langsamer
  3. Wird die GPU genutzt? Oder läuft es auf der CPU?
  4. Context Length sinnvoll? Höher ist nicht immer besser
  5. GPU Clock im Idle? Dann fehlt Performance Mode

Diese fünf Punkte decken 95% aller Performance-Probleme ab. Der Rest ist Feintuning.

Fix #1: Die LLM-Library-Falle

Fix #1: Die OLLAMA_LLM_LIBRARY Falle



Das Problem: OLLAMA_LLM_LIBRARY=cublas in der Konfiguration führte dazu, dass Ollama die GPU komplett ignorierte.

Die Lösung: Variable entfernen, Ollama Auto-Detection nutzen.

# Vorher in /etc/systemd/system/ollama.service.d/override.conf:
Environment=OLLAMA_LLM_LIBRARY=cublas  # DIESE ZEILE LÖSCHEN

# Danach:
sudo systemctl daemon-reload
sudo systemctl restart ollama

Ergebnis: GPU wurde erkannt, 20.0 GiB VRAM verfügbar (statt 0 B). Das war der Durchbruch.

Fix #2: Version-Upgrade

Fix #2: Ollama Version 0.11.2 nach 0.12.6



Das Versions-Upgrade war der Game-Changer. Server B lief mit Ollama 0.11.2 (veraltet). Das Referenz-System hatte 0.12.6.

# Upgrade (offizielles Script)
systemctl stop ollama
curl -fsSL https://ollama.com/install.sh | sh
systemctl start ollama

# Version prüfen
ollama --version

Performance-Sprung: 36.54 nach 55.41 tokens/s. Das sind plus 52% nur durch ein Software-Update. Der größte Hebel in der ganzen Optimierung.

Fix #3: Flash Attention

Fix #3: Flash Attention aktivieren



Flash Attention beschleunigt die Attention-Berechnung massiv. Ohne läuft das Modell deutlich langsamer, besonders bei längeren Contexts.

# In /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment=OLLAMA_FLASH_ATTENTION=1

# Service neu laden
sudo systemctl daemon-reload
sudo systemctl restart ollama

Impact: 15% bis 50% je nach Context-Länge. Auf Server A war es bereits aktiv (daher die gute Performance). Auf Server B brachte die Aktivierung nochmal einen Schub.

Fix #4: Context Length

Fix #4: Context Length richtig einstellen



Höherer Context ist nicht besser für Performance. Mehr Context bedeutet mehr VRAM und langsamere Attention-Berechnungen.

# Standard-Wert setzen
Environment=OLLAMA_CONTEXT_LENGTH=4096

Faustregel: 4096 ist der Sweet-Spot. 2048 wenn es schneller sein soll, 8192 nur wenn wirklich lange Dokumente analysiert werden müssen.

Beide Server in meiner Analyse nutzten 4096. Das war optimal und kein Flaschenhals.

GPU-Optimierungen

Feintuning: GPU Clock Lock und Persistence Mode



Nach den Software-Fixes kamen Hardware-Optimierungen. GPU Persistence Mode verhindert, dass der NVIDIA-Treiber bei Idle entladen wird. Clock Locking fixiert die GPU auf Maximum-Takt.

# Persistence Mode (einmalig)
sudo nvidia-smi -pm 1

# Clock auf Maximum locken
sudo nvidia-smi -lgc 1560

# Prüfen
nvidia-smi --query-gpu=clocks.gr --format=csv,noheader
# Sollte zeigen: 1560 MHz (auch ohne Last)

Impact: Persistence war bereits aktiv. Clock Lock brachte minus 14% Gesamtzeit (26.4s nach 22.8s), aber nur plus 0.1% Token-Rate. Der Hauptgewinn war geringere Latenz beim ersten Token.

Performance-Matrix

Die komplette Performance-Matrix



Von 36 auf 60 tokens/s in 6 Schritten:

Schritt tokens/s Impact
Ausgangslage (Server B) 36.54 Baseline
OLLAMA_LLM_LIBRARY entfernt ~45 +23%
Ollama 0.11.2 nach 0.12.6 55.41 +23%
Flash Attention=1 ~58 +5%
GPU Clock Lock 59.71 +3%
FINAL 59.64 +63%

Vergleich mit Referenz-System: 59.64 vs. 59.98 tokens/s. Das sind 99.4% der Maximum-Performance. Mission accomplished.

Lessons Learned

Lessons Learned: Die Checkliste für jedes Ollama-System



Wenn Ollama zu langsam läuft, arbeite diese Checkliste ab:

Die 5-Minuten-Checkliste

  1. Version prüfen: ollama --version (sollte 0.12.6 Plus sein)
  2. Flash Attention: grep FLASH_ATTENTION /etc/systemd/system/ollama.service.d/override.conf (sollte =1 sein)
  3. GPU-Nutzung: nvidia-smi während Run (sollte 10 Plus GB VRAM zeigen)
  4. OLLAMA_LLM_LIBRARY: Sollte NICHT gesetzt sein (Auto-Detection ist besser)
  5. Context Length: 4096 ist optimal für die meisten Fälle

Diese 5 Checks decken 95% aller Performance-Probleme ab. Der Rest ist Feintuning.

Wenn Dich solche Themen interessieren, dann schau gerne mal vorbei:

KI systemisch im Unternehmen einsetzen