[!NOTE] Automatische Übersetzung Dieser Artikel wurde automatisch aus der englischen Originalversion übersetzt.

LLM Fine-Tuning Leitfaden: LoRA, QLoRA, DoRA, Unsloth, Axolotl und Deployment

Die meisten Fine-Tuning-Fehler sind Entscheidungsfehler. Ein Team trainiert zunächst, bevor es nachweist, dass Prompting, Retrieval oder Constrained Decoding das Problem nicht lösen können; es bewertet die Ergebnisse anhand der Trainingsdatenmenge oder stellt nach dem Training fest, dass das erzeugte Modul schwer zu nutzen ist.

Dieser Leitfaden betrachtet die Anpassung als ein Experiment mit einer definierten Abbruchbedingung. Er beginnt mit der Entscheidungsgrenze und verfolgt anschließend einen Ablauf über die Daten, LoRA bzw. QLoRA, die spezifische Bewertung für die jeweilige Aufgabe, die Exportierung sowie Serving.

TL;DR: Führen Sie eine Feinabstimmung durch, sobald eine gemessene Baseline zeigt, dass eine Änderung des Verhaltens von Model einen Aufwand für ein Weight-Update rechtfertigt. Wenden Sie Retrieval bei der Anpassung von Fakten sowie Constrained Decoding bei der Anpassung der Syntax an. Beginnen Sie mit LoRA, wenn die zugrundeliegende Model-Struktur noch ausreichend flexibel ist; nutzen Sie hingegen QLoRA, wenn begrenzte, gefrorene Weight-Speichermengen das Limit darstellen. Bereiten Sie vor dem Training ein Evaluationsset vor, vergleichen Sie es mit der unangepassten Baseline und wählen Sie schließlich das geeignete Deployment-Ergebnis, bevor Sie sich für eine Methode entscheiden.

Sollte man überhaupt feintunen?

Bevor Sie GPU Stunden investieren, entscheiden Sie zunächst, ob Fine-Tuning das geeignete Werkzeug für das vorliegende Problem ist.

Entscheidungsflussdiagramm

Fine-Tuning im Vergleich zu RAG

Fine-Tuning kann die Art und Weise verändern, wie ein Model Sprache aus einem bestimmten Domänenbereich verwendet, stellt jedoch ein unzureichendes Mechanismus dar, um Fakten zu aktualisieren, die sich ändern oder zitiert werden müssen. Retrieval sowie Fine-Tuning adressieren unterschiedliche Aspekte dieses Problems und sollten in der Regel in derselben Systemarchitektur integriert werden.

FunktionFine-TuningRAG (Retrieval – Erweiterte Generierung)
KernfunktionDas interne Alter von Weights zur Vermittlung von Fähigkeiten, Stilen oder VerhaltensweisenStellt zu einem bestimmten Zeitpunkt Inference externe, aktuelle Kontextinformationen bereit.
Am besten geeignet für• Spezifische Konversationsstile
• Komplexe Befehlsausführung
• domänenspezifische Reasoning
• Schnell wechselnde Daten (Nachrichten, Aktienkurse)
• Verringerung von Hallucinations (Grounding)
• Angabe der Quellen
WissensverarbeitungEs kommt zu Veränderungen im statistischen Verhalten des Weights; eine exakte Recall-Wertgarantie besteht nicht.Liest Datensätze oder Abschnitte ein, die aktualisiert und zitiert werden können
AktualisierungsfrequenzErfordert ein Neutraining für AktualisierungenWird umgehend mit neuen Dokumenten aktualisiert.

Ingenieurwesen von Fine-Tuning versus Prompt

Moderne LLMs reagieren gut auf klare Prompts-Anweisungen sowie entsprechende Beispiele. Prüfen Sie diese Optionen sorgfältig, bevor Sie in Fine-Tuning investieren.

AspektFine-TuningPrompt Ingenieurwesen
EinrichtungskostenHoch (Datenkuratierung, GPU-Rechenleistung, Iteration)Niedrige (iterative Prompt-Verfeinerung)
FlexibilitätErfordert einen weiteren Trainings- und Veröffentlichungszyklus.Änderungen mit dem Prompt
Format/StilKann ein wiederholtes Verhalten wahrscheinlicher machen.Oft ausreichend für das Styling sowie einfache Formate.
LatencyKann wiederholte Anweisungen kürzen.Es hängt von der Länge von Prompt sowie vom Caching des Anbieters ab.
Am besten geeignet fürKomplexe Verhaltensmuster, Destillation, SkalierungskostenSchnelle Iterationen sowie sich ändernde Anforderungen

[!TIP] Versuchen Sie zunächst das Prompting Beginnen Sie mit einem Prompt sowie repräsentativen Beispielen. Falls nur die Ausgabesyntax unzuverlässig ist, fügen Sie vor der Änderung des Weights einen Constrained Decoding hinzu.

Fine-Tuning im Vergleich zu Constrained Decoding

Bibliotheken wie zum Beispiel xgrammar und outlines Die Generierung wird auf einen JSON schema, eine reguläre Ausdrucksform oder eine Grammatik beschränkt. Je nach Art der Beschränkung sowie dem Backend wird entweder ein Automat oder eine Grammatik erstellt, um ungültige folgende Tokens zu blockieren. Ein Update des Weight ist nicht erforderlich.

Dies garantiert die Verwendung der unterstützten Ausgabssprache – nicht jedoch, dass die Werte wahr, vollständig oder semantisch angemessen sind. Eine syntaktisch korrekte Funktionsaufrufung kann dennoch eine fehlerhafte Kunden-ID enthalten.

AspektConstrained DecodingFine-Tuning
EinstellungSofortige Umsetzung – Schema definieren und bereitstellenErfordert Datenkuratierung, GPU-Rechenleistung sowie iterative Optimierungen.
GarantieGültige Syntax für die unterstützte EinschränkungGelerntes Verhalten – die Einhaltung der Schema-Vorgaben kann variieren.
FlexibilitätDas Schema kann jederzeit ohne Neutraining geändert werden.Nach dem Training gesperrt
LatencyLeichte Overhead-Effekte (Model kann mit dem Schema in Konflikt geraten)Die natürliche Ausgabe von Model erfolgt in reduzierter Form.
Am besten geeignet fürJSON, Auswahlmöglichkeiten, Grammatiken, Syntax für ToolaufrufeDas grundlegende Model weist kein wiederholtes Verhalten bei Aufgaben auf.

Eine praktische Vorgehensweise:

  1. Beginnen Sie mit Prompting und Few-Shot-Beispielen für die grundlegende Formatierung.
  2. Fügen Sie Constrained Decoding hinzu.xgrammar oder outlines) wenn die Syntax inkonsistent ist.
  3. Führen Sie eine Feinabstimmung nur durch, wenn Sie Verhaltensänderungen benötigen, die durch ein Schema nicht vorgeschrieben werden können.

Schnellreferenz: Zuordnung von Problemen zu Lösungen

HerausforderungErster Mechanismus zur TestungWarum?
Fehlendes WissenRAGModels Fakten erfinden. Retrieval liefert fundierte, aktuelle Kontexte.
Falsches Format/StilPrompt IngenieurwesenModerne Models befolgen die Stilrichtlinien zuverlässig anhand von Few-Shot-Beispielen.
Ungültige AusgabesyntaxConstrained DecodingStellt während der Generierung sicher, dass ein unterstütztes Schema oder eine Grammatik eingehalten wird.
Wiederholte AufgabenerfolglosigkeitFine-Tuning (SFT)Lernt anhand sorgfältig ausgewählter Eingab-/Ausgabepaare.
Paarweise PräferenzunterschiedeOptimierung der PräferenzstrukturWird ausgewählte bzw. abgelehnte Beispiele nach der Messbarkeit des Verhaltens der Aufgabe verwendet.
Latency/Kosten bei SkalierungDestillation (SFT)Kleinere Schülermodelle Model anhand der Ausgaben größerer Lehrermodelle trainieren
Verkleinern der Größe von ModelQuantizationKein Training – Komprimierung von Weights (FP16→INT4) zur beschleunigten Inference

Den wirtschaftlichen Nutzen messbar machen

Fine-Tuning kann wiederkehrende Prompt Tokens verringern oder es ermöglichen, dass ein kleinerer Model das Ziel erreicht, wobei keiner dieser Einsparungen automatisch erfolgt. Berechnen Sie den Break-Even-Punkt anhand Ihrer eigenen Traffic-Daten und Preise:

[ \text{Gewinnschwelle-Anfragen} = \frac{\text{Kosten für Training + Bewertung + Deployment}} {\text{Basiskosten pro Anfrage} - \text{Anpassungskosten pro Anfrage}} ]

Falls der Nenner klein ist, negativ ist oder auf einer noch nicht bewiesenen Qualitätsannahme beruht, verfügt das Projekt derzeit noch nicht über eine wirtschaftliche Rechtfertigung.

[!TIP] Die hybride Konfiguration Eine gängige Architektur besteht aus einem für die jeweilige Aufgabe angepassten, kleineren Model sowie Retrieval zur Aktualisierung von Fakten. Betrachten Sie den größeren, per Prompt gesteuerten Model als Grundlage und behalten Sie den kleineren Model nur dann bei, wenn er die gleichen, auf die spezifische Aufgabe zugeschnittenen Qualitäts- und Sicherheitsschwellenwerte erfüllt.


Arten von Fine-Tuning

Es gibt drei Hauptformen, die Fine-Tuning annehmen kann. Sie unterscheiden sich dadurch, welche Art von Daten sie benötigen und was sie den Model beibringen.

Fine-Tuning Typen

1. Fortgesetztes Vortrainieren (unüberwacht)

Man trainiert den Basisspeicher. Model bei mehr Rohtext ohne Labels. Es setzt die Verarbeitung fort.Token Die Vorhersage erfolgt genauso wie während des ursprünglichen Vortrainings.

Wann es einzusetzen ist:

Beispiel: Training anhand von Millionen von klinischen Notizen, damit der Model medizinische Abkürzungen, Arzneimittelnamen sowie klinische Workflows erkennt.

2. Überwachtes Fine-Tuning (SFT)

SFT wird anhand von beschrifteten (Eingabe-, Ausgabepaarungen) trainiert. Dabei zeigt man dem Model die exakte Ausgabe, die man für jede Eingabe erwartet.

Wann es eingesetzt werden sollte:

Beispiel: Training mit Paaren aus (Beschreibung der SQL-Abfrage, SQL-Code) für Text-zu-SQL.

{
    "input": "Get all users who signed up last month",
    "output": "SELECT * FROM users WHERE signup_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH)"
}

3. Anweisungstuning

Instruction Tuning ist ein Spezialfall von SFT, der darauf abzielt, Models dazu zu bringen, einer Vielzahl von Anweisungen in natürlicher Sprache zu folgen. Die Trainingsdaten bestehen aus (Anweisung, Antwort)-Paaren aus verschiedenen Aufgabenbereichen.

Wann es einzusetzen ist:

Beispiel: Training mit Tausenden verschiedener Anweisungen wie „Zusammenfassen Sie diesen Artikel“, „Schreiben Sie ein Gedicht über X“ oder „Erklären Sie Y in einfachen Worten“.

Vergleich

AspektFortgesetztes VorkennzeichnungstrainingSFTAnleitungstuning
DatenRohtext(Input-, Output-)Paare(Pfad, Antwort)-Paare
LabelsKeines (unüberwacht)auf die Aufgabe zugeschnitteneverschiedene Aufgaben
ZielDomainwissenSpezifisches Verhalten der AufgabeJegliche Anweisung befolgen.
DatenmengeIn der Regel handelt es sich um den größten Korpus.Bestimmt durch die Aufgabendeckung und die Fehlervielfalt.In der Regel umfassender als auf spezifische Aufgaben zugeschnittene SFT

[!NOTE] Was die Praxis tatsächlich vornimmt SFT sowie die Anpassung von Instruktionen nutzen dasselbe nächste Token-Ziel; der Unterschied liegt in der Breite und Struktur des Dataset. Ein weiteres Vortrainieren stellt ein eigenständiges Experiment dar, dem Tests sowohl hinsichtlich fachspezifischer Verbesserungen als auch bezüglich einer Regression der allgemeinen Fähigkeiten folgen sollten.


Der 7-stufige Fine-Tuning Pipeline

Fine-Tuning ist ein Pipeline und keine einzelne Anweisung. Jede Phase weist eigene Fehlermöglichkeiten auf, wobei das Überspringen einer Phase in der Regel später zu einem fehlerhaften Model führt.

7-Stufen-Prozess Pipeline

Jede Phase baut auf der vorherigen auf:

  1. Datenvorbereitung – Definieren Sie die Bewertungseinheit, teilen Sie die Daten auf und reinigen sowie formatieren Sie sie anschließend.
  2. Model-Auswahl – Wählen Sie den geeigneten Basis-Model aus und laden Sie den Weights.
  3. Trainingskonfiguration – Konfigurieren Sie die Hardware, Hyperparameter sowie die Optimierungsstrategie.
  4. Fine-Tuning – Führen Sie SFT, DPO oder ein ORPO-Training durch.
  5. Bewertung – Überprüfen Sie die Leistung von Benchmark und validieren Sie die Qualität.
  6. Deployment – Exportieren und bereitstellen Sie Ihren Model.
  7. Überwachung – Verfolgen Sie die Leistung, warten Sie das System und führen Sie Iterationen durch.

[!WARNUNG] Daten bilden die Grundlage Das Trainieren führt zu systematischen Fehlern in den Beispielen. Überprüfen Sie vor dem Aufwand für Optimierungsversuche die Etiketten, Datenlecks, Abdeckung sowie die Konformität mit den Richtlinien.


Phase 1: Datenvorbereitung

Die meisten Fine-Tuning-Projekte scheitern genau an diesem Punkt und nicht beim Training. Die moderne Datenvorbereitung umfasst weitaus mehr als nur das Durchlaufen von Regulären Ausdrücken auf CSV-Dateien.

Daten Pipeline

Die 5-stufige Datenverarbeitung Pipeline

Tools wie DataTrove und Distilabel können bei großem Umfang unterstützen, doch die Auswahl des Pipeline sollte anhand der Fehlertaxonomie sowie des Datenvertrags erfolgen und nicht von einer bevorzugten Tool-Lösung bestimmt werden.

1. Eingabe und Filterung

2. Richtlinie zu sensiblen Daten

3. Deduplizierung (MinHash LSH)

4. Synthetische Erweiterung, falls erforderlich

5. Formatierung

Beispiele für Datensatzformate

Alpaca-Format (Anweisungsbefolgung):

{
    "instruction": "Summarize the following text.",
    "input": "The text to be summarized...",
    "output": "This is the summary."
}

ShareGPT/ChatML-Format (konversationell):

{
    "conversations": [
        { "from": "user", "value": "Hello, who are you?" },
        { "from": "assistant", "value": "I am a helpful AI assistant." }
    ]
}

Was tatsächlich von Bedeutung ist


Phase 2: Auswahl von Model und Hardware

Die Auswahl der Basis Model sowie das Verständnis der GPU-Begrenzung bestimmen, was tatsächlich trainiert werden kann.

Beginnen Sie mit der kleinsten Basis Model, die bereits die unverzichtbaren Grundüberprüfungen bestehen lässt. Überprüfen Sie:

Fine-Tuning stellt einen Anpassungsschritt dar und keine Reparatur einer ungeeigneten Basis. Sollten die Funktionalitäten des Model die vom Dataset abgedeckten Anforderungen nicht erfüllen, wählen Sie vor dem Sammeln weiterer Epochen eine andere Basis aus.

Größenordnung der Ausführung festlegen – nicht die Marketingstufe

es gibt keinen dauerhaften „Model Größe → GPU” Tabelle. Die Spitzenwerte des Arbeitsspeicherverbrauchs ändern sich mit Weight Präzision, Optimierer, Anzahl der trainierbaren Parameter, Sequenzlänge, Größe des Mikrobatches Activation Checkpointing Attention Implementierung und Framework Overhead. Beginnen Sie mit einer Schätzung des Speicherverbrauchs und führen Sie anschließend einen kurzen Smoke-Test mit maximaler Länge auf dem genauen Stack aus.

SpeicherkomponenteVollständiger Fine-TuningLoRAQLoRA
Base WeightsTraininggenauigkeiteingefroren, in der Regel BF16/FP16Eingefroren, typischerweise 4-Bit NF4
GradientenAlle trainierbaren WeightsAdapter WeightsAdapter Weights
OptimiererzuständeAlle trainierbaren WeightsAdapter WeightsAdapter Weights
ActivationsDas hängt bei jeder Methode von der Batch-Größe sowie der Länge der Sequenz ab.D dieselbe AbhängigkeitD dieselbe Abhängigkeit

Der ursprüngliche Artikel zu QLoRA passte in seiner spezifischen Konfiguration einen 65B großen LLaMA Model auf eine 48 GB große GPU. Dieses Ergebnis stellt eine nützliche Obergrenze dar, nicht jedoch eine Garantie dafür, dass jede aktuelle 70B-Architektur, jede Kontextlänge, Kernel sowie jeder Trainingsalgorithmus auf derselben Hardware untergebracht werden können.

Speichermathematik

Für einen Model mit (P) Parametern benötigen allein die Weights etwa (2P) Bytes im BF16/FP16 oder (0{,}5P) Bytes bei vier Bit pro Byte, noch bevor Metadaten nach Quantization sowie Puffer nach Runtime hinzukommen. Ein vollständiger Trainingsprozess im Adam-Stil fügt außerdem Gradienten, Optimiererzustände sowie oft Master-Modelle mit höherer Präzision nach Weights hinzu. LoRA vermeidet den größten Teil des Speichers für lernbare Zustände; darüber hinaus verringert QLoRA den Speicherbedarf der eingefrorenen Basis-Weight-Komponenten. Bei sehr langen Sequenzen kann Activations dennoch dominieren.

Verwenden Sie diesen Workflow:

  1. Wählen Sie die längste Sequenz sowie den maximalen Mikrobatch aus, den Sie unterstützen müssen.
  2. Schätzen Sie Weights sowie den Trainierzustand ab und lassen Sie dabei Puffer für Activations und Kernels frei.
  3. Führen Sie einen Vorwärts-/Rückwärts-Schritt bei der maximal möglichen Länge aus.
  4. Erfassen Sie den Höchstwert der zugewiesenen sowie reservierten Speichermenge.
  5. Erst danach skalieren Sie die Größe des Batches, die Anzahl der Prozessorkerne, die Länge der Sequenz oder die Anzahl von GPU.

Phase 3: Trainingsmethoden (PEFT und LoRA)

Vollständiger Fine-Tuning gegen PEFT

Die vollständige Fine-Tuning (FFT)-Berechnung erfolgt alle Weight, wodurch Gradienten sowie der Zustand des Optimizers mit dem gesamten Model skaliert werden. Der Höchstwert lässt sich nicht allein anhand der Anzahl der Parameter bestimmen, liegt aber deutlich über dem Speicherbedarf, der zur Laden der Weights für Inference erforderlich ist.

Parameter-effizientes Fine-Tuning (PEFT) trainiert lediglich einen kleinen Teil der Parameter und friert den Rest ein. Dadurch wird die mathematische Formulierung erheblich vereinfacht.

LoRA: der Ausgangspunkt

LoRA (Low-Rank Adaptation) führt dazu, dass eine vortrainierte Matrix festgelegt wird und ihre erlernte Aktualisierung durch zwei kleinere Matrizen dargestellt wird. Die ursprüngliche Veröffentlichung begründet dieses Vorgehen mit der Hypothese, dass nützliche Anpassungsaktualisierungen einen niedrigen intrinsischen Rang aufweisen.

LoRA Architektur

Für eine gefrorene Matrix (W0 \in \mathbb{R}^{d{out} \times d_{in}}) lernt LoRA Folgendes:

Die angepasste Schicht ist:

[ W’ = W_0 + \frac{\alpha}{r}BA ]

Der Adapter weist (r(d*{in}+d*{out})) trainierbare Parameter auf, anstelle von (d*{in}d*{out}) für diese Matrix. Bei einer quadratischen Matrix mit 4.096 Elementen und Rang 16 bedeutet das eine Reduktion der Dimensionen um den Faktor 128 – und nicht um den Faktor 10.000 wie bei einer beliebigen Model. Der in der LoRA-Veröffentlichung angegebene Faktor von 10.000 bezog sich auf eine spezifische Konfiguration von GPT-3 mit 175 Milliarden Parametern, bei der ausgewählte Matrizen adaptiert wurden.

Vergleich der PEFT-Methoden

MethodeWelche ÄnderungenWählen Sie es aus, wenn
LoRAEisgefrorene Basisplattform zusammen mit trainierbaren Aktualisierungen niedrigen RangsDer Basis-Model passt gut hinein, und Sie möchten kleine Aufgabenergebnisse erhalten.
QLoRALoRA zusammen mit der im 4-Bit-Format gespeicherten festgefrorenen BasisDer Basis-Weight-Speicher ist der begrenzende Faktor.
DoRATrennt die Größe von Weight von der durch LoRA aktualisierten Richtung.Eine sorgfältig ermittelte LoRA-Baseline führt zu einem Qualitätsdefizit, das eine erhöhte Komplexität rechtfertigt.
Vollständiger Fine-TuningAll Model WeightsPEFT verfehlt das Ziel, und der erzielte Qualitätszuwachs rechtfertigt das verteilte Training sowie einen vollständigen Checkpoints.

Wann welchen wählen

DoRA: Weight-dekomponierte LoRA

DoRA (Weight – zerlegte Anpassung niedriger Rangordnung) trennt die Länge jedes Weight-Vektors von seiner Richtung. Dabei wird eine LoRA-Aktualisierung auf den Richtungskomponenten angewendet, während die Länge des Vektors separat ermittelt wird.

DoRA Architektur

Wie es funktioniert:

Anstatt Weights als einzige Einheit zu behandeln, zerlegt DoRA die vortrainierten Weights in zwei Komponenten:

  1. Größe – ein trainierbarer Wert pro Weight-Vektor.
  2. Richtung – ein normalisierter Vektor, der mithilfe von niedrig-rangigen Matrizen aktualisiert wird.

In kompakter spaltenbasierter Notation:

[ W’ = m \frac{V + BA}{\lVert V + BA \rVert_c} ]

wo:

Was Sie für diese zusätzliche Struktur erhalten:

Zusammenführung von Adaptern für das Multi-Task-Lernen

Durch getrennte Adapter kann eine festgefrorene Basis mehrere Aufgaben unterstützen. Es ist möglich, Anfragen an einen bestimmten Adapter zu leiten, bei Unterstützung mehrere Adapter über denselben Engine zu betreiben, oder ein offline zusammengeführtes Ergebnis zu erzeugen. Durch das Zusammenführen können Störungen entstehen; daher sollte das resultierende Artefakt gründlich geprüft werden, anstatt davon auszugehen, dass die ursprünglichen Adapter sauber zusammenarbeiten.

Gängige Fusionsmethoden:

  1. Kombination – Durch Vereinigung der Adapterparameter wird die effektive Ranggröße erhöht. Schnell und einfach.
  2. Lineare Kombination – Gewichtete Summe der Adapter. Bietet Anpassungsmöglichkeiten.
  3. SVD – Matrixzerlegung zur Verschmelzung. Flexibler, aber langsamer.

Beispiel: Ein Adapter für die Zusammenfassung, ein weiterer für die Übersetzung – beides wird zu einem einzigen Mehrzweck-Model@ zusammengeführt.


Phase 4: Fine-Tuning sowie Abstimmung der Präferenzen

SFT lernt anhand von Demonstrationen. Die Methode der Präferenzoptimierung hingegen nutzt Vergleiche wie „die ausgewählte Antwort A ist besser als die abgelehnte Antwort B“. Wenden Sie sie nur dann an, wenn eine paareweise Präferenz die geeignete Beschreibung für den Fehler darstellt; bei faktischer Korrektheit und Einhaltung von Richtlinien sind oft stärkere Evaluators erforderlich als eine allgemeine Präferenz.

Methoden zur Ausrichtung

PPO-basierte RLHF

Das ursprüngliche Verfahren bestand aus drei Phasen Pipeline:

  1. SFT – Das Aufgabenschema wird erlernt.
  2. Belohnung Model – Der Trainingsschritt basiert auf menschlichen Präferenzen (ausgewählt vs. abgelehnt).
  3. PPO (Proximal Policy Optimization) – Ein Verstärkungslernalgorithmus zur Optimierung der Strategie.

Die Betriebskosten entstehen durch die beweglichen Komponenten:

DPO

DPO (Direkte Präferenzoptimierung) verzichtet auf die explizite Model sowie auf den RL-Zyklus. Sie optimiert weiterhin das RLHF-Ziel (Maximierung der Belohnung unter Berücksichtigung einer KL-Divergenz-Beschränkung), doch dies geschieht als umparameterisiertes überwachtes Lernalgorithmus-Problem anstelle mittels Verstärkungslernung:

{
    "prompt": "Explain quantum computing",
    "chosen": "Quantum computing uses qubits...",   # Preferred response
    "rejected": "Well, it's complicated..."        # Non-preferred response
}

Was sich in der Betriebspraxis ändert:

DPO lässt sich leichter prototypisieren als ein vollständiger PPO Pipeline, stellt jedoch keine automatische Verbesserung der Qualität dar. Die Ergebnisse hängen von der Ausgangspolicy, der Qualität des Paars, den Verlusteinstellungen, den Längeneffekten sowie dem Bewertungsprotokoll ab. Vergleichen Sie es mit einem SFT Checkpoint unter Verwendung derselben ausgeschlossenen Präferenz- und Aufgabensätze.

ORPO

ORPO (Odds-Ratio Preference Optimization) kombiniert den Verlust aus der negativen Log-Likelihood-Funktion von SFT mit einer Strafe aufgrund des Odds-Ratios für abgelehnte Antworten. Dadurch entfällt die notwendige separate Referenz Model, und es ist möglich, Task-Lernen sowie Präferenzoptimierung in einem einzigen Durchlauf miteinander zu verknüpfen.

Wie es funktioniert: ORPO verwendet einen kombinierten Verlustfunktion, der gleichzeitig zwei Aufgaben erledigt:

  1. Maximiert die Wahrscheinlichkeit der gewählten Antwort (Lernen der Aufgabe).
  2. Straft die abgelehnte Antwort mit einem Odds-Ratio-Faktor (Lernen von Präferenzen).

Wichtige Hyperparameter, die man kennen sollte:

from trl import ORPOConfig

config = ORPOConfig(
    learning_rate=8e-6,  # Very low, as recommended by the ORPO paper
    beta=0.1,            # Controls strength of preference penalty
    # ... other params
)

Der Kompromiss:

Wählen Sie aus den Daten sowie dem Evaluationsdesign aus:

Im Standardfall gilt für alle Aufgaben „Keines“. Es sollte eine Baseline ausschließlich für SFT aufrechterhalten werden, wobei sowohl Metriken zu den Aufgabenergebnissen als auch zu den Nutzerpräferenzen berichtet werden müssen.


Fine-Tuning Frameworks

Frameworks überschneiden sich und ändern sich schnell. Wählen Sie entsprechend dem Ausführungspfad, den Sie unterstützen müssen, feste Versionen festlegen und stellen Sie sicher, dass die Trainingskonfiguration ausreichend portabel ist, um sie außerhalb eines Notebooks nachzubilden.

Unsloth – Geschwindigkeit und Speichereffizienz

Unsloth integriert sich mit Hugging Face. trl und transformers und stellt optimierte Kernels-, Checkpointing- sowie quantisierte Fine-Tuning-Pfade für unterstützte Models bereit.

[!WICHTIG] Die Importreihenfolge ist entscheidend Befolgen Sie die im Unsloth-Beispiel für die von Ihnen festgelegte Version angegebene Importreihenfolge. Unsloth wendet während des Imports Patches an, weshalb es zuerst importiert werden muss. trl und transformers vermeidet fehlende Optimierungen oder auf bestimmte Versionen bezogene Fehler.

# ✅ Correct order
from unsloth import FastLanguageModel  # Must be first!
from trl import SFTTrainer
from transformers import TrainingArguments

# Avoid this order with Unsloth's patched path
from trl import SFTTrainer
from unsloth import FastLanguageModel

Am besten geeignet für: Einzel-GPU-Training, Prototypenentwicklung, Colab-Notebooks – sowie für alle, die die Kosten von GPU im Auge behalten müssen.

Die angegebenen Werte für Geschwindigkeit und Speicherverbrauch unterscheiden sich je nach Model, Länge der Sequenz, Batch-Größe, Genauigkeitsstufe sowie verwendeter Hardware. Messen Sie daher den Durchsatz in Benchmark Tokens pro Sekunde sowie den maximalen Speicherverbrauch bei Ihrem eigenen Testlauf, anstatt einen in Schlagzeilen genannten Quotienten als feststehende Framework Eigenschaft zu betrachten.

Axolotl – konfigurationsgesteuertes Training

# config.yaml - no code required
base_model: meta-llama/Meta-Llama-3-8B
adapter: qlora
lora_r: 32
lora_alpha: 16
datasets:
    - path: data/my_data.jsonl
      type: alpaca
sample_packing: true

Ausführen mit: accelerate launch -m axolotl.cli.train config.yaml

Am besten geeignet für: deklarative, reproduzierbare Ausführungen sowie integrierte Startoptionen für verteiltes Training.

Der wesentliche Vorteil besteht in der deklarativen Konfiguration, die überprüft, versioniert und bei lokalen sowie verteilten Ausführungen wiederverwendet werden kann.

Framework-Vergleich

WerkzeugNützlich, wennÜberprüfen, bevor man den Commit vornimmt.
UnslothSie wünschen einen optimierten, unterstützten Pfad für Model zusammen mit prägnanten Beispielen.Model, GPU, Quantization sowie Matrix zur verteilten Unterstützung
AxolotlSie wünschen deklarative Konfigurationen sowie integrierte, verteilte Vorgehensmodelle.Genaues Konfigurationsschema sowie Launcher für die festgepinnte Version
TRLSie möchten direkten Zugriff auf Hugging Face SFT sowie auf Trainer für Präferenzmodellierung.Dataset-Format, Chat-Vorlage, Verlustmaskierung sowie Integration mit PEFT
TorchtuneSie wünschen Rezepte und Komponenten, die speziell für PyTorch entwickelt wurden.Model Rezeptabdeckung sowie Kompatibilität bei der Exportierung

Praktische Demonstration: Fine-Tuning mit Unsloth

Hier ist ein vollständiges Beispiel aus meinem unsloth-Finetuning-Demo Repository. Die Demo führt eine Feinabstimmung von Nemotron-Nano für Function Calling durch.

Training von Pipeline

Schneller Einstieg

# Clone and setup
git clone https://github.com/slavadubrov/unsloth-finetune-demo.git
cd unsloth-finetune-demo

# Install with uv (recommended)
uv sync

# Run fine-tuning (quick test)
uv run finetune --max-samples 1000

Konfiguration

Der interessante Teil befindet sich in config.py:

# Model & Dataset
MODEL_NAME = "nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1"  # 4B params, 128K context
DATASET_NAME = "glaiveai/glaive-function-calling-v2"   # 113K examples

# LoRA Configuration
LORA_R = 16        # Adapter capacity; tune against held-out results
LORA_ALPHA = 32    # Update scaling; alpha/r is the classic LoRA scale
MAX_SEQ_LENGTH = 4096

# Candidate modules for this Llama-family model
LORA_TARGET_MODULES = [
    "q_proj", "k_proj", "v_proj", "o_proj",
    "gate_proj", "up_proj", "down_proj",
]

[!NOTE] Das Alpha-zu-Rank-Verhältnis alpha/r skaliert den klassischen LoRA-Update-Prozess. alpha = 2r Es handelt sich dabei um eine gängige Einstiegshilfe in der Dokumentation einiger Tools – sie stellt jedoch keine Garantie für Stabilität dar. Ordnen Sie die Anpassung von Rang, Alpha-Wert, Lernrate sowie Zielmodulen erst dann an, nachdem Daten und Baseline festgelegt wurden.

Kern-Trainingscode

from unsloth import FastLanguageModel
from trl import SFTConfig, SFTTrainer

# Load model with 4-bit quantization
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1",
    max_seq_length=4096,
    load_in_4bit=True,
)

# Add LoRA adapters
model = FastLanguageModel.get_peft_model(
    model,
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                    "gate_proj", "up_proj", "down_proj"],
    use_gradient_checkpointing="unsloth",  # Lower activation memory; extra compute
)

# The data step creates versioned train_dataset and eval_dataset objects.
# Each row has the chat messages and tool schemas expected by current TRL.

# Train with the current TRL configuration surface.
trainer = SFTTrainer(
    model=model,
    processing_class=tokenizer,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    args=SFTConfig(
        output_dir="outputs/nemotron-function-calling",
        max_length=4096,
        packing=True,
        per_device_train_batch_size=2,
        gradient_accumulation_steps=4,
        learning_rate=2e-4,
        num_train_epochs=3,
        bf16=True,
    ),
)
trainer.train()

Fine-Tuning mit Axolotl

[!NOTE] Demo in Vorbereitung Ich arbeite an einer praktischen Demo zu Axolotl. Bis dahin, die Leitfaden zur Beschleunigung von n-D-Parallelität Die Quelle Hugging Face stellt eine gute Referenz für mehrere Strategien des GPU-Trainings dar.

In Konfigurations-geführten sowie verteilten Architekturen sorgt Axolotl dafür, dass die Workflow reproduzierbar bleibt:

# axolotl_config.yaml
base_model: meta-llama/Meta-Llama-3-8B
model_type: LlamaForCausalLM

# QLoRA configuration
load_in_4bit: true
adapter: qlora
lora_r: 32
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
    - q_proj
    - k_proj
    - v_proj
    - o_proj
    - gate_proj
    - up_proj
    - down_proj

# Dataset
datasets:
    - path: data/training_data.jsonl
      type: alpaca

# Training settings
sequence_len: 4096
sample_packing: true # Benchmark with your length distribution
micro_batch_size: 2
gradient_accumulation_steps: 4
learning_rate: 0.0002
num_epochs: 3

# Precision and attention path; verify support on the pinned stack
bf16: true
flash_attention: true

Training ausführen:

axolotl train axolotl_config.yaml

Phase 5: Bewertung

Einfrieren Sie den Evaluationsvertrag vor dem ersten Ausführungsvorgang. Vergleichen Sie zumindest den optimierten Checkpoint mit der exakt unoptimierten Basiskonfiguration unter denselben Prompt-, Dekodierungs-Einstellungen sowie Tool-Umgebung. Berichten Sie erst über die Gesamtbewertung, nachdem Sie die Fehlerfälle überprüft haben, die eigentlich verbessert werden sollten.

Verfolgen Sie vier Gruppen:

  1. Zielaufgabe: exakte Übereinstimmung, erfolgreiche Ausführung, menschliche Bewertungskriterien oder ein anderes Ergebnis, das mit dem jeweiligen Anwendungsfall verbunden ist.
  2. Regression: allgemeine Fähigkeiten sowie zuvor unterstützte Aufgabenteile, die durch Anpassungen beeinträchtigt werden könnten.
  3. Sicherheit und Richtlinien: Ablehnungen, Datenlecks, Prompt Injection oder domänenspezifische Einschränkungen.
  4. Betrieb: Latency, Throughput, Speicherverbrauch, Größe der Erzeugnisse sowie Kosten bei der vorgesehenen Serving Konfiguration.

Automatisierte Benchmarks

Verwenden lm-evaluation-harness für relevante standardisierte Aufgaben – und nicht als Ersatz für die Produktbewertung:

lm_eval --model hf \
    --model_args pretrained=./outputs/merged-model \
    --tasks hellaswag,arc_easy,mmlu \
    --batch_size 8

LLM als Judge

Bei der Bewertung der subjektiven Qualität kann ein größeres Model bei der Erstellung von Scores helfen, wobei es jedoch anhand von von Menschen überprüften Beispielen kalibriert werden muss und die Identität des Kandidaten dabei geheim gehalten werden sollte:

judge_prompt = """
Rate this response from 1-5 on:
- Relevance
- Accuracy
- Formatting

Response: {model_output}
Expected: {ground_truth}
"""

Domänenbezogene Bewertung

Stellen Sie echte Beispiele nach Quelle, Benutzer, Dokument oder Zeitpunkt bereit, damit nahezu identische Fälle nicht über die Aufteilung hinweg durchsickern. Für Function Calling müssen Sie den gesamten Ablauf überprüfen: Auswahl der Werkzeuge, übergebene Argumente, Ausführungsergebnis, Wiederherstellungsmaßnahmen sowie die endgültige Antwort. Bei kleinen Stichproben sollten Sie Konfidenzintervalle oder Paarzahlen aus Siegen und Niederlagen angeben, und in kritischen Bereichen müssen alle Abweichungen genauestens untersucht werden.


Phase 6: Deployment sowie Ausgabeformate

Wählen Sie das Artefakt anhand des Serving-Engines sowie des Rollback-Plans aus – und nicht ausschließlich aufgrund der Dateigröße:

Ausgabeformate

1. LoRA-Adapter

uv run finetune  # Saves ~100-500MB adapter

2. Verschmolzene Model

uv run finetune --merge  # Creates a standalone full model

3. Format von GGUF

uv run finetune --gguf q4_k_m  # Creates ~2-4GB quantized model

Phase 7: Serving sowie Überwachung

Mit vLLM

# Serve the base and expose a PEFT adapter as a model name.
vllm serve nvidia/Llama-3.1-Nemotron-Nano-4B-v1.1 \
    --enable-lora \
    --lora-modules function-calling=./outputs/adapter \
    --host 0.0.0.0 \
    --port 8000 \
    --max-model-len 4096

Abfrage über den mit OpenAI kompatiblen API:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.chat.completions.create(
    model="function-calling",
    messages=[{"role": "user", "content": "Book a flight to Tokyo"}]
)

Mit Ollama (lokal)

# Create Modelfile
echo 'FROM ./outputs/unsloth-nemotron-function-calling-gguf/model-q4_k_m.gguf' > Modelfile

# Import to Ollama
ollama create my-function-model -f Modelfile

# Run
ollama run my-function-model

Mit llama.cpp (CPU)

./llama-cli -m ./outputs/model-q4_k_m.gguf \
    -p "What's the weather in Tokyo?" \
    --ctx-size 4096

Überwachen des veröffentlichten Model

Der Lebenszyklus endet nicht bereits bei einem akzeptablen Trainingsverlust. Die Basis-Model-Revision, der Tokenizer sowie das Chat-Template, der Adapter-Hash, die Dataset-Version, die Trainingskonfiguration und der Bewertungsbericht werden als eine einzige Release-Einheit aufgezeichnet. In der Produktion werden mithilfe derselben Datenschnitte, die auch im Offline-Betrieb verwendet werden, der Erfolg der Aufgaben, ungültige Ausgaben, Policy-Fehler, Latency sowie Input-Drift überwacht. Stellen Sie sicher, dass die vorherigen Artefakte weiterhin ladbar sind, und definieren Sie vor dem Start einen Rollback-Threshold.


Wichtige Erkenntnisse

  1. Führen Sie die Feinabstimmung erst durch, nachdem eine unangepasste Baseline sowie eine Taxonomie von Fehlern gezeigt haben, dass die Anpassung mittels Weight das Problem löst.
  2. Retrieval kümmert sich um sich ändernde Belege, während Constrained Decoding für die Syntax zuständig ist; keines dieser Konzepte wird durch SFT ersetzt.
  3. LoRA verringert die Anzahl der trainierbaren Zustände. Zusätzlich komprimiert QLoRA die festgefrorene Basis Weights. Weisen Sie den Speicherverbrauch von QLoRA nicht LoRA zu.
  4. Datenumfassung, Integrität der Aufteilung, Herkunft der Daten sowie das Maskieren von Verlusten sind wichtiger als das Kopieren einer modischen Optimiererkonfiguration.
  5. DPO, ORPO sowie auf PPO basierende RLHF stellen unterschiedliche experimentelle Ansätze dar und bilden keine Hierarchie mit einem universellen Standard.
  6. Bewerten Sie das Zielverhalten, Regressionen, Sicherheit sowie die Betriebsfähigkeit anhand derselben Basis Model.
  7. Wählen Sie vor dem Training entweder einen Adapter, ein zusammengeführtes Ergebnis oder ein GGUF-Ergebnis gemäß den Anforderungen an Serving und Rollbacks aus.

Referenzen

Arbeiten und Forschung

Datenverarbeitungstools

Constrained Decoding

Schulung Frameworks

Inference und Deployment

Bewertung

Leitfäden und Ressourcen