Tipps & Tricks

Tweaking Local Language Model Settings with Ollama

10 min Lesezeit
Tweaking Local Language Model Settings with Ollama

Einleitung

Sprachmodelle prägen weiterhin die Art und Weise, wie Fachleute im Bereich maschinelles Lernen und Entwickler Anwendungen erstellen. Die Einführung leistungsfähiger, kompakter Sprachmodelle bringt eine interessante Dimension in dieses Feld. Durch die Ausführung von Modellen auf lokalen Maschinen wird vollständige Datensicherheit gewährleistet, die Kosten pro Token für APIs entfallen und die Offline-Nutzung wird ermöglicht. Ollama hat sich als eines der führenden Werkzeuge für lokale Inferenz etabliert, dank seiner leichten, auf Go basierenden Engine, einer benutzerfreundlichen Kommandozeilenoberfläche und einem robusten Modellverwaltungssystem, das Docker ähnelt.

Allerdings ist es selten optimal, ein Modell einfach herunterzuladen und mit den Standardeinstellungen zu betreiben. Die Standardkonfigurationen sind auf ein breites, allgemeines Publikum abgestimmt und priorisieren oft sichere, konversationelle Chats über Leistung, deterministisches Denken oder spezifische Systemanforderungen. Wenn Sie beispielsweise einen Programmierassistenten, eine automatisierte ETL-Pipeline oder ein Multi-Agenten-System entwickeln, werden die Standardkonfigurationen wahrscheinlich zu hoher Latenz, Einschränkungen des Kontextfensters oder zufälligen und unvorhersehbaren Ausgaben führen.

Um Ihre lokalen KI-Anwendungen zu verbessern, müssen Sie verstehen, wie Sie sowohl die Hyperparameter auf Modellebene als auch die Laufzeitumgebungen auf Serverebene anpassen können. In diesem Artikel werden wir tief in die Konfigurationsengine von Ollama eintauchen und untersuchen, wie Sie die Parameter lokaler Sprachmodelle mithilfe der Ollama Modelfile optimieren, die Hardwareleistung mit Serverumgebungsvariablen steigern und präzise Eingabeflüsse mit der Go-Template-Syntax formatieren können.

1. Die Ollama Modelfile: Ihr lokales Modell-Blueprint

Ähnlich wie eine Dockerfile definiert, wie ein Container erstellt wird, ist eine Ollama Modelfile eine deklarative Konfigurationsdatei, die festlegt, wie sich ein lokales Sprachmodell verhalten soll. Sie ermöglicht es Ihnen, Systemanweisungen anzupassen, Modellparameter zu modifizieren und diese Konfigurationen in eine neue, wiederverwendbare Modellvariante zu verpacken, die Sie mit einem einzigen Befehl ausführen können.

Eine grundlegende Modelfile besteht aus einem Basis-Modellverweis (unter Verwendung der FROM-Direktive), systemweiten Richtlinien (unter Verwendung von SYSTEM) und Parameteränderungen (unter Verwendung der PARAMETER-Direktive):

// Beispiel: Eine benutzerdefinierte Entwickler-Modelfile\n\n# Verwenden Sie Llama 3.1 8B als Basis-Modell\nFROM llama3.1:8b\n# Modellparameter festlegen\nPARAMETER temperature 0.2\nPARAMETER num_ctx 8192\nPARAMETER min_p 0.05\n# Systempersona und Verhaltensrichtlinien definieren\nSYSTEM \"\"\"Sie sind ein Elite-Software-Ingenieur von höchster Präzision. \nBieten Sie prägnante, modulare und optimierte Code-Lösungen an. \nFügen Sie keine konversationellen Füllwörter ein, es sei denn, es wird ausdrücklich danach gefragt.\"\"\"

Um Ihr benutzerdefiniertes Modell zu kompilieren und auszuführen, verwenden Sie den Befehl ollama create in Ihrem Terminal:

# Erstellen Sie das Modell mit dem Namen 'dev-llama' aus der Modelfile\nollama create dev-llama -f ./Modelfile\n# Führen Sie das neu erstellte Modell aus\nollama run dev-llama

Durch die direkte Einbettung dieser Parameter in die Modelldefinition stellen Sie sicher, dass jede Anwendung oder API-Anfrage, die dev-llama abfragt, diese Optimierungen sofort erbt, ohne dass rohe JSON-Parameter in jeder API-Anfrage übergeben werden müssen.

2. Feinabstimmung der Sampling-Parameter

Wenn ein Modell Text generiert, „weiß“ es nicht, was Wörter sind; es berechnet eine Wahrscheinlichkeitsverteilung über seinen Wortschatz für das nächstwahrscheinlichste Token. Die Sampling-Parameter bestimmen, wie die Engine das nächste Token aus dieser Verteilung auswählt. Die Anpassung dieser Einstellungen ist der effektivste Weg, um die Kreativität und Präzision des Modells an Ihren spezifischen Anwendungsfall anzupassen.

Temperatur: Der Zufallsregler

Der Temperaturparameter steuert die Skalierung der Token-Wahrscheinlichkeitsverteilung. Mathematisch wird er auf die Roh-Logits (Pre-Softmax-Werte) angewendet, die vom Modell erzeugt werden, bevor sie in Wahrscheinlichkeiten umgewandelt werden:

  • Niedrige Temperatur (z. B. 0.1 bis 0.2): Glättet Optionen mit niedriger Wahrscheinlichkeit und verstärkt hochwahrscheinliche. Dies führt zu hochgradig deterministischen, konsistenten und logischen Vervollständigungen. Ideal für die Codegenerierung, mathematische Überlegungen, strukturierte Datenextraktion (JSON/YAML) und faktische Zusammenfassungen.
  • Hohe Temperatur (z. B. 0.8 bis 1.2): Glättet die Unterschiede zwischen den Token-Wahrscheinlichkeiten, wodurch weniger wahrscheinliche Tokens wettbewerbsfähiger werden. Dies führt zu Vielfalt, Zufälligkeit und „Kreativität“ in den Antworten. Ideal für kreatives Schreiben und Brainstorming.

Konfigurieren Sie für hochgradig deterministische, strukturierte Aufgaben:

PARAMETER temperature 0.1

Top-K, Top-P und Min-P: Eingrenzung des Token-Pools

Unbeaufsichtigt können Modelle selbst bei niedrigen Temperaturen gelegentlich hochgradig unangemessene Tokens aus dem Ende der Wahrscheinlichkeitsverteilung auswählen. Um dies zu verhindern, filtern Modell-Engines den aktiven Token-Pool, bevor das endgültige Token ausgewählt wird.

  • Top-K (z. B. 40): Beschränkt den Pool auf die K wahrscheinlichsten nächsten Tokens. Jedes Token, das niedriger als 40 eingestuft wird, wird sofort verworfen, unabhängig von seiner tatsächlichen Wahrscheinlichkeit. Dies ist eine grobe, aber effektive Methode, um hochgradig erratische Tokens zu entfernen.
  • Top-P / Nucleus Sampling (z. B. 0.90): Beschränkt den Pool auf eine dynamische Menge von Tokens, deren kumulierte Wahrscheinlichkeit den Schwellenwert P überschreitet. Bei 0.90 sortiert Ollama alle Tokens von der höchsten zur niedrigsten Wahrscheinlichkeit und behält nur die oberste Gruppe, die die ersten 90 % der Verteilung ausmacht. Wenn das Modell sehr zuversichtlich ist, kann der Pool auf nur 2 oder 3 Tokens komprimiert werden; wenn es verwirrt ist, erweitert sich der Pool.
  • Min-P (z. B. 0.05 bis 0.10): Eine moderne, weit überlegene Alternative zu Top-P. Anstatt einen statischen kumulierten Schnitt zu verwenden, filtert min_p Tokens heraus, deren Wahrscheinlichkeit unter einem dynamischen Schwellenwert im Verhältnis zur Wahrscheinlichkeit des führenden Tokens liegt. Wenn das führende Token beispielsweise eine Wahrscheinlichkeit von 0.80 hat und min_p auf 0.05 gesetzt ist, beträgt der Mindestschwellenwert für jedes andere Token 0.80 * 0.05 = 0.04. Wenn das führende Token sehr sicher ist (z. B. 0.99), werden alle anderen Tokens aggressiv entfernt. Wenn das führende Token unsicher ist (z. B. 0.15), sinkt der Schwellenwert auf 0.0075, wodurch ein breiter Pool kreativer Optionen offen bleibt.

Stellen Sie robuste Sampling-Grenzen in der Modelfile ein:

PARAMETER top_k 40\nPARAMETER top_p 0.90\nPARAMETER min_p 0.05

Hinweis: Bei der Verwendung von min_p sollten Sie top_p in der Regel auf den Standardwert (1.0) belassen oder hoch (0.95+) einstellen, damit es nicht mit dem überlegenen, dynamischen Skalierungsverhalten von min_p interferiert.

3. Verhindern von Schleifen und sich wiederholenden Ausgaben

Einer der frustrierendsten Fehler bei der lokalen Modellbereitstellung ist die Wiederholungsschleife, bei der ein Modell beginnt, denselben Satz, dieselbe Phrase oder denselben Codeblock unendlich zu generieren. Dies wird normalerweise durch eine Kombination aus einer kleinen Modellgröße (z. B. 1.5B oder 3B Parameter) und einem Mangel an Strafgrenzen ausgelöst.

Ollama bietet drei wichtige Parameter, um diese Schleifen zu verhindern und zu unterbrechen.

Wiederholungs- und Präsenzstrafen

  • Wiederholungsstrafe (repeat_penalty): Multipliziert die Roh-Logits von bereits generierten Tokens, wodurch sie weniger wahrscheinlich erneut erscheinen. Ein Wert von 1.1 bis 1.2 ist in der Regel ausreichend, um Schleifen abzuschrecken, ohne dass das Modell notwendige Grammatikwörter (wie „der“ oder „und“) vermeidet.
  • Präsenzstrafe (presence_penalty): Wendet eine flache, einmalige Strafe auf jedes Token an, das mindestens einmal im generierten Text erschienen ist, und ermutigt das Modell, völlig neue Themen oder Vokabeln einzuführen.
  • Häufigkeitsstrafe (frequency_penalty): Wendet eine Strafe proportional zur Anzahl der Male an, die ein Token erschienen ist, und discouragiert so die übermäßige Verwendung spezifischer Begriffe.

Ermutigen Sie Vielfalt im Vokabular und verhindern Sie Schleifen:

PARAMETER repeat_penalty 1.15\nPARAMETER presence_penalty 0.05\nPARAMETER frequency_penalty 0.05

Beenden der Generierung mit Stop-Sequenzen

Manchmal tritt keine interne Schleife im Modell auf, aber es erkennt nicht, wann es seinen Turn beendet hat und generiert weiterhin falsche Antworten des Benutzers. Sie können dies verhindern, indem Sie explizite Stop-Sequenzen (Stop-Tokens) definieren. Wenn das Modell eine Stop-Sequenz generiert, stoppt die Engine sofort die Inferenz und gibt die Antwort zurück.

Häufige Stop-Tokens sind Chat-Markierungen wie <|im_end|>, Markdown-Abschnittsüberschriften oder benutzerdefinierte Trennzeichen:

# Stoppen Sie die Generierung, wenn ChatML-Tags oder Benutzerzeilen generiert werden\nPARAMETER stop \"<|im_end|>\"\nPARAMETER stop \"<|im_start|>\"\nPARAMETER stop \"User:\"

4. Verwaltung von Kontextfenstern und Speicher

Die lokalen Hardware-Ressourcen – insbesondere der Videospeicher (VRAM) auf Ihrer GPU – sind stark eingeschränkt. Zu verstehen, wie Sie die Speicherstrukturen Ihres Modells dimensionieren, ist entscheidend für den Aufbau robuster lokaler Anwendungen.

Kontextlänge (num_ctx)

Die Kontextlänge (num_ctx) definiert die Größe des Aufmerksamkeitsfensters (in Tokens), das das Modell auf einmal verarbeiten kann. Dies umfasst sowohl den Eingabeprompt (und die Systemhistorie) als auch die neu generierten Ausgabetokens.

Standardmäßig initialisiert Ollama viele Modelle mit einem konservativen Kontextfenster von 2048 oder 4096 Tokens, um einen Speicherüberlauf auf weniger leistungsfähiger Hardware zu verhindern. Moderne Modelle wie Llama 3.1 oder Mistral unterstützen jedoch native Kontextfenster von bis zu 128.000 Tokens. Wenn Sie ein retrieval-augmented generation (RAG)-System erstellen oder große Code-Dateien importieren, führt eine Begrenzung auf 2048 Tokens zu einer stillen Trunkierung des Prompts, was zu einem Verlust des Kontexts und hochgradig ungenauen Vervollständigungen führt.

Sie können diesen Parameter in Ihrer Modelfile explizit erhöhen:

# Kontextfenster auf 16.384 Tokens erweitern\nPARAMETER num_ctx 16384

Hinweis: Die Berechnung der Aufmerksamkeit skaliert quadratisch ($O(N^2)$) mit der Kontextlänge. Wenn Sie Ihre num_ctx verdoppeln, erhöht sich der VRAM-Bedarf zur Speicherung des aktiven Zustands des Modells während der Generierung dramatisch. Stellen Sie sicher, dass Ihre Hardware die erhöhte Zuweisung bewältigen kann.

KV Cache Quantisierung (OLLAMA_KV_CACHE_TYPE)

Um Beziehungen zwischen Tokens über ein langes Gespräch hinweg zu verfolgen, speichert das Modell einen aktiven Schlüssel-Wert (KV)-Cache im VRAM. Bei großen Kontextlängen (wie 32k oder 128k) könnte die Größe des KV-Caches die Gewichtungsgröße des Modells selbst überschreiten, was zu Speicherüberläufen führt.

Um dem entgegenzuwirken, unterstützt Ollama die KV-Cache-Quantisierung. Ähnlich wie Modellgewichte von 16-Bit-Gleitkommazahlen auf 4-Bit-Ganzzahlen komprimiert werden können, kann der KV-Cache auf niedrigere Präzision quantisiert werden, ohne die Textqualität wesentlich zu beeinträchtigen:

  • f16: Standardmäßiger, unkomprimierter 16-Bit-Gleitkomma-Cache (Standard)
  • q8_0: Komprimiert den KV-Cache auf 8-Bit-Ganzzahlen, wodurch etwa 50 % des KV-VRAM gespart werden, ohne die Ausgabequalität wesentlich zu beeinträchtigen
  • q4_0: Komprimiert den KV-Cache auf 4-Bit-Ganzzahlen, wodurch 75 % des KV-VRAM gespart werden, was massive Kontextgrößen auf Verbrauchermaschinen ermöglicht, jedoch mit einer leichten Erhöhung der Modellverwirrung.

Dieser Parameter wird über die Serverumgebungsvariable OLLAMA_KV_CACHE_TYPE festgelegt (im nächsten Abschnitt detailliert beschrieben).

5. Server-Level Tuning: Umgebungsvariablen

Während Modelfile-Parameter steuern, wie ein bestimmtes Modell funktioniert, passen Serverumgebungsvariablen den Ollama-Hintergrunddienst selbst an. Diese Konfigurationen bestimmen, wie Ollama mit Ihrem Betriebssystem interagiert, Systemressourcen verwaltet, parallele Verarbeitung steuert und Ihre Hardwarebeschleunigungsschichten nutzt.

Wie Sie diese Variablen festlegen, hängt von Ihrem Betriebssystem ab:

  • macOS: Festgelegt über Terminal-Exporte oder modifiziert in Ihren Anwendungsumgebungsdateien (oder gestartet über launchctl für Hintergrunddienste)
  • Linux (Systemd): Konfiguriert über systemctl edit ollama.service, um Umgebungsvariablen zu injizieren
  • Windows (WSL2 / System): Festgelegt in den Standard-Windows-Systemumgebungsvariablen oder in Ihrem WSL-Terminalprofil

Die wesentlichen Servervariablen

Variablenname Standardwert Zweck & Beste Praktiken
OLLAMA_HOST 127.0.0.1:11434 Bindet die Netzwerk-Schnittstelle des Servers. Setzen Sie auf 0.0.0.0:11434, um die API für andere Computer in Ihrem lokalen Netzwerk freizugeben.
OLLAMA_MODELS Plattform-spezifischer Standard Ändert den Speicherort für Modelle. Es wird dringend empfohlen, dies auf eine hochgeschwindigkeits externe NVMe-SSD zu verweisen, wenn Ihr Bootlaufwerk wenig Speicherplatz hat.
OLLAMA_KEEP_ALIVE 5m (5 Minuten) Steuert, wie lange Modelle nach Ihrer letzten Anfrage im GPU-Speicher geladen bleiben. Setzen Sie auf 1h, um Ladeverzögerungen in aktiven Pipelines zu vermeiden, oder -1, um es unbegrenzt geladen zu halten.
OLLAMA_NUM_PARALLEL 1 Aktiviert die parallele Anfragebearbeitung. Setzen Sie dies auf 2 oder 4, um Modellinstanzen zu teilen, die gleichzeitige API-Anfragen bearbeiten, obwohl dies den VRAM-Verbrauch vervielfacht.
OLLAMA_KV_CACHE_TYPE f16 Spart VRAM bei großen Kontextlängen. Setzen Sie auf q8_0 für allgemeine Nutzung oder q4_0 für massive Kontextgrößen auf Verbrauchergrafikkarten.
OLLAMA_FLASH_ATTENTION 0 (deaktiviert) Setzen Sie auf 1,


Quellen: kdnuggets

Bildquelle: KI generiert

KI Snack