LLM Fine-Tuning bedeutet, ein bereits vor­trai­nier­tes Sprach­mo­dell gezielt mit eigenen Bei­spiel­da­ten wei­ter­zu­trai­nie­ren. Im Un­ter­schied zum Pre-Training lernt das Modell dabei nicht Sprache von Grund auf, sondern passt vor­han­de­nes Wissen, Ant­wort­stil und Auf­ga­ben­ver­hal­ten an einen konkreten An­wen­dungs­fall an.

Was ist Fine-Tuning?

Beim Pre-Training wird ein großes Sprach­mo­dell mit sehr um­fang­rei­chen Text­men­gen trainiert, damit es Sprache, Fak­ten­mus­ter, Grammatik und sta­tis­ti­sche Zu­sam­men­hän­ge lernt. Dieses Training ist sehr re­chen­in­ten­siv und wird daher in der Regel nur von großen For­schungs­la­bo­ren oder Un­ter­neh­men durch­ge­führt.

Beim Fine-Tuning verwenden Sie dagegen ein be­stehen­des vor­trai­nier­tes Modell mit ver­füg­ba­ren Mo­dell­ge­wich­ten wie Llama, Mistral oder Qwen und trai­nie­ren es mit einem kleineren, eigenen Datensatz weiter. Ziel ist nicht, dem Modell komplett neues Welt­wis­sen bei­zu­brin­gen, sondern es auf bestimmte Aufgaben, Formate oder Ant­wort­sti­le ein­zu­stel­len. Typische Beispiele für das LLM-Fine-Tuning sind Support-Antworten, struk­tu­rier­te Ex­trak­ti­on, interne Klas­si­fi­ka­ti­on oder do­mä­nen­spe­zi­fi­sche As­sis­ten­ten. In der Praxis wird dafür häufig SFT, also so­ge­nann­tes Su­per­vi­sed Fine-Tuning, genutzt: Das Modell bekommt Eingaben und ge­wünsch­te Ziel­ant­wor­ten als Trai­nings­bei­spie­le.

IONOS CLOUD GPU VM
Maximale KI-Per­for­mance mit Ihrer Cloud GPU VM
  • Exklusive NVIDIA H200 GPUs für höchste Re­chen­leis­tung
  • Ga­ran­tier­te Per­for­mance durch voll­stän­dig de­di­zier­te CPU-Kerne
  • 100 % Hosting in Deutsch­land für maximale Da­ten­si­cher­heit und DSGVO-Kon­for­mi­tät
  • Einfaches, kal­ku­lier­ba­res Preis­mo­dell mit festem Preis pro Stunde

Fine-Tuning vs. RAG: Wann nutzt man was?

Fine-Tuning und Retrieval-Augmented Ge­ne­ra­ti­on (RAG) verfolgen un­ter­schied­li­che Ziele. Beim Fine-Tuning wird ein Sprach­mo­dell mit eigenen Bei­spiel­da­ten wei­ter­trai­niert, damit es ein be­stimm­tes Verhalten, einen ge­wünsch­ten Ant­wort­stil oder eine konkrete Aufgabe besser be­herrscht. Das ge­wünsch­te Mo­dell­ver­hal­ten wird dauerhaft in den Mo­dell­pa­ra­me­tern angepasst.

RAG dagegen verändert das Modell selbst nicht. Statt­des­sen werden während der Anfrage relevante In­for­ma­tio­nen aus externen Do­ku­men­ten, Da­ten­ban­ken oder Wis­sens­quel­len abgerufen und dem Modell als zu­sätz­li­cher Kontext be­reit­ge­stellt. Dadurch kann das System auch auf aktuelle In­for­ma­tio­nen zugreifen, ohne dass ein erneutes Training er­for­der­lich ist.

Fine-Tuning eignet sich besonders dann, wenn ein Modell wie­der­keh­ren­de Aufgaben zu­ver­läs­sig in einem be­stimm­ten Format lösen soll. Beispiele sind Support-Antworten, Klas­si­fi­ka­tio­nen, struk­tu­rier­te Da­ten­aus­ga­ben oder die Anpassung an un­ter­neh­mens­spe­zi­fi­sche Sprache und Fach­be­grif­fe. Vor­aus­set­zung sind aus­rei­chend hoch­wer­ti­ge Trai­nings­da­ten.

RAG ist die bessere Wahl, wenn sich In­for­ma­tio­nen re­gel­mä­ßig ändern oder große Do­ku­men­ten­men­gen genutzt werden sollen. Typische An­wen­dungs­fäl­le sind interne Wis­sens­da­ten­ban­ken, Pro­dukt­do­ku­men­ta­tio­nen, tech­ni­sche Hand­bü­cher, Preis­lis­ten oder Com­pli­ance-Richt­li­ni­en. Neue Inhalte können dabei sofort verwendet werden, ohne das Modell erneut trai­nie­ren zu müssen.

Kurz­ver­gleich

Fine-Tuning

  • Ant­wort­ver­hal­ten und Stil anpassen
  • Neue Aufgaben trai­nie­ren
  • Benötigt Trai­nings­da­ten
  • Erfordert zu­sätz­li­chen Re­chen­auf­wand
  • Ideal für stabile, wie­der­keh­ren­de An­wen­dungs­fäl­le

RAG

  • Aktuelle Dokumente und Wissen nutzen
  • Keine Mo­dell­an­pas­sung er­for­der­lich
  • Benötigt Do­ku­men­ten­spei­cher und Retrieval-System
  • Wissen lässt sich jederzeit ak­tua­li­sie­ren
  • Ideal für Wis­sens­da­ten­ban­ken und dy­na­mi­sche Inhalte

Vor­aus­set­zun­gen: Hardware und Python-Libraries

Bevor Sie mit dem Fine-Tuning von LLMs beginnen, sollten Sie die benötigte Hardware und die wich­tigs­ten Software-Kom­po­nen­ten kennen. Im Gegensatz zur normalen KI-Inferenz, bei der ein Modell lediglich Antworten generiert, müssen beim Training zu­sätz­li­che In­for­ma­tio­nen im Speicher gehalten werden. Dazu gehören neben den Mo­dell­ge­wich­ten auch Gra­di­en­ten, Optimizer-Zustände und Zwi­schen­er­geb­nis­se aus den einzelnen Be­rech­nungs­schrit­ten. Dadurch steigt der Spei­cher­be­darf deutlich an.

Aus diesem Grund ist Full Fine-Tuning großer Sprach­mo­del­le in aller Regel nur auf leis­tungs­star­ken Re­chen­zen­trums-GPUs wie bei­spiels­wei­se der NVIDIA H100 möglich. Bei dieser Methode werden sämtliche Mo­dell­pa­ra­me­ter ak­tua­li­siert, was viel VRAM und Re­chen­leis­tung erfordert.

In der Praxis kommen deshalb häufig so­ge­nann­te Parameter-Efficient Fine-Tuning (PEFT)-Methoden zum Einsatz. Statt das gesamte Modell neu zu trai­nie­ren, werden dabei nur kleine zu­sätz­li­che Parameter angepasst. Die be­kann­tes­te Methode ist LoRA (Low-Rank Ad­apt­a­ti­on). QLoRA erweitert diesen Ansatz um eine 4-Bit-Quan­ti­sie­rung des Ba­sis­mo­dells. Dadurch sinkt der Spei­cher­be­darf erheblich, sodass sich viele 7B- oder 8B-Modelle bereits auf leis­tungs­star­ken Consumer-GPUs wie einer RTX 4090 trai­nie­ren lassen.

Die folgende Tabelle zeigt typische Grö­ßen­ord­nun­gen für den VRAM-Bedarf ver­schie­de­ner Mo­dell­klas­sen. Die Werte dienen als Ori­en­tie­rung und können je nach Batch-Größe, Kon­text­län­ge, Precision (FP16 oder BF16), Optimizer und weiteren Trai­nings­ein­stel­lun­gen abweichen.

Mo­dell­grö­ße Full Fine-Tuning, grober VRAM-Bedarf LoRA, grober VRAM-Bedarf QLoRA, grober VRAM-Bedarf Typische Hardware
3B ca. 16 bis 28 GB ca. 12 bis 24 GB ca. 8 bis 16 GB RTX 4060 Ti 16 GB, RTX 4090, L4
7B/8B ca. 60 bis 80 GB ca. 24 bis 48 GB ca. 16 bis 24 GB RTX 4090, L40S, A100
13B/14B ca. 160 bis 320 GB ca. 48 bis 80 GB ca. 24 bis 48 GB L40S, A100 80 GB
30B/34B mehrere A100/H100 ca. 80 bis 160 GB ca. 48 bis 80 GB A100 80 GB, H100
70B Multi-GPU-Setup ca. 160 GB+ stark optimiert ab 48 GB, rea­lis­tisch eher 80 bis 160 GB mehrere A100/H100

Für die Umsetzung vom LLM-Fine-Tuning werden außerdem mehrere Open-Source-Bi­blio­the­ken benötigt, die un­ter­schied­li­che Aufgaben über­neh­men:

  • PyTorch: Bildet die Grundlage für das Training neu­ro­na­ler Netze
  • Trans­for­mers von Hugging Face: Stellt vor­trai­nier­te Modelle, Tokenizer und Trai­nings­schnitt­stel­len bereit
  • Datasets: Er­leich­tert das Laden und Ver­ar­bei­ten von Trai­nings­da­ten
  • PEFT: Im­ple­men­tiert LoRA, QLoRA und weitere parameter-ef­fi­zi­en­te Fine-Tuning-Methoden
  • TRL (Trans­for­mers Rein­force­ment Learning): Enthält mit dem SFT­Trai­ner eine einfache Trai­nings­ober­flä­che für Su­per­vi­sed Fine-Tuning
  • bit­s­and­bytes: Er­mög­licht 4-Bit- und 8-Bit-Quan­ti­sie­rung und ist die Grundlage für QLoRA
  • Ac­ce­le­ra­te: Ver­ein­facht die Nutzung von GPUs und ver­teil­tem Training

Für die meisten LoRA- und QLoRA-Projekte genügt die In­stal­la­ti­on der folgenden Pakete in Python:

pip install torch transformers datasets peft trl accelerate bitsandbytes
bash

Bei größeren Modellen oder Multi-GPU-Setups kann zu­sätz­lich DeepSpeed ein­ge­setzt werden:

pip install deepspeed
bash

DeepSpeed erweitert PyTorch um Op­ti­mie­run­gen für große Trai­nings­läu­fe. Dazu gehören unter anderem Spei­cher­op­ti­mie­run­gen durch ZeRO (Zero Red­un­dan­cy Optimizer), Gradient Off­loa­ding und ver­teil­tes Training über mehrere GPUs. Für ein erstes Fine-Tuning-Projekt ist DeepSpeed jedoch nicht zwingend er­for­der­lich. An­fän­ge­rin­nen und Anfänger erzielen die besten Er­geb­nis­se, wenn sie zunächst mit einem kleineren Modell, einem über­schau­ba­ren Datensatz und einer einzelnen GPU arbeiten.

Wenn Sie auf Consumer-Hardware trai­nie­ren wollen und dabei VRAM und Trai­nings­zeit sparen möchten, sollten Sie außerdem einen Blick auf Unsloth werfen. Die Bi­blio­thek ist voll­stän­dig kom­pa­ti­bel mit dem Hugging-Face-Ökosystem (TRL, PEFT, Trans­for­mers) und ersetzt dort lediglich den Modell-La­de­auf­ruf, der Rest des Trainings-Codes bleibt identisch. Das Training mit Unsloth ist etwa 2-mal schneller und ver­braucht rund 70 Prozent (je nach Modell bis zu 80–90 Prozent) weniger VRAM, ohne Ge­nau­ig­keits­ver­lus­te gegenüber Standard-QLoRA. Für fort­ge­schrit­te­ne Kon­fi­gu­ra­tio­nen ist zu­sätz­lich Axolotl ver­brei­tet, das ebenfalls auf dem HF-Stack aufbaut und eine YAML-basierte Kon­fi­gu­ra­ti­on anbietet.

Da­ten­vor­be­rei­tung: JSONL-For­ma­tie­rung und To­ke­niza­ti­on

Für Su­per­vi­sed Fine-Tuning benötigen Sie Beispiele aus Eingabe und ge­wünsch­ter Antwort. Häufig wird dafür JSONL verwendet, also eine Datei, bei der jede Zeile ein eigenes JSON-Objekt enthält. Dieses Format ist praktisch, weil große Da­ten­sät­ze zei­len­wei­se ver­ar­bei­tet werden können. Für Chat-Modelle sollten die Trai­nings­da­ten möglichst dem späteren Dia­log­for­mat ähneln. Ein Beispiel enthält daher oft eine Sys­tem­an­wei­sung, eine Nut­zer­ein­ga­be und eine ideale As­sis­ten­ten­ant­wort. Wichtig ist, dass die Ziel­ant­wor­ten sauber, kon­sis­tent und fachlich korrekt sind. Schlechte Trai­nings­da­ten führen fast immer zu schlech­te­ren Modellen, auch wenn die tech­ni­sche Kon­fi­gu­ra­ti­on korrekt ist.

Ein Beispiel für eine JSONL-Datei für einen Support-As­sis­ten­ten könnte wie folgt aussehen:

{"messages":[{"role":"system","content":"Sie sind ein technischer Support-Assistent."},{"role":"user","content":"Wie setze ich mein Passwort zurück?"},{"role":"assistant","content":"Öffnen Sie die Kontoeinstellungen, wählen Sie 'Passwort ändern' und folgen Sie den Anweisungen. Verwenden Sie anschließend ein starkes, neues Passwort."}]}
{"messages":[{"role":"system","content":"Sie sind ein technischer Support-Assistent."},{"role":"user","content":"Was bedeutet 4-Bit Quantisierung?"},{"role":"assistant","content":"4-Bit Quantisierung reduziert die Speichergröße eines Modells, indem Gewichte mit geringerer numerischer Präzision gespeichert werden. Dadurch sinkt der VRAM-Bedarf, allerdings kann die Genauigkeit leicht beeinflusst werden."}]}
json

Beim Laden der Daten wird der Text an­schlie­ßend to­ke­ni­siert. To­ke­niza­ti­on bedeutet, dass Text in nu­me­ri­sche Einheiten, so­ge­nann­te KI-Tokens, zerlegt wird, die das Modell ver­ar­bei­ten kann. Hugging Face Trans­for­mers stellt dafür passende Tokenizer bereit. Für Chat-Modelle ist wichtig, das Chat-Template des je­wei­li­gen Modells zu verwenden, damit Rollen wie system, user und assistant korrekt for­ma­tiert werden. Wenn das Format nicht zum Modell passt, lernt das Modell oft schlech­ter oder erzeugt un­pas­sen­de Ausgaben. Für den Anfang sollten Sie mit wenigen hundert bis wenigen tausend hoch­wer­ti­gen Bei­spie­len starten.

Ein einfaches La­de­bei­spiel sieht so aus:

from datasets import load_dataset
dataset = load_dataset("json", data_files={
    "train": "train.jsonl",
    "validation": "valid.jsonl"
})
print(dataset["train"][0])
python

Schritt-für-Schritt-Anleitung: Von Data Prep bis Eva­lua­ti­on

Ein Fine-Tuning-Projekt besteht nicht nur aus dem ei­gent­li­chen Training. Bevor das Modell lernen kann, müssen die Trai­nings­da­ten vor­be­rei­tet, das Ba­sis­mo­dell aus­ge­wählt und die Trai­nings­kon­fi­gu­ra­ti­on fest­ge­legt werden. Die folgende Schritt-für-Schritt-Anleitung führt Sie durch den gesamten Prozess.

Schritt 1: Daten vor­be­rei­ten

Zuerst de­fi­nie­ren Sie, welche Aufgabe das Modell lernen soll. Für An­fän­ge­rin­nen und Anfänger ist eine klar begrenzte Aufgabe besser als ein sehr breiter Assistent. Geeignet sind zum Beispiel Support-Antworten, Pro­dukt­klas­si­fi­ka­ti­on oder struk­tu­rier­te Antworten in einem festen JSON-Format. Danach sammeln Sie Beispiele aus Eingabe und ge­wünsch­ter Ausgabe. Jede Antwort sollte so for­mu­liert sein, wie Sie sie später vom Modell erwarten. Entfernen Sie Dubletten, wi­der­sprüch­li­che Beispiele und private Daten. Teilen Sie den Datensatz an­schlie­ßend in Training und Va­li­da­ti­on auf, zum Beispiel 90 Prozent Training und 10 Prozent Va­li­da­ti­on.

Schritt 2: Ba­sis­mo­dell auswählen

Wählen Sie ein Modell, das zu Ihrer Hardware und Ihrem Er­fah­rungs­stand passt. Für dieses Tutorial verwenden wir Llama 3.1 8B Instruct, da das Modell weit ver­brei­tet ist, von den wich­tigs­ten Open-Source-Tools un­ter­stützt wird und sich bereits auf leis­tungs­star­ken Consumer-GPUs mit LoRA oder QLoRA fine-tunen lässt. Dadurch können die gezeigten Schritte auch ohne Re­chen­zen­trums-Hardware nach­voll­zo­gen werden.

Hinweis

Llama 4 ist zwar der aktuelle Nach­fol­ger von Llama 3, nutzt jedoch eine kom­ple­xe­re Mixture-of-Experts-Ar­chi­tek­tur (MoE) und bietet zu­sätz­lich mul­ti­mo­da­le Fä­hig­kei­ten. Für ein erstes Fine-Tuning-Projekt würde dies unnötige zu­sätz­li­che Kom­ple­xi­tät einführen, weshalb sich ein breit un­ter­stütz­tes Modell wie Llama 3.x für dieses Tutorial anbietet. Die grund­le­gen­den Konzepte wie Su­per­vi­sed Fine-Tuning (SFT), PEFT, LoRA und QLoRA funk­tio­nie­ren bei beiden Mo­dell­ge­ne­ra­tio­nen nach denselben Prin­zi­pi­en. Ein Wechsel auf Llama 4 ist daher prin­zi­pi­ell möglich, setzt aber voraus, dass die ver­wen­de­te Trai­nings­um­ge­bung, Bi­blio­the­ken und Hardware die jeweilige Mo­dell­va­ri­an­te un­ter­stüt­zen. In vielen Fällen müssen dafür Modell-ID, Tokenizer, Prompt-Format, Spei­cher­be­darf und Fine-Tuning-Kon­fi­gu­ra­ti­on angepasst und erneut getestet werden.

Wenn Ihnen nur 16 bis 24 GB VRAM zur Verfügung stehen, empfiehlt sich die Nutzung von QLoRA mit 4-Bit-Quan­ti­sie­rung. Verfügen Sie dagegen über eine A100-, H100-, H200-, B200- oder ver­gleich­ba­re GPU, können Sie größere Batch-Größen, längere Kon­text­fens­ter oder größere Modelle aus­pro­bie­ren. Für re­pro­du­zier­ba­re Er­geb­nis­se sollten Sie Mo­dell­na­me, Da­ten­satz­ver­si­on und Trai­nings­pa­ra­me­ter stets do­ku­men­tie­ren.

Für den Zugriff auf Llama 3.1 über Hugging Face müssen Sie die Li­zenz­be­din­gun­gen von Meta ak­zep­tie­ren, Zugriff auf das Modell erhalten und sich bei Hugging Face au­then­ti­fi­zie­ren.

Schritt 3: Modell quan­ti­siert laden

Bei QLoRA wird das Ba­sis­mo­dell in 4-Bit geladen. Dadurch sinkt der VRAM-Bedarf deutlich. Die ei­gent­li­chen Mo­dell­ge­wich­te bleiben ein­ge­fro­ren. Trainiert werden nur kleine LoRA-Adapter, die in bestimmte Pro­jek­ti­ons­schich­ten des Trans­for­mers eingefügt werden. Diese Adapter speichern später die Anpassung an Ihre Aufgabe. Das ist ef­fi­zi­en­ter als Full Fine-Tuning von LLMs, weil deutlich weniger Parameter trainiert werden. Für viele Pra­xis­fäl­le reicht diese Methode aus.

Das folgende Code­bei­spiel lädt das vor­trai­nier­te Llama-3.1-Modell mithilfe von Hugging Face Trans­for­mers in einer 4-Bit-quan­ti­sier­ten Variante:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
model_name = "meta-llama/Llama-3.1-8B-Instruct"
quant_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=quant_config,
    device_map="auto"
)
python

Schritt 4: LoRA-Kon­fi­gu­ra­ti­on erstellen

LoRA fügt kleine trai­nier­ba­re Matrizen in bestimmte Schichten des Modells ein. Der Parameter r wird auch Rank genannt. Er bestimmt, wie groß diese zu­sätz­li­chen Matrizen sind. Ein typischer Startwert ist r=8 oder r=16. Der Parameter lora_alpha skaliert den Einfluss der LoRA-Gewichte. Mit lora_dropout=0.05 kann man leicht gegen Over­fit­ting sta­bi­li­sie­ren. Für viele Llama-ähnliche Modelle werden Ziel­mo­du­le wie q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj verwendet. Ziel­mo­du­le sind die Schichten des Sprach­mo­dells, in die LoRA zu­sätz­li­che trai­nier­ba­re Parameter einfügt. Statt alle Mil­li­ar­den Mo­dell­pa­ra­me­ter zu ak­tua­li­sie­ren, werden nur diese aus­ge­wähl­ten Module angepasst, wodurch das Fine-Tuning deutlich weniger Speicher und Re­chen­leis­tung benötigt.

Hinweis

Die Wahl von lora_alpha be­ein­flusst die Ska­lie­rung der LoRA-Adapter. Ein häufig ver­wen­de­ter Startwert ist lora_alpha = 2×r, bei­spiels­wei­se lora_alpha=16 bei r=8. Dabei handelt es sich jedoch um eine prak­ti­sche Heuristik und keine feste Emp­feh­lung. Wenn Sie Rank-Sta­bi­li­zed LoRA (rsLoRA) mit use_rslora=True ak­ti­vie­ren, verwendet PEFT eine an­ge­pass­te Ska­lie­rung von alpha/√r statt alpha/r. Dadurch kann rsLoRA ins­be­son­de­re bei höheren Ranks stabiler trai­nie­ren. Die optimale Kom­bi­na­ti­on aus Rank und lora_alpha sollte weiterhin anhand von Eva­lua­ti­ons­er­geb­nis­sen getestet werden.

Der folgende Code definiert die LoRA-Kon­fi­gu­ra­ti­on, die während des Fine-Tunings verwendet wird:

from peft import LoraConfig
lora_config = LoraConfig(
    r=8,
    lora_alpha=16,
    lora_dropout=0.05,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    task_type="CAUSAL_LM"
)
python

Schritt 5: SFT­Trai­ner kon­fi­gu­rie­ren

Für das ei­gent­li­che Training verwenden wir den SFTTrainer aus der Hugging-Face-Bi­blio­thek TRL. SFT steht hier für Su­per­vi­sed Fine-Tuning. Der Trainer verbindet dabei das geladene Ba­sis­mo­dell, die Trai­nings­da­ten, die Va­li­die­rungs­da­ten und die zuvor de­fi­nier­te LoRA-Kon­fi­gu­ra­ti­on.

Zu­sätz­lich werden zentrale Trai­nings­pa­ra­me­ter fest­ge­legt. Dazu gehören die Lernrate, die Batch-Größe, die Anzahl der Epochen und die maximale Se­quenz­län­ge. Für ein erstes LoRA-Training ist learning_rate=2e-4 ein üblicher Startwert. Da der VRAM bei Consumer-GPUs oft begrenzt ist, wird hier mit einer kleinen Batch-Größe und gradient_accumulation_steps=8 ge­ar­bei­tet. Dadurch werden mehrere kleine Trai­nings­schrit­te gesammelt, bevor ein Op­ti­mie­rungs­schritt aus­ge­führt wird.

Der folgende Code erstellt die Trai­nings­kon­fi­gu­ra­ti­on und übergibt sie zusammen mit Modell, Datensatz und LoRA-Kon­fi­gu­ra­ti­on an den SFTTrainer:

from trl import SFTTrainer, SFTConfig
training_args = SFTConfig(
    output_dir="./llama-lora-output",
    learning_rate=2e-4,
    per_device_train_batch_size=1,
    gradient_accumulation_steps=8,
    num_train_epochs=2,
    logging_steps=10,
    eval_strategy="steps",
    eval_steps=50,
    save_steps=100,
    max_length=1024,
    bf16=True
)
trainer = SFTTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["validation"],
    peft_config=lora_config
)
python

Mit dieser Kon­fi­gu­ra­ti­on trainiert das Modell nicht alle ur­sprüng­li­chen Gewichte neu, sondern nur die LoRA-Adapter. Die Va­li­die­rungs­da­ten werden genutzt, um während des Trainings zu prüfen, ob das Modell auch auf nicht gesehenen Bei­spie­len besser wird.

Schritt 6: Training starten

Nach der Kon­fi­gu­ra­ti­on starten Sie das Training mit trainer.train(). Während des Trainings pro­to­kol­liert das Framework ty­pi­scher­wei­se den Training Loss und den Eva­lua­ti­on Loss. Der Training Loss zeigt, wie gut das Modell auf den Trai­nings­da­ten vor­an­kommt. Der Eva­lua­ti­on Loss zeigt, wie gut das Modell auf nicht gesehenen Va­li­die­rungs­da­ten ab­schnei­det. Wenn der Training Loss sinkt, der Eva­lua­ti­on Loss aber steigt, ist das ein Hinweis auf Over­fit­ting. In diesem Fall sollten Sie weniger Epochen, mehr Daten, höheres Dropout oder kleinere LoRA-Ranks testen.

trainer.train()
trainer.save_model("./llama-lora-adapter")
python

Schritt 7: Adapter testen

Nach dem Training speichern Sie nicht das komplette Ba­sis­mo­dell, sondern haupt­säch­lich den LoRA-Adapter. Dieser Adapter kann später zusammen mit dem Ba­sis­mo­dell geladen werden. Dadurch bleiben die Dateien deutlich kleiner als bei einem voll­stän­di­gen Modell-Check­point. Für einen ersten Test sollten Sie Beispiele verwenden, die nicht im Trai­nings­da­ten­satz enthalten waren. Prüfen Sie nicht nur, ob die Antwort gut klingt, sondern ob sie fachlich korrekt und im ge­wünsch­ten Format ist. Besonders bei JSON-Ausgaben sollten Sie testen, ob das Modell valide Struk­tu­ren erzeugt.

from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=quant_config,
    device_map="auto"
)
fine_tuned_model = PeftModel.from_pretrained(
    base_model,
    "./llama-lora-adapter"
)
python

Eva­lua­ti­on: Wie bewertet man ein Fine-Tuning?

Nach dem Training stellt sich die Frage, ob das Modell tat­säch­lich besser geworden ist. Dafür werden ver­schie­de­ne Metriken verwendet, die während und nach dem Training berechnet werden. Die wich­tigs­ten Kenn­zah­len sind der Training Loss, der Eva­lua­ti­on Loss und die Per­ple­xi­ty. Zu­sätz­lich sollten die Antworten des Modells immer auch manuell geprüft werden, da einzelne Metriken nicht alle Qua­li­täts­aspek­te erfassen können.

Training Loss

Der Training Loss misst, wie stark die Vor­her­sa­gen des Modells von den ge­wünsch­ten Antworten in den Trai­nings­da­ten abweichen. Ver­ein­facht gesagt zeigt sie, wie gut das Modell die Beispiele gelernt hat, die es während des Trainings gesehen hat.

Während eines er­folg­rei­chen Trainings sollte der Training Loss kon­ti­nu­ier­lich sinken. Das bedeutet, dass die Mo­dell­vor­her­sa­gen immer näher an den ge­wünsch­ten Ziel­ant­wor­ten liegen. Ein niedriger Training Loss allein ist jedoch noch kein Beweis für ein gutes Modell, da das Modell die Trai­nings­da­ten auch auswendig lernen kann.

Eva­lua­ti­on Loss

Der Eva­lua­ti­on Loss wird auf einem separaten Va­li­die­rungs­da­ten­satz berechnet, den das Modell während des Trainings nicht sieht. Sie zeigt deshalb besser, wie gut das Modell auf neue, un­be­kann­te Eingaben reagieren kann.

Für die Praxis ist der Eva­lua­ti­on Loss meist wichtiger als der Training Loss. Sinken beide Werte gleich­zei­tig, deutet dies darauf hin, dass das Modell sinnvoll lernt. Sinkt dagegen nur der Training Loss, während der Eva­lua­ti­on Loss wieder ansteigt, spricht dies häufig für Over­fit­ting. Das Modell merkt sich dann die Trai­nings­da­ten zu stark und ge­ne­ra­li­siert schlech­ter auf neue Beispiele.

Per­ple­xi­ty

Eine weitere häufig ver­wen­de­te Metrik ist die Per­ple­xi­ty. Sie be­schreibt ver­ein­facht, wie sicher oder unsicher das Modell bei der Vor­her­sa­ge des nächsten Tokens ist. Niedrige Werte sind in der Regel besser, da sie auf präzisere Vor­her­sa­gen hindeuten. Die Per­ple­xi­ty wird in aller Regel direkt aus dem Cross-Entropy Loss berechnet:

import math
eval_results = trainer.evaluate()
eval_loss = eval_results["eval_loss"]
perplexity = math.exp(eval_loss)
print(f"Evaluation Loss: {eval_loss:.4f}")
print(f"Perplexity: {perplexity:.2f}")
python

Die Per­ple­xi­ty eignet sich gut zum Vergleich ver­schie­de­ner Mo­dell­ver­sio­nen oder Trai­nings­läu­fe. Sie sollte jedoch nicht isoliert be­trach­tet werden, da ein Modell trotz guter Per­ple­xi­ty fachlich falsche oder un­voll­stän­di­ge Antworten erzeugen kann.

In­ter­pre­ta­ti­on der Loss-Kurve

Neben den einzelnen Kenn­zah­len lohnt sich ein Blick auf die gesamte Loss-Kurve während des Trainings. Sie zeigt, wie sich die Mo­dell­qua­li­tät über die Zeit ent­wi­ckelt. Eine typische, gesunde Trai­nings­kur­ve fällt zu Beginn relativ deutlich ab und flacht später langsam ab. Das Modell lernt zunächst schnell und nähert sich an­schlie­ßend schritt­wei­se einem stabilen Zustand an.

Treten starke Schwan­kun­gen auf, kann dies auf eine zu hohe Learning Rate oder einen zu kleinen be­zie­hungs­wei­se un­ein­heit­li­chen Datensatz hindeuten. Sinkt der Loss dagegen kaum, kann die Learning Rate zu niedrig sein oder die Trai­nings­da­ten passen nicht gut zur Aufgabe.

Steigt der Eva­lua­ti­on Loss nach einigen Trai­nings­schrit­ten wieder an, während der Training Loss weiter sinkt, spricht dies häufig für Over­fit­ting. In diesem Fall kann es sinnvoll sein, das Training früher zu beenden oder einen älteren Check­point zu verwenden. Aus diesem Grund speichern Trainings-Frame­works re­gel­mä­ßig Zwi­schen­stän­de des Modells.

Warum manuelle Tests weiterhin wichtig sind

Metriken liefern wichtige Hinweise auf die Mo­dell­qua­li­tät, ersetzen aber keine prak­ti­sche Über­prü­fung. Nach dem Fine-Tuning sollten Sie das Modell daher mit rea­lis­ti­schen Test­an­fra­gen eva­lu­ie­ren und die Antworten fachlich bewerten.

In pro­duk­ti­ven Projekten werden deshalb meist au­to­ma­ti­sche Kenn­zah­len wie Loss und Per­ple­xi­ty mit manuellen Tests kom­bi­niert. Erst die Kom­bi­na­ti­on aus beiden Verfahren er­mög­licht eine zu­ver­läs­si­ge Ein­schät­zung der tat­säch­li­chen Mo­dell­qua­li­tät.

Fazit

LLM Fine-Tuning ist sinnvoll, wenn ein vor­trai­nier­tes Modell mit ver­füg­ba­ren Mo­dell­ge­wich­ten ein be­stimm­tes Auf­ga­ben­ver­hal­ten oder Ant­wort­for­mat lernen soll. Für An­fän­ge­rin­nen und Anfänger ist ein Full Fine-Tuning von LLMs meistens zu teuer und zu spei­cher­in­ten­siv. LoRA und QLoRA sind deshalb die pra­xis­nä­he­ren Methoden, weil sie deutlich weniger VRAM benötigen. Mit 4-Bit-Quan­ti­sie­rung lassen sich 7B- oder 8B-Modelle oft schon auf leis­tungs­star­ken Consumer-GPUs trai­nie­ren. A100-, H100-, B200- und H200-GPUs bleiben jedoch wichtig, wenn größere Modelle, längere Kontexte oder mehrere Ex­pe­ri­men­te parallel benötigt werden. Ent­schei­dend ist am Ende nicht nur die Trai­nings­kon­fi­gu­ra­ti­on, sondern vor allem die Qualität der Daten und eine saubere Eva­lua­ti­on.

Zum Hauptmenü