Das Eisbär-Maskottchen von NordBastion sitzt auf einer aus Stein gehauenen Bank in einem dunklen nordischen Gewölbe, einen Laptop auf dem Schoß, darüber neben dem Server-Rack ein leuchtend cyanfarbenes neuronales Gitter, versiegelt in einem sechseckigen Glasgefäß, und ein kurzer Strom cyanfarbener Tokens fließt aus dem Gefäß hinunter auf seinen Bildschirm, hinter einer geschlossenen Runentür
Anleitung · KI-Agenten·17 Min. Lesezeit · 30 Min. Praxis

LLM selbst hosten auf einem VPS.
Keine GPU. Kein API-Key. Kein Prompt verlässt je das Gebäude.

Sechs Schritte zu einem LLM, das auf Ihrer eigenen Hardware antwortet — die Rechnung, die Ihre Tokens pro Sekunde vorhersagt, bevor Sie die Maschine kaufen, welches Modell in 4, 8, 16 oder 32 GB passt, die Authentifizierung, die Ollama nicht mitbringt, und eine ehrliche Liste der Aufgaben, die nicht passen. Getestet auf Debian 12.

Die sechs Schritte
  1. 01

    Größe

    Bandbreite, nicht Kerne

  2. 02

    Installieren

    Ollama

  3. 03

    Messen

    Ihre eigenen Tokens/s

  4. 04

    Schützen

    TLS + ein Token

  5. 05

    Verbinden

    Eine Base-URL

  6. 06

    Eingrenzen

    Kontext, RAM, Festplatte

Bevor Sie beginnen · Die Rechnung

Eine Division sagt Ihnen, was die Maschine leisten kann. Rechnen Sie sie, bevor Sie die Maschine kaufen.

Fast alles, was über den lokalen Betrieb von Sprachmodellen geschrieben wird, dreht sich um Grafikkarten — wenig hilfreich, wenn man eigentlich eine virtuelle Maschine hat. Das nützliche Denkmodell ist einfacher, als die GPU-Debatte vermuten lässt, und passt in einen Satz: Um ein einziges Token zu erzeugen, muss ein dichtes Modell jedes seiner Gewichte aus dem Speicher lesen. Nicht einen Teil davon — alle, einmal pro Token.

Diese eine Tatsache klärt die ganze Performance-Frage. Die Generierungsgeschwindigkeit entscheidet sich nicht daran, wie viele Kerne Sie mieten, sondern daran, wie schnell die Maschine das Modell aus dem RAM streamen kann. Das gibt Ihnen eine Obergrenze, die Sie auf einem Bierdeckel ausrechnen können, bevor Sie auch nur einen Cent ausgeben:

tokens per second  ≈  memory bandwidth (GB/s)  ÷  model size (GB)

Ein quantisiertes 8B-Modell belegt etwa 5 GB. Auf einem virtualisierten Host, auf dem realistisch etwa 20 GB/s an Durchsatz möglich sind, liegt die Obergrenze bei etwa vier Tokens pro Sekunde, und der Wert, den Sie tatsächlich messen, liegt vermutlich bei der Hälfte bis zwei Dritteln davon. Etwa drei Wörter pro Sekunde. Lesen Sie das als Tatsache über die Arbeitslast, nicht als Enttäuschung: Für ein Chat-Fenster ist das langsam, für eine Aufgabe, die ein Dokument klassifiziert und eine Zeile JSON zurückgibt, völlig ausreichend.

Kerne spielen weiterhin eine Rolle — nur nicht aus dem Grund, den die meisten annehmen. Mehr Threads helfen, bis sie den Speicherpfad sättigen, was auf diesen Maschinen früh passiert — oft schon bei vier bis acht Threads. Danach liegen die zusätzlichen Kerne brach, während alles auf RAM wartet. Deshalb ist eine Sechzehn-Kern-Maschine beim Textgenerieren nicht viermal so schnell wie eine Vier-Kern-Maschine, und deshalb ist das Bezahlen für Kerne in der Hoffnung auf Geschwindigkeit der häufigste Weg, die falsche Stufe zu kaufen.

Lesen ist schnell, Schreiben ist langsam. Jede Anfrage hat zwei Phasen, und sie verhalten sich völlig unterschiedlich. Das Verarbeiten des Prompts — der Prefill — ist eine rechenbound Matrixoperation über die gesamte Eingabe auf einmal und läuft um ein Vielfaches schneller als die Generierung. Das Erzeugen der Antwort ist der oben beschriebene speicherbound Teil, ein Token nach dem anderen. Ein zweitausend Wörter langes Dokument zu geben und drei Sätze zurückzuverlangen ist deshalb eine angenehme Arbeitslast, während es um einen zweitausend Wörter langen Aufsatz zu bitten es nicht ist. Gestalten Sie Ihre Prompts um diese Asymmetrie herum, und eine CPU-Maschine fühlt sich weit besser an, als ihre Token-Rate vermuten lässt.

Stufe Arbeitsspeicher Größtes bequemes Modell Größenordnung Wofür es gedacht ist
Sentinel · $3.904 GB3B bei Q4 (~2 GB)ein Satz pro SekundeKlassifizierung, Tagging, Routing, Embeddings
Garrison · $7.908 GB8B bei Q4 (~5 GB)ein paar Wörter pro SekundeDie Standardgröße. Zusammenfassungen, JSON-Extraktion, RAG-Antworten
Ravelin · $16.9016 GB14B bei Q4 (~9 GB)etwa die Hälfte von obenSchwierigeres Schlussfolgern, langer Kontext, Batch-Pipelines
Bulwark · $32.9032 GB32B bei Q4 (~20 GB)unter einem Wort pro SekundeQualität vor Geschwindigkeit. Nur asynchrone Arbeit
Citadel · $62.9064 GB70B bei Q4 (~40 GB)Minuten pro AntwortEs passt. Es ist nicht interaktiv. Nachtjobs

Die Modellgrößen sind die üblichen Q4_K_M-Quantisierungen, die einen kleinen, meist unbemerkten Qualitätsverlust gegen weniger als die Hälfte des Speicherbedarfs tauschen. Die Spalte Geschwindigkeit ist eine aus der Division oben abgeleitete Größenordnung, kein Benchmark — der Sinn von Schritt 03 ist, dass Sie Ihre eigene Maschine messen, statt einer Tabelle zu vertrauen, auch dieser hier.

Bevor Sie beginnen · Passt es

Was auf einer CPU wirklich passt. Und was nicht, unverblümt gesagt.

Die ehrliche Version dieses Abschnitts ist mehr wert als eine begeisterte, denn der schnellste Weg, ein selbst gehostetes Modell wieder aufzugeben, ist, es auf genau die Aufgabe anzusetzen, bei der es am schlechtesten ist, und daraus zu schließen, die ganze Idee sei unsinnig.

Passt bequem. Alles, bei dem die Ausgabe kurz ist und der Wert in der Beurteilung liegt, nicht in der Prosa. Eine Nachricht in eine von wenigen Kategorien einordnen. Entscheiden, ob ein Support-Ticket dringend ist. Fünf Felder aus einer Rechnung als JSON extrahieren. Einen Thread in drei Sätzen zusammenfassen. Ein Dokument taggen. Eine Produktbeschreibung umschreiben. Eine kurze Zeichenkette übersetzen. Erkennen, ob zwei Datensätze dieselbe Person beschreiben. Namen aus einem Absatz schwärzen, bevor er irgendwohin weitergeht. Jede dieser Aufgaben verarbeitet eine lange Eingabe und liefert eine kurze Ausgabe — genau die Asymmetrie, mit der eine CPU gut zurechtkommt.

Passt, mit Geduld. Arbeit, auf die kein Mensch wartet. Nächtliche Batches, Queue-Worker, ein nächtlicher Durchlauf über die Dokumente des Tages, ein geplanter Report. Wenn nichts auf die Antwort wartet, spielt eine Token-Rate, die in einem Chat-Fenster unerträglich wäre, überhaupt keine Rolle mehr — ein Job, der um drei Uhr morgens sechs Minuten läuft, ist einfach ein Job, der gelaufen ist.

Passt nicht. Ein interaktiver Assistent, den Menschen tatsächlich gerne benutzen: Bei diesen Raten kriecht der Cursor, und die Erfahrung ist schlechter als gar kein Assistent. Lange Texte am Stück — schreib mir zweitausend Wörter —, bei denen die gesamte Ausgabe der langsame Teil ist. Coding-Agenten, die über ein großes Repository iterieren, wo sowohl der Kontext als auch der Qualitätsanspruch das übersteigen, was ein kleines Modell leisten kann. Alles, was einen Kontext von hunderttausend Tokens braucht, bei dem allein der Cache die Maschine sprengt. Und Bild- oder Videomodelle, die eine völlig andere Disziplin sind und tatsächlich eine GPU wollen.

Wenn Ihre Arbeitslast in diese letzte Gruppe fällt, ist die vernünftige Antwort nicht eine größere CPU-Maschine, sondern ein Hybrid. Behalten Sie ein lokales Modell für den Großteil der Aufrufe und leiten Sie die Handvoll, die Spitzen-Reasoning braucht, an eine gehostete API — genau das Muster, das die Anleitung zum 24/7-Betrieb eines KI-Agenten für die Laufzeitseite beschreibt. Diese Anleitung hat das Modell selbst absichtlich ausgeklammert. Diese hier ist die fehlende Hälfte.

Schritt 01 · Größe

Kaufen Sie für das Modell, nicht für die Kerne. Und lassen Sie Luft nach oben.

Denken Sie von der Aufgabe her rückwärts. Entscheiden Sie, was das Modell leisten muss, wählen Sie die kleinste Größe, die das schafft, schauen Sie nach, was diese Größe bei Q4_K_M belegt, und addieren Sie dann die Zuschläge:

RAM needed  =  model file  +  KV cache  +  ~2 GB for the system

  3B  Q4_K_M  ≈  2.0 GB        KV cache at 8k context   ≈  0.5–1 GB
  8B  Q4_K_M  ≈  4.9 GB        KV cache at 32k context  ≈  2–4 GB
 14B  Q4_K_M  ≈  9.0 GB
 32B  Q4_K_M  ≈ 20.0 GB
 70B  Q4_K_M  ≈ 40.0 GB

Der Key-Value-Cache ist der Overhead, den man vergisst. Jedes Token, das bereits im Gespräch steckt, wird im Speicher gehalten, damit das Modell es nicht neu berechnen muss, und dieser Speicherbereich wächst mit dem zugelassenen Kontext. Eine Verdopplung des Kontexts verdoppelt ihn ungefähr. Ein Modell, das mit 4k Kontext passt, kann bei 32k nicht mehr passen — und das Scheitern tritt bei der zehnten Anfrage ein, nicht bei der ersten, was wie ein Rätsel aussieht statt wie ein Rechenfehler.

Ein sanftes Nachlassen gibt es hier nicht. Übersteigt die Summe den RAM, wird der Kernel nicht höflich langsamer: Er beginnt, bei jedem einzelnen Token Modellgewichte auf die Festplatte und zurück auszulagern. Aus einer Vier-Sekunden-Generierung werden vier Minuten, die Load Average klettert in den zweistelligen Bereich, und alles andere auf der Maschine — die Datenbank, der Webserver, Ihre SSH-Sitzung — leidet mit. In den Speicher zu passen ist keine Optimierung. Es ist die Voraussetzung.

Im Panel: Bestellen → VPS → die Stufe, auf die die Rechnung hingedeutet hat, Image Debian 12. Für die Kontoeröffnung ist keine E-Mail-Adresse nötig, an keiner Stelle wird ein Ausweisdokument verlangt, und die Rechnung wird in Monero, Bitcoin, Lightning oder einem der anderen unterstützten Assets beglichen — was hier mehr zählt als bei einem gewöhnlichen Webserver, aus Gründen, die die Grundlagen-Anleitung zum anonymen VPS-Hosting darlegt und die das Kapitel zur Privatsphäre weiter unten speziell auf Prompts anwendet.

Schritt 02 · Installieren

Ein Befehl, ein Dienst. An Loopback gebunden, und dort belassen.

Härten Sie die Maschine zuerst — SSH nur mit Schlüssel, eine Firewall, die nichts erlaubt, was Sie nicht ausdrücklich wollten, unbeaufsichtigte Sicherheitsupdates. Die Checkliste für die erste Stunde dauert etwa eine Stunde, und diese Maschine wird schon bald jede Frage speichern, die Sie ihr stellen.

Installieren Sie dann den Runner. Ollama ist llama.cpp, umhüllt von einer Modell-Registry, einer REST-API und einer systemd-Unit, und der Ein-Zeilen-Installer richtet alle drei ein:

apt update && apt install -y curl
curl -fsSL https://ollama.com/install.sh | sh

systemctl status ollama --no-pager
ss -ltnp | grep 11434
# → 127.0.0.1:11434 — loopback only. Leave it that way.

Diese letzte Zeile ist die, die man zweimal liest. Von Haus aus lauscht der Dienst auf der Loopback-Schnittstelle, was genau richtig ist, und der häufigste Fehler in den nächsten zehn Minuten ist, OLLAMA_HOST auf 0.0.0.0 zu setzen, weil etwas auf einer anderen Maschine nicht herankam. Schritt 04 zeigt, wie man es richtig erreichbar macht; es gibt keine Variante davon, in der Port 11434 direkt zum Internet zeigt.

Zwei Einstellungen lohnt es sich, jetzt zu setzen, statt sie später zu entdecken. Modelle werden standardmäßig unter /usr/share/ollama gespeichert und sind groß, also richten Sie das dorthin, wo Sie Platz haben. Und der Standardwert hält ein Modell fünf Minuten nach der letzten Anfrage im RAM resident, was großzügig ist auf einer Maschine, die auch andere Arbeit erledigt:

systemctl edit ollama
[Service]
Environment="OLLAMA_MODELS=/var/lib/ollama/models"
Environment="OLLAMA_KEEP_ALIVE=30m"
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
systemctl daemon-reload && systemctl restart ollama

Parallele Anfragen und mehrere geladene Modelle vervielfachen beide den Speicherbedarf, und auf einer Maschine, die genau für ein Modell dimensioniert ist, gibt es kein Gigabyte übrig für eine zweite Kopie. Die Warteschlange zu serialisieren ist auf dieser Hardware keine Einschränkung — es ist die einzige Konfiguration, die nicht in sich zusammenfällt.

Schritt 03 · Messen

Holen Sie sich Ihre eigene Zahl. Kein fremder Benchmark sagt etwas über Ihre Maschine aus.

Laden Sie ein Modell herunter. Für eine erste Messung tut es jedes aktuelle Instruct-Modell der 8B-Klasse — sie liegen größenmäßig nah genug beieinander, dass die Messung etwas über die Hardware aussagt, nicht über das Modell:

ollama pull llama3.1:8b        # ~4.9 GB at Q4_K_M
ollama list
ollama ps                      # nothing resident yet

Führen Sie nun eine Generierung mit eingeschalteten Zeitmessungen aus. Die Zahl, auf die es ankommt, ist die Eval Rate — erzeugte Tokens pro Sekunde, sobald der Prompt gelesen wurde:

ollama run llama3.1:8b --verbose "Reply with exactly one sentence about the Baltic Sea."
total duration:        14.2s
load duration:          3.1s
prompt eval count:        24 token(s)
prompt eval rate:      92.11 tokens/s      ← reading: fast
eval count:               38 token(s)
eval rate:              3.42 tokens/s      ← writing: the real ceiling

Zwei Zeilen, zwei völlig verschiedene Welten. Lesen lief mit gut neunzig Tokens pro Sekunde; Schreiben mit dreieinhalb. Dieses Verhältnis ist die Asymmetrie aus dem Kapitel zur Rechnung, gemessen auf Ihrem eigenen Blech, und es ist die nützlichste Tatsache, die Sie heute sammeln werden. Sie besagt: Geben Sie dieser Maschine lange Eingaben und verlangen Sie kurze Ausgaben.

Dieselbe Messung über die API — das ist, was Sie eigentlich wollen, wenn Sie den Vergleich über zwei oder drei Modellgrößen skripten möchten:

apt install -y jq

curl -s http://127.0.0.1:11434/api/generate -d '{
  "model":  "llama3.1:8b",
  "prompt": "List three Nordic capitals.",
  "stream": false
}' | jq '{
  tokens: .eval_count,
  seconds: (.eval_duration / 1000000000),
  rate: (.eval_count / (.eval_duration / 1000000000))
}'

Messen Sie die Größe darunter und die Größe darüber, dann hören Sie auf. Laden Sie ein 3B und ein 14B herunter, lassen Sie denselben Prompt durch beide laufen, und notieren Sie sich die drei Raten. Jetzt wissen Sie genau, was der Tausch auf dieser Maschine kostet — meist etwa eine Verdopplung in jede Richtung —, und Sie können pro Aufgabe entscheiden statt nach Bauchgefühl. Entfernen Sie danach die Modelle, die Sie nicht behalten, denn jedes davon belegt mehrere Gigabyte.

Ein Vorbehalt beim ersten Lauf eines jeden Modells: Die Load Duration in dieser Ausgabe ist die Zeit, die zum Lesen der Gewichte von der Festplatte in den RAM gebraucht wird. Sie fällt nur an, wenn das Modell noch nicht resident ist, was OLLAMA_KEEP_ALIVE steuert. Rechnen Sie sie beim Vergleich der Raten nicht mit, und lassen Sie sich davon nicht beunruhigen — auf NVMe sind es Sekunden, und es passiert nur einmal.

Schritt 04 · Schützen

Ollama hat keine Authentifizierung. Keine. Nicht mal eine schwache — keine.

Das ist der Teil der Anleitung, der etwas Schlimmes verhindert, deshalb wird er ohne Wenn und Aber gesagt: Die Ollama-API hat kein Passwort, kein Token, kein Benutzermodell und kein Berechtigungssystem. Was auch immer eine TCP-Verbindung zu Port 11434 aufbauen kann, kann Text auf Ihrer CPU generieren, die heruntergeladenen Modelle auflisten, neue herunterladen und die genutzten löschen. Es gibt keine Einstellung, die man aktivieren könnte, weil es keinen Mechanismus gibt, den man aktivieren könnte.

Port 11434 wird ständig gescannt, aus dem naheliegenden Grund: Ein offener Model-Runner ist kostenlose Rechenleistung für jemand anderen. Das Symptom ist kein Alarm. Es ist eine Maschine, die sich zwei Wochen lang langsam anfühlt, und ein Bandbreiten-Graph, der zu nichts passt, was Sie getan haben. Halten Sie den Dienst auf Loopback, und stellen Sie etwas davor, das fragt, wer da anruft.

Wenn nichts außerhalb dieser Maschine das Modell braucht, hören Sie hier auf — Sie sind bereits fertig. Loopback plus Firewall ist eine vollständige Antwort, und ein Agent, ein Automatisierungs-Stack oder eine Webanwendung auf demselben VPS erreicht das Modell über 127.0.0.1, ganz ohne das Folgende. Machen Sie nur weiter, wenn etwas auf einer anderen Maschine es aufrufen muss.

Der Proxy, und das Token. Erzeugen Sie ein langes zufälliges Token, richten Sie einen A-Record auf die Maschine, und lassen Sie Caddy sowohl das Zertifikat als auch die Tür übernehmen:

openssl rand -hex 32      # → the bearer token, store it in a password manager
apt install -y caddy

/etc/caddy/Caddyfile

llm.example.com {
    @unauthorised not header Authorization "Bearer PASTE_THE_HEX_TOKEN_HERE"
    respond @unauthorised "unauthorised" 401

    reverse_proxy 127.0.0.1:11434 {
        # Generation is slow by nature — do not let the proxy give up first.
        transport http {
            read_timeout 10m
        }
    }
}
systemctl reload caddy
ufw allow 80,443/tcp
ufw status                # 11434 must appear nowhere

Es steckt eine kleine Eleganz darin, ein Bearer-Token statt Basic Authentication zu wählen. Ollama bietet eine OpenAI-kompatible API, und jeder OpenAI-Client sendet seinen Schlüssel genau als diesen Header — sodass das Token, das Sie gerade erzeugt haben, zum API-Schlüssel wird, den Ihre Anwendungen bereits mitzuführen wissen. Nichts braucht einen eigenen Header, und der Zugriff lässt sich mit einer Zeile im Caddyfile und einer Umgebungsvariable beim Aufrufer rotieren.

Prüfen Sie es von einer Maschine aus, die nicht der Server ist. Der erste Aufruf sollte abgelehnt werden, der zweite sollte antworten:

curl -s -o /dev/null -w '%{http_code}\n' https://llm.example.com/api/tags
# → 401

curl -s https://llm.example.com/api/tags -H "Authorization: Bearer THE_TOKEN" | jq '.models[].name'
# → the list of models you pulled

Wenn das Modell von Agenten aufgerufen wird statt von Ihnen selbst, verdient die Frage der Exponierung die ausführlichere Behandlung in der Anleitung zum Hosten eines entfernten MCP-Servers — dieselbe Überlegung zu TLS, Tokens und Erreichbarkeit, angewendet auf einen Dienst, der Werkzeuge statt Tokens ausgibt.

Schritt 05 · Verbinden

Eine Base-URL, und alles spricht sie bereits. Sie ändern eine Zeichenkette.

Ollama stellt neben seiner eigenen API auch eine OpenAI-kompatible Schnittstelle unter /v1 bereit. Das ist die ganze Integrationsgeschichte: Alles, was für OpenAI gebaut wurde — die offiziellen SDKs, die Framework-Wrapper, die Automatisierungs-Nodes — funktioniert, indem man Base-URL und Schlüssel ändert, sonst nichts.

curl -s https://llm.example.com/v1/chat/completions \
  -H "Authorization: Bearer THE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.1:8b",
    "messages": [{"role":"user","content":"Reply with the word OK."}]
  }' | jq -r '.choices[0].message.content'

In Python unterscheiden sich gegenüber einem gehosteten Setup nur die beiden Zeilen ganz oben:

from openai import OpenAI

client = OpenAI(
    base_url="https://llm.example.com/v1",
    api_key="THE_TOKEN",
)

r = client.chat.completions.create(
    model="llama3.1:8b",
    messages=[{"role": "user", "content": "Classify: 'the invoice is overdue'"}],
)
print(r.choices[0].message.content)

JSON verlangen, JSON bekommen. Das nützlichste Feature für Automatisierung ist Constrained Output. Ollama kann erzwingen, dass die Antwort gültiges JSON ist, statt darauf zu hoffen, dass sich das Modell brav verhält — das verwandelt ein kleines Modell von einem unzuverlässigen Erzähler in einen verlässlichen Parser, und es ist der Unterschied zwischen einem Workflow, der unbeaufsichtigt läuft, und einem, der bei jedem vierzigsten Eintrag bricht:

curl -s http://127.0.0.1:11434/api/generate -d '{
  "model":  "llama3.1:8b",
  "prompt": "Extract the total and the currency: Invoice 4021, 1 249,90 EUR due 30 days.",
  "format": "json",
  "stream": false
}' | jq -r .response
# → {"total": 1249.90, "currency": "EUR"}

In einem Automatisierungs-Stack gilt dasselbe: n8n bringt einen eigenen Ollama-Node mit, und sein OpenAI-Node akzeptiert eine benutzerdefinierte Base-URL, sodass ein bestehender Workflow durch das Ändern eines einzigen Credentials auf lokale Inferenz umzieht. Die Anleitung zum Self-Hosting von n8n behandelt die Automatisierungs-Engine selbst; betreiben Sie beide nach Möglichkeit auf getrennten Maschinen, denn eine Engine, die im Leerlauf 700 MB belegt, und ein Modell, das fünf Gigabyte will, sind auf einer Acht-Gigabyte-Maschine unglückliche Nachbarn.

Und der Embeddings-Endpunkt — hier verdient sich diese Maschine ihr Geld. Embedding-Modelle sind zwei Größenordnungen kleiner als Generierungsmodelle und machen einen Durchlauf pro Chunk, ohne etwas zu generieren — eine CPU schafft das in einem Tempo, das sich sofort anfühlt:

ollama pull nomic-embed-text      # ~275 MB

curl -s http://127.0.0.1:11434/api/embed -d '{
  "model": "nomic-embed-text",
  "input": ["the first chunk of a document", "the second chunk"]
}' | jq '.embeddings | length'
Schritt 06 · Eingrenzen

Ein ungebremster Model-Runner nutzt alles, was Sie haben. Geben Sie ihm Grenzen.

Kontext begrenzen. Die Kontextlänge ist der wichtigste Regler für den Speicherbedarf, und der Standardwert ist großzügiger, als eine kleine Maschine verträgt. Setzen Sie ihn global auf das, was Ihr längster realistischer Prompt tatsächlich braucht — die meisten Klassifizierungs- und Extraktionsaufgaben liegen bequem innerhalb von viertausend Tokens —, und erhöhen Sie ihn pro Anfrage für die seltenen Fälle, die mehr brauchen:

Environment="OLLAMA_CONTEXT_LENGTH=4096"
curl -s http://127.0.0.1:11434/api/generate -d '{
  "model": "llama3.1:8b",
  "prompt": "…a long document…",
  "options": { "num_ctx": 16384 },
  "stream": false
}'

Entscheiden Sie, wie lange das Modell im Speicher bleibt. Ein resident gehaltenes Modell antwortet sofort, hält dafür aber mehrere Gigabyte belegt. Auf einer Maschine, die ausschließlich für Inferenz reserviert ist, lassen Sie es dauerhaft geladen; auf einer geteilten lassen Sie es nach einer Weile wieder entladen. Der Wert lässt sich auch pro Anfrage setzen, sodass ein nächtlicher Batch das Modell für seinen Lauf festhalten und danach wieder freigeben kann:

OLLAMA_KEEP_ALIVE=-1     # resident until the service restarts
OLLAMA_KEEP_ALIVE=30m    # a sensible default on a shared box
OLLAMA_KEEP_ALIVE=0      # unload immediately after each request

ollama ps                # what is resident right now, and how much it holds

Warteschlange serialisieren. Zwei gleichzeitige Anfragen an ein Modell laufen nicht doppelt so schnell; sie konkurrieren um denselben gesättigten Speicherpfad, und jede wird langsamer — und wenn Ollama beschließt, zur Bedienung eine zweite Kopie zu laden, geht der Maschine der RAM aus. Bei dieser Hardware-Klasse ist eine Anfrage nach der anderen, mit einer Warteschlange davor, sowohl die schnellste als auch die einzige sichere Konfiguration — deshalb wurden OLLAMA_NUM_PARALLEL und OLLAMA_MAX_LOADED_MODELS bereits in Schritt 02 auf eins festgelegt.

Die Festplatte im Blick behalten. Vier Modelle zu vergleichen hinterlässt vier Modelle, und bei je fünf Gigabyte füllt sich die Festplatte leise, ohne dass etwas meckert. Machen Sie das Aufräumen zum Teil des Vergleichs, nicht zu einer Aufgabe für später:

ollama list
du -sh /var/lib/ollama/models
ollama rm mistral:7b qwen2.5:14b

Sichern Sie am Ende, was sich nicht reproduzieren lässt. Die Modellgewichte gehören nicht dazu — ein Pull holt sie zurück. Ein Repository lohnt sich für die Konfiguration, das Caddyfile, das Token, die Prompts, die Sie über drei Wochen verfeinert haben, und, falls vorhanden, den Vektorindex hinter Ihrem Retrieval. Die Anleitung zu verschlüsselten Backups behandelt die Mechanik; die Liste dessen, was für diese Maschine dazugehört, ist kurz und lohnt sich aufzuschreiben.

Der gute Teil · Retrieval

Wo eine CPU das Argument widerlegt. Embeddings sind nicht langsam.

Bisher ging es nur um Generierung — der Teil, den eine CPU langsam erledigt. Retrieval ist die andere Hälfte der meisten nützlichen Systeme, und dort kehrt sich das Bild komplett um — deshalb kann die günstigste Stufe auf dieser Seite etwas wirklich Wertvolles leisten, selbst wenn Sie auf ihr nie ein Token generieren.

Ein Embedding-Modell verwandelt einen Textabschnitt in einen Vektor. Es wird in Hunderten von Megabyte statt Gigabyte gemessen, macht genau einen Forward Pass pro Chunk, und es gibt keine Token-für-Token-Schleife, die von der Speicherbandbreite gebremst wird. Auf derselben Maschine, auf der ein 8B-Modell drei Wörter pro Sekunde schreibt, arbeitet sich ein Embedding-Modell durch eine Dokumentenbibliothek mit einem Tempo, das sich wie Dateien kopieren anfühlt.

So sieht es aus. Teilen Sie Ihre Dokumente in Chunks von ein paar hundert Wörtern. Erzeugen Sie für jeden Chunk einmal ein Embedding und speichern Sie den Vektor. Zum Zeitpunkt der Frage erzeugen Sie das Embedding der Frage, finden die Handvoll nächstgelegenen Chunks und geben diese zusammen mit der Frage an ein Modell weiter. Der Speicher braucht nichts Exotisches: Eine SQLite-Datenbank mit Vektor-Erweiterung reicht für Zehntausende Chunks auf einem einzelnen VPS, und PostgreSQL mit pgvector deckt weit darüber hinaus ab. Eine dedizierte Vektordatenbank ist später eine gute Idee und am ersten Tag eine unnötige Abhängigkeit.

Warum das mehr zählt als die Geschwindigkeit. Schauen Sie sich an, was jede Hälfte berührt. Der Generierungsschritt sieht eine Frage und ein paar Absätze. Der Embedding-Schritt sieht <em>jedes Dokument, das Sie besitzen</em> — das gesamte Archiv, jeden Vertrag, jede Notiz, jede Nachricht, Chunk für Chunk durch das Modell geschickt. Läuft dieser Schritt gegen einen gehosteten Endpunkt, wurde Ihr gesamter Korpus zu einem Dritten übertragen, nur um indexiert zu werden. Läuft er auf Ihrer eigenen Maschine, hat sich nichts davon bewegt.

Das ergibt einen wirklich guten Hybrid für alle, die nicht auf Frontier-Qualität verzichten wollen: lokal indexieren, lokal abrufen, und nur die Frage plus die drei abgerufenen Chunks an ein gehostetes Modell schicken, wenn die Antwort exzellent sein muss. Der Korpus bleibt zu Hause; nur ein dünner Ausschnitt davon reist, und das nur bei Bedarf.

Zwei Nachbarn auf dieser Website machen das Muster konkret. Ein selbst gehostetes SearXNG gibt der Retrieval-Ebene ein privates Frontend für das offene Web statt eines Korpus; ein selbst gehosteter Dokumentenspeicher gibt ihr den Korpus. Beide zusammen, plus das Modell, passen auf Stufen, die pro Monat weniger kosten als ein einzelner gehosteter Sitzplatz.

Die Schicht unter dem Modell

Die Prompts sind der sensible Teil. Nicht die Antworten — die Fragen.

Man denkt über die Privatsphäre von Modellen so nach, als läge das Risiko in der Ausgabe. Das stimmt nicht. Die Ausgabe ist generischer Text; tausend andere Leute haben etwas Ähnliches bekommen. Das verräterische Artefakt ist die Eingabe — und ein Jahr an Eingaben ist ein bemerkenswert vollständiges Porträt einer Organisation.

Überlegen Sie, was ein Anfrage-Log tatsächlich enthält. Der Vertrag, den Sie zum Zusammenfassen eingefügt haben. Die Kunden-E-Mail, die klassifiziert werden sollte, mit dem Kunden darin. Der Arztbrief, die Gehaltszahl, die Kündigung, an der Sie gerade schrieben, der Code aus einem Repository, das nicht öffentlich ist. Dazu die Metadaten drumherum: welche Fragen, in welcher Reihenfolge, zu welcher Uhrzeit, von welcher Adresse, über wie viele Monate. Niemand unterschreibt ein Dokument mit der Aufschrift „Hier ist unsere Strategie“ — aber die Abfolge der Fragen ist genau dieses Dokument, ehrlich zusammengestellt, von Ihnen, einen Aufruf nach dem anderen.

Ebene eins — was der Endpunkt behält. Seriöse Anbieter veröffentlichen seriöse Richtlinien, und die guten trainieren tatsächlich nicht mit Business-API-Traffic. Das ist nicht dasselbe Versprechen wie „wir speichern es nicht“. Anfragen werden meist für eine gewisse Zeit zur Missbrauchsüberwachung gespeichert, sind unter definierten Bedingungen für Mitarbeiter einsehbar und können im Rahmen eines gerichtlichen Verfahrens herausgegeben werden — genau die richtige Art, eine große Plattform zu betreiben, und genau der falsche Ort für Text, den Sie keinem Fremden per E-Mail schicken würden. Ein Modell auf Ihrer eigenen Maschine führt kein solches Log, es sei denn, Sie schreiben eines.

Ebene zwei — die Identität, mit der das Log verknüpft ist. Aufbewahrung allein ist nur die halbe Exponierung. Die andere Hälfte ist der Schlüssel, mit dem sie verknüpft wird: ein Konto, ein Firmenname, eine Rechnungsadresse, eine Karte. Diese Verknüpfung macht aus „jemand hat nach der Übernahme eines Wettbewerbers gefragt“ ein „dieses Unternehmen hat gefragt, an jenem Dienstag“. Das Modell aus der Gleichung zu nehmen entfernt die Aufbewahrung; die Identität von der Maschine zu nehmen entfernt die Verknüpfung. Ein VPS, eröffnet ohne E-Mail-Adresse oder Ausweisdokument, in einer nordischen Jurisdiktion, bezahlt in Monero, ist die zweite Hälfte desselben Schritts.

Ebene drei — die Logs, die Sie selbst schreiben. Self-Hosting verschiebt das Risiko, statt es zu beseitigen, und es lohnt sich, sich klarzumachen, wo es landet. Ihre Anwendung protokolliert vermutlich ihre eigenen Prompts. Ihr Reverse Proxy protokolliert jede Anfragezeile. Eine Debugging-Sitzung vor zwei Monaten hat ausführliche Ausgaben im Journal hinterlassen. Das Modell selbst behält zwischen Aufrufen nichts, aber die Maschinerie drumherum kann alles behalten — entscheiden Sie also bewusst, was aufgeschrieben wird, setzen Sie eine Aufbewahrungsfrist dafür, und legen Sie an dieses Log denselben Maßstab an, den Sie bei jemand anderem nicht akzeptiert hätten.

Nichts davon macht ein lokales Modell von sich aus zu einer Datenschutzgarantie. Es macht es zu der einen Architektur, bei der die Garantie in Ihrer Hand liegt: Der Text bleibt auf Hardware, die Sie mieten, unter einer Jurisdiktion, die Sie gewählt haben, hinter einem Token, das Sie ausgestellt haben, und ist niemand anderem gegenüber rechenschaftspflichtig.

Feldnotizen · Sechs Fallen

Sechs Arten, wie das enttäuscht. Fünf davon sind vermeidbar.

Falle 01 · Speicher

Die Maschine fror ein, statt langsamer zu werden

Das Modell plus sein Kontext-Cache überstiegen den RAM, und der Kernel begann, bei jedem Token Gewichte auszulagern. In den Speicher passen oder eine Größe kleiner wählen — eine Zwischenstufe gibt es nicht.

Falle 02 · Exponierung

Jemand anderes hat Ihre CPU benutzt

OLLAMA_HOST wurde auf 0.0.0.0 gesetzt, damit ein Client funktioniert. Die API hat überhaupt keine Authentifizierung, und 11434 wird gescannt. Loopback plus ein Proxy, der ein Token prüft.

Falle 03 · Erwartung

Es funktioniert, tippt aber wie ein Faxgerät

Für einen interaktiven Assistenten wurde ein 32B-Modell gewählt. Die Größe muss zur Interaktion passen: Interaktiv will klein, Qualität will asynchron.

Falle 04 · Kontext

Die erste Anfrage war in Ordnung, die zehnte kroch dahin

Ein wachsendes Gespräch lässt den Cache mitwachsen, und bei jeder Runde wird der gesamte Verlauf neu gelesen. Begrenzen Sie den Kontext, und beginnen Sie ein neues Gespräch, statt endlos anzuhängen.

Falle 05 · Verweildauer

Fünf Gigabyte sind weg, und nichts läuft

Das Modell bleibt nach dem letzten Aufruf absichtlich resident. Stellen Sie OLLAMA_KEEP_ALIVE passend zur Maschine ein, und lesen Sie ollama ps, bevor Sie irgendetwas anderes verdächtigen.

Falle 06 · Festplatte

Die Festplatte füllte sich mit Modellen, die Sie einmal verglichen haben

Vier Kandidaten zu je fünf Gigabyte, keiner entfernt. Machen Sie ollama rm zum Teil des Vergleichs, und prüfen Sie das Modellverzeichnis, wenn Festplatten-Alarme losgehen.

FAQ · Lokale Modelle

Fragen, beantwortet.

Zehn Fragen, die entscheiden, ob ein reines CPU-Modell das richtige Werkzeug für Ihr Vorhaben ist.

Läuft ein LLM wirklich ohne GPU?

Ja, mit einem ehrlichen Vorbehalt bei der Geschwindigkeit. Ein quantisiertes Modell läuft auf gewöhnlichen Server-CPUs vollkommen problemlos — die Gewichte liegen im RAM, die Rechenoperationen sind gut zu bewältigen, und nichts an dem Prozess braucht eine Grafikkarte. Was eine GPU kauft, ist Speicherbandbreite, und die Bandbreite bestimmt die Generierungsgeschwindigkeit. Eine reine CPU-Maschine antwortet also korrekt und vollständig, je nach Modell irgendwo zwischen wenigen und ein paar Dutzend Wörtern pro Sekunde. Das ist langsam für ein Chat-Fenster und vollkommen in Ordnung für die Arbeit, die die meisten Menschen tatsächlich automatisieren: eine Nachricht klassifizieren, strukturiertes JSON aus einem Dokument ziehen, eine Seite zusammenfassen, Text für die Suche embedden, einen Absatz umschreiben. Die Frage ist nie „geht das“, sondern „mit welcher Rate, und spielt diese Rate für diese Aufgabe eine Rolle“.

Mit wie vielen Tokens pro Sekunde kann ich rechnen?

Rechnen Sie es selbst nach, statt irgendeinem Benchmark zu vertrauen — auch unserem nicht. Ein dichtes Modell liest jedes seiner Gewichte aus dem Speicher, um ein Token zu erzeugen, also liegt die Obergrenze ungefähr bei Speicherbandbreite geteilt durch Modellgröße. Ein auf etwa 2 GB quantisiertes 3B-Modell hat auf einer Maschine mit effektiv 20 GB/s eine Obergrenze von etwa 10 Tokens pro Sekunde; ein 7B mit 4,4 GB liegt bei etwa 4,5; ein 32B mit 20 GB liegt unter 1. Die realen Werte liegen unter der Obergrenze — rechnen Sie mit 50 bis 70 Prozent — und schwanken je nach Host, Mitbewohnern auf der Maschine und Thread-Anzahl. Die Prompt-Verarbeitung ist eine ganz andere Sache: Sie ist rechenbound, läuft um ein Vielfaches schneller, und deshalb ist das Zusammenfassen eines langen Dokuments angenehm, während ein Chat mit einem großen Modell es nicht ist.

Mit welchem Modell fange ich bei 8 GB am besten an?

Ein Instruct-Modell der 8B-Klasse bei Q4_K_M, das bei etwa 4,5 bis 5 GB landet und Platz für Betriebssystem und Kontext-Cache lässt. Diese Größe ist derzeit der Sweet Spot: gut genug, um Anweisungen zuverlässig zu befolgen, auf Wunsch gültiges JSON zu erzeugen, zusammenzufassen, zu klassifizieren und umzuschreiben; klein genug, um reaktionsschnell zu bleiben. Darunter ist ein 3B-Modell für Klassifizierung, Tagging und Routing durchaus brauchbar und etwa doppelt so schnell. Darüber ist ein 14B beim mehrstufigen Schlussfolgern spürbar besser und etwa halb so schnell — ein fairer Tausch für Batch-Arbeit und ein schlechter für alles Interaktive. Starten Sie bei 8B, messen Sie, und bewegen Sie sich dann in die Richtung, die die Messung anzeigt.

Wie viel RAM braucht ein Modell wirklich?

Die quantisierte Dateigröße, plus der Kontext-Cache, plus Platz für das System — und die Summe muss passen, denn der Fehlermodus ist nicht Langsamkeit, sondern Kollaps. Passt das Modell nicht, beginnt der Kernel, Modellgewichte auf die Festplatte auszulagern, und aus einer Generierung, die vier Sekunden dauern sollte, werden vier Minuten, während die Load Average in den zweistelligen Bereich klettert. Als Faustregel bei Q4_K_M: Ein 3B-Modell braucht etwa 2 GB, ein 8B etwa 5 GB, ein 14B etwa 9 GB, ein 32B etwa 20 GB, ein 70B etwa 40 GB. Rechnen Sie zwei Gigabyte für Debian und seine Dienste dazu, und je nach zugelassener Kontextlänge ein bis vier weitere für den Key-Value-Cache. Kaufen Sie dann die Stufe über der Antwort, nicht die, die genau passt.

Ollama oder llama.cpp?

Ollama ist llama.cpp, umhüllt von einer Modell-Registry, einer REST-API und einem systemd-Dienst. Nutzen Sie Ollama, solange Sie keinen konkreten Grund dagegen haben: ein Installationsbefehl, ollama pull statt der Jagd nach GGUF-Dateien, ein OpenAI-kompatibler Endpunkt und sinnvolle Vorgaben für Thread-Anzahl und Speicher. Greifen Sie direkt zu llama.cpp, wenn Sie ein Flag brauchen, das Ollama nicht anbietet, wenn Sie für Reproduzierbarkeit einen exakten Build fixieren wollen, oder wenn Sie dauerhaft ein Modell mit einer Konfiguration betreiben und lieber keinen Daemon haben, der irgendetwas verwaltet. Beide führen dieselben Gewichte mit derselben Geschwindigkeit aus; der Unterschied liegt vollständig im Betrieb.

Ist ein selbst gehostetes Modell so gut wie die großen gehosteten?

Nein, und so zu tun als ob verschwendet Ihren Nachmittag. Ein Frontier-Modell hinter einer API ist größer als alles, was auf eine virtuelle Maschine passt, und wird bei schwierigem Schlussfolgern, langem Kontext und Code besser sein. Wo ein kleines lokales Modell tatsächlich mithalten kann, ist die riesige Mitte der echten Arbeit: entscheiden, in welche von sechs Kategorien eine E-Mail gehört, fünf Felder aus einer Rechnung extrahieren, einen Support-Thread zusammenfassen, eine Beschreibung umschreiben, ein Dokument taggen, beurteilen, ob zwei Datensätze dieselbe Person beschreiben. Für diese Klasse von Aufgaben ist die Lücke zwischen einem 8B und einem Frontier-Modell klein, der Kostenunterschied ist total, und der Unterschied bei der Privatsphäre ist absolut. Die produktive Haltung lautet nicht „API ersetzen“, sondern „hör auf, ihr die neunzig Prozent zu schicken, die nie hinausmussten“.

Hat Ollama eine Authentifizierung?

Nein — überhaupt keine, und das ist die wichtigste betriebliche Tatsache in dieser Anleitung. Es gibt kein Passwort, kein Token, kein Benutzermodell. Alles, was eine TCP-Verbindung zu Port 11434 aufbauen kann, kann Text generieren, Ihre Modelle auflisten, neue herunterladen und vorhandene löschen. Dieser Port wird routinemäßig gescannt, und ungeschützte Instanzen werden von Fremden gefunden und als kostenlose Rechenleistung genutzt — das zeigt sich zuerst als rätselhafte Load Average und später als Bandbreitenrechnung. Binden Sie Ollama an 127.0.0.1, stellen Sie einen Reverse Proxy davor, beenden Sie TLS dort, und verlangen Sie am Proxy ein Bearer-Token oder ein Client-Zertifikat. Wenn nichts außerhalb der Maschine das Modell braucht, geben Sie es überhaupt nicht frei.

Können n8n oder meine Agent-Runtime ein lokales Modell nutzen?

Ja, und meist braucht es nur ein Feld. Ollama stellt unter /v1 eine OpenAI-kompatible API bereit, sodass jeder Client, der eine Base-URL akzeptiert — die OpenAI-SDKs, LangChain, der n8n-OpenAI-Node, die meisten Agent-Frameworks — funktioniert, indem er auf https://your-host/v1 zeigt und eine beliebige nicht-leere Zeichenkette als Schlüssel sendet. n8n bringt außerdem einen eigenen Ollama-Node mit. Das Muster, das sich in der Praxis bewährt, ist ein Hybrid: den Großteil der öden Massenaufrufe an das lokale Modell leiten und die gehostete API für die Handvoll Schritte reservieren, die wirklich Spitzen-Reasoning brauchen, mit einem Fallback, falls das lokale kein gültiges JSON liefert.

Lohnen sich Embeddings auf der CPU?

Sie sind das Beste im Verhältnis von Preis und Leistung auf dieser ganzen Seite. Embedding-Modelle sind winzig — zehn bis hundert Megabyte statt Gigabyte — und sie machen einen Forward Pass pro Chunk ohne Token-für-Token-Generierung, sodass eine CPU sie mühelos verarbeitet. Das heißt, die gesamte Retrieval-Hälfte eines RAG-Systems — Dokumente indexieren, Anfrage embedden, nächstgelegene Chunks finden — läuft bequem auf der günstigsten Stufe, und das ist auch die Hälfte, die jedes Dokument berührt, das Sie besitzen. Selbst wenn Sie entscheiden, dass der Generierungsschritt auf eine gehostete API gehört, hält das Verlagern des Embedding-Schritts auf Ihre eigene Maschine Ihren Korpus von fremder Infrastruktur fern.

Warum das Modell überhaupt selbst hosten, wenn eine API schneller und günstiger ist?

Drei Gründe, in aufsteigender Reihenfolge ihrer Wichtigkeit. Die Kosten haben eine Form: Eine API ist günstiger, bis sie es nicht mehr ist, und ein Workflow, der fünfzigtausend Nachrichten im Monat klassifiziert, hat eine Rechnung, die wächst, während ein VPS für $7.90 es nicht tut. Verfügbarkeit: kein Rate-Limit, keine Abschaltung des Modells, um das Sie herum gebaut haben, kein Ausfall auf dem Status-Page eines anderen. Und der Grund, der den Ausschlag gibt — Ihre Prompts sind der aufschlussreichste Text, den Sie erzeugen. Nicht die Antworten, die Fragen. Was Sie gefragt haben, über wen, an welchem Tag, in welcher Reihenfolge. Ein gehosteter Endpunkt sieht das alles, verknüpft mit einer Abrechnungsidentität. Ein Modell, das auf einer Maschine läuft, die Sie ohne Ausweisdokument gemietet haben, in einer nordischen Jurisdiktion, bezahlt in Monero, sieht denselben Text und meldet ihn niemandem.

Das Metall beschaffen

Ein nordischer VPS für ein Modell, das nur Ihnen antwortet. KYC-frei, mit Krypto bezahlt.

Garrison (4 vCPU, 8 GB, 240 GB NVMe, $7.90/Monat) betreibt ein 8B-Modell mit Platz für Kontext-Cache und System — die Stufe, mit der die meisten starten sollten. Ravelin verdoppelt den Speicher für 14B und lange Kontexte. Keine E-Mail bei der Anmeldung, kein Ausweisdokument, keine Abrechnung pro Token.

Zuletzt überprüft · 2026-08-24 · Quellen · Ollama-Dokumentation und API-Referenz, llama.cpp-Dokumentation, Caddy-Reverse-Proxy-Dokumentation, veröffentlichte Model Cards für die referenzierten quantisierten Builds · Rhythmus · jährlich