AI Engineering Academy · Lektion

LoRA-Fine-Tuning mit Hugging Face PEFT

Konfigurieren Sie LoRA-Rang, Alpha und Zielmodule, führen Sie über den TRL SFTTrainer überwachtes Fine-Tuning durch, überwachen Sie den Trainingsverlust und speichern Sie zusammengeführte sowie reine Adapter-Checkpoints.

Lektion 3 von 413 Schritte

LoRA-Fine-Tuning mit Hugging Face PEFT ist eine kostenlose AI Engineering Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Engineering Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum LoRA statt vollständigem Fine-Tuning?

Beim vollständigen Fine-Tuning wird jeder Parameter eines Modells aktualisiert. Bei einem Modell mit 7 Milliarden Parametern und float32-Präzision sind allein für die Gewichte etwa 28 GB GPU-Speicher erforderlich, zuzüglich Optimiererzuständen, Gradienten und Aktivierungen – insgesamt problemlos 80–120 GB. LoRA (Low-Rank Adaptation) fügt stattdessen eine sehr kleine Anzahl trainierbarer Parameter hinzu (typischerweise 0,1–1 % der Gesamtzahl), und zwar als Paare von Matrizen mit niedrigem Rang, die auf ausgewählte Layer angewendet werden. Dadurch sinkt der GPU-Bedarf um den Faktor 10–50, bei vergleichbaren Ergebnissen.

# LoRA math intuition:
# Full fine-tuning: update W (large matrix, e.g., 4096 x 4096 = 16.7M parameters)
# LoRA: instead train W = W_0 + A @ B where:
#   A has shape (4096, r) - only r*4096 params
#   B has shape (r, 4096) - only r*4096 params
#   r (rank) is typically 4, 8, or 16 - much smaller than 4096

# Memory comparison for 7B model:
# Full fine-tuning: ~80GB GPU RAM
# LoRA (rank=8): ~12GB GPU RAM - fits on a single A100 or 3090
print('LoRA makes fine-tuning accessible without massive GPU clusters')

Installieren der erforderlichen Bibliotheken

Für LoRA-Fine-Tuning mit Hugging Face benötigen Sie drei Bibliotheken: transformers (Laden und Tokenisieren von Modellen), peft (Parameter-Efficient Fine-Tuning, einschließlich der Implementierung von LoRA) und trl (Transformer Reinforcement Learning, stellt den SFTTrainer für überwachtes Fine-Tuning bereit). Zusammen ermöglichen diese Bibliotheken einen produktionsreifen Fine-Tuning-Workflow auf hoher Abstraktionsebene.

# pip install transformers peft trl accelerate bitsandbytes datasets

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, TaskType
from trl import SFTTrainer, SFTConfig
from datasets import Dataset
import torch

print('Libraries imported successfully')
print(f'GPU available: {torch.cuda.is_available()}')
if torch.cuda.is_available():
    print(f'GPU: {torch.cuda.get_device_name(0)}')
    print(f'GPU memory: {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB')

Laden des Basismodells mit Quantisierung

Laden Sie das Basismodell für die meisten LoRA-Fine-Tuning-Aufgaben mit 4-Bit-Quantisierung über bitsandbytes. Dadurch verringert sich der Speicherbedarf des Basismodells um 75 % (ein 7B-Modell benötigt statt etwa 14 GB nur etwa 4 GB), während der Großteil der Fähigkeiten des Modells erhalten bleibt. Nur die LoRA-Adapter-Layer werden mit voller Präzision trainiert. Die Kombination aus 4-Bit-Quantisierung und LoRA wird QLoRA genannt und macht das Fine-Tuning von 7B-Modellen auf GPUs für Endverbraucher zugänglich.

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import torch

MODEL_NAME = 'mistralai/Mistral-7B-Instruct-v0.2'  # or 'meta-llama/Llama-3.2-3B-Instruct'

# 4-bit quantization config (QLoRA)
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,                         # quantize base model to 4-bit
    bnb_4bit_quant_type='nf4',                 # NF4 quantization type
    bnb_4bit_compute_dtype=torch.float16,      # compute in float16
    bnb_4bit_use_double_quant=True             # double quantization for extra savings
)

# Load quantized model
model = AutoModelForCausalLM.from_pretrained(
    MODEL_NAME,
    quantization_config=bnb_config,
    device_map='auto',                         # automatically distribute across GPUs
    trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
tokenizer.pad_token = tokenizer.eos_token    # required for training batches
print(f'Model loaded. Parameters: {model.num_parameters():,}')

Konfigurieren der LoRA-Hyperparameter

Die drei wichtigsten LoRA-Hyperparameter sind: r (Rang) – die Dimension der Matrizen mit niedrigem Rang. Ein höherer Rang bedeutet mehr trainierbare Parameter und eine ausdrucksstärkere Anpassung, aber auch mehr Speicherbedarf und ein höheres Overfitting-Risiko. lora_alpha – ein Skalierungsfaktor, der üblicherweise auf das Zweifache des Rangs gesetzt wird. target_modules – die Gewichtsmatrizen, auf die LoRA angewendet wird; Attention-Layer (q_proj, v_proj) sind die häufigste Wahl. Beginnen Sie mit r=8 und passen Sie den Wert anschließend an.

from peft import LoraConfig, TaskType

lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,         # causal language modeling
    r=8,                                   # rank: 4, 8, 16, 32 — higher = more params
    lora_alpha=16,                         # scaling: usually 2*r
    lora_dropout=0.1,                      # dropout on LoRA layers for regularization
    target_modules=['q_proj', 'v_proj',    # which weight matrices to adapt
                    'k_proj', 'o_proj',    # common to target all attention projections
                    'gate_proj', 'up_proj', 'down_proj'],  # and FFN layers
    bias='none',                           # do not adapt bias parameters
)

# Wrap the model with LoRA adapters
from peft import get_peft_model, prepare_model_for_kbit_training

model = prepare_model_for_kbit_training(model)  # prepares quantized model for training
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# Output: trainable params: 4,194,304 || all params: 3,752,071,168 || trainable%: 0.11%

Vorbereiten des Datensatzes

Der SFTTrainer erwartet Datensätze in einem bestimmten Format. Das einfachste Format ist ein Datensatz mit einer einzelnen text-Spalte, die den vollständig formatierten Prompt einschließlich Antwort enthält. Verwenden Sie das Chat-Template des Tokenizers, um Konversationsbeispiele einheitlich zu formatieren. Der SFTTrainer übernimmt die Tokenisierung, die Batch-Verarbeitung und das Maskieren des Loss (der Loss wird nur für die Antworten des Assistenten berechnet, nicht für den Eingabe-Prompt).

from datasets import Dataset
import json

def load_and_format_dataset(jsonl_path: str, tokenizer) -> Dataset:
    examples = []
    with open(jsonl_path) as f:
        for line in f:
            ex = json.loads(line.strip())
            # Apply chat template to format as expected by the model
            formatted = tokenizer.apply_chat_template(
                ex['messages'],
                tokenize=False,
                add_generation_prompt=False
            )
            examples.append({'text': formatted})
    
    return Dataset.from_list(examples)

# Load training and validation datasets
train_dataset = load_and_format_dataset('train.jsonl', tokenizer)
val_dataset = load_and_format_dataset('validation.jsonl', tokenizer)

print(f'Train examples: {len(train_dataset)}')
print(f'Validation examples: {len(val_dataset)}')
print('Sample formatted text:')
print(train_dataset[0]['text'][:300])

Trainieren mit SFTTrainer

Der SFTTrainer aus TRL erweitert den Hugging Face Trainer um Standardeinstellungen für überwachtes Fine-Tuning. Konfigurieren Sie ihn mit den Trainingshyperparametern: Anzahl der Epochen (für Instruction-Fine-Tuning sind in der Regel 1–3 ausreichend), Batch-Größe, Schritte zur Gradientenakkumulation (um bei begrenztem Speicher größere Batches zu simulieren), Lernrate (2e-4 ist ein üblicher Ausgangswert) und Ausgabeverzeichnis für Checkpoints.

from trl import SFTTrainer, SFTConfig

training_args = SFTConfig(
    output_dir='./fine-tuned-model',
    num_train_epochs=2,                    # 2-3 epochs for instruction fine-tuning
    per_device_train_batch_size=4,         # increase if GPU memory allows
    gradient_accumulation_steps=4,         # effective batch size = 4*4 = 16
    learning_rate=2e-4,                    # typical LoRA learning rate
    warmup_ratio=0.05,                     # warmup for 5% of steps
    lr_scheduler_type='cosine',            # cosine decay learning rate schedule
    logging_steps=10,
    eval_strategy='steps',
    eval_steps=50,                         # evaluate on validation set every 50 steps
    save_steps=100,
    max_seq_length=2048,                   # max token length per example
    fp16=True,                             # mixed precision training
    report_to='none'                       # or 'wandb' for experiment tracking
)

trainer = SFTTrainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
)

print('Starting LoRA fine-tuning...')
trainer.train()

Überwachen des Trainingsfortschritts

Beobachten Sie während des Trainings zwei wichtige Metriken: Der Trainings-Loss sollte kontinuierlich sinken. Der Validierungs-Loss sollte zunächst sinken und anschließend ein Plateau erreichen oder leicht steigen (Overfitting). Wenn der Validierungs-Loss deutlich steigt, während der Trainings-Loss weiter sinkt, beenden Sie das Training vorzeitig – das Modell merkt sich Trainingsbeispiele, statt zu generalisieren. Der optimale Abbruchzeitpunkt liegt unmittelbar vor dem Anstieg des Validierungs-Loss.

# Reading training logs
# Training step logs look like:
# {'loss': 1.4523, 'grad_norm': 0.85, 'learning_rate': 0.0002, 'epoch': 0.2, 'step': 20}
# {'loss': 1.2341, 'grad_norm': 0.72, 'learning_rate': 0.00018, 'epoch': 0.4, 'step': 40}

# Validation results look like:
# {'eval_loss': 1.1823, 'eval_runtime': 12.3, 'eval_samples_per_second': 8.1, 'step': 50}
# {'eval_loss': 1.0923, 'eval_runtime': 12.1, 'eval_samples_per_second': 8.3, 'step': 100}
# {'eval_loss': 1.1234, 'eval_runtime': 12.4, 'eval_samples_per_second': 8.2, 'step': 150}
# ^ validation loss went UP at step 150 - overfitting starting

# Load the best checkpoint (lowest validation loss)
from transformers import TrainerCallback

print('Best model checkpoint is saved automatically by SFTTrainer (load_best_model_at_end=True)')

Speichern und Zusammenführen von LoRA-Adaptern

Speichern Sie die LoRA-Adaptergewichte nach dem Training getrennt vom Basismodell. Der Adapter ist sehr klein (einige MB bis einige hundert MB) und kann bei der Inferenz auf das Basismodell angewendet werden. Für die Bereitstellung in der Produktion können Sie die LoRA-Gewichte außerdem mit dem Basismodell zusammenführen. Dadurch entsteht eine einzelne Modelldatei, die bei der Inferenz keine PEFT-Bibliothek benötigt – der Inferenz-Overhead wird dadurch reduziert.

# Save only the LoRA adapter (tiny - typically 10-100MB)
model.save_pretrained('./lora-adapter-only')
tokenizer.save_pretrained('./lora-adapter-only')

# Load the adapter for inference (requires base model + peft)
from peft import PeftModel

base_model = AutoModelForCausalLM.from_pretrained(MODEL_NAME, torch_dtype=torch.float16, device_map='auto')
model_with_adapter = PeftModel.from_pretrained(base_model, './lora-adapter-only')

# Alternative: Merge adapter into base model (no PEFT needed at inference)
print('Merging LoRA weights into base model...')
merged_model = model_with_adapter.merge_and_unload()  # creates a regular model
merged_model.save_pretrained('./merged-model')
print('Merged model saved - can be used with standard transformers, no PEFT needed')

Ausführen der Inferenz mit dem Fine-Tuning-Modell

Testen Sie Ihr Fine-Tuning-Modell anhand einer Reihe zurückgehaltener Prompts, bevor Sie den Erfolg feststellen. Vergleichen Sie die Ausgaben des Basismodells und des Fine-Tuning-Modells für dieselben Prompts direkt miteinander, um zu überprüfen, ob das Fine-Tuning seine Ziele erreicht hat. Prüfen Sie sowohl die Fälle, die das Modell besser bewältigen sollte (die Zielaufgabe), als auch Fälle, die es weiterhin gut bewältigen sollte (allgemeine Aufgaben, deren Leistung nicht nachlassen soll).

def generate(model, tokenizer, prompt: str, max_new_tokens=512) -> str:
    inputs = tokenizer(prompt, return_tensors='pt').to(model.device)
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=max_new_tokens,
            temperature=0.1,
            do_sample=True,
            pad_token_id=tokenizer.eos_token_id
        )
    # Decode only the new tokens (not the input prompt)
    new_tokens = outputs[0][inputs['input_ids'].shape[1]:]
    return tokenizer.decode(new_tokens, skip_special_tokens=True)

# Compare base vs fine-tuned
test_prompt = 'Extract JSON from: "Alice Johnson, 28, software engineer in NYC since 2021"'
print('=== BASE MODEL ===')
print(generate(base_model, tokenizer, test_prompt))
print('\n=== FINE-TUNED MODEL ===')
print(generate(merged_model, tokenizer, test_prompt))

Zusammenfassung der wichtigsten LoRA-Hyperparameter

Beginnen Sie für Ihren Anwendungsfall mit diesen Standardwerten und ändern Sie jeweils nur einen Wert. r=8 ist ein sicherer Ausgangspunkt – erhöhen Sie den Wert auf 16 oder 32, wenn das Modell eine ausdrucksstärkere Anpassung benötigt. lora_alpha = 2*r ist eine stabile Wahl. Eine Lernrate von 2e-4 eignet sich für die meisten Instruction-Fine-Tuning-Aufgaben; verringern Sie sie auf 1e-4, wenn der Trainings-Loss instabil ist. Epochen 1–3: Beenden Sie das Training, sobald der Validierungs-Loss nicht mehr sinkt.

Wann Sie stattdessen OpenAI Fine-Tuning verwenden sollten

Hugging Face PEFT LoRA erfordert eine GPU. Wenn Sie keine GPU-Infrastruktur besitzen, ist die Fine-Tuning-API von OpenAI eine verwaltete Alternative, die die Trainingsinfrastruktur für Sie übernimmt. Laden Sie Ihre JSONL-Datei hoch, rufen Sie die API auf, um einen Trainingslauf zu starten, und erhalten Sie eine ID für das Fine-Tuning-Modell, die Sie in API-Aufrufen verwenden können. OpenAI Fine-Tuning unterstützt GPT-4o-mini und GPT-3.5-turbo. Die Kosten pro Token sind höher, dafür entfällt die Verwaltung der Infrastruktur vollständig.

from openai import OpenAI

client = OpenAI()

# Upload training file
train_file = client.files.create(
    file=open('train.jsonl', 'rb'),
    purpose='fine-tune'
)
val_file = client.files.create(
    file=open('validation.jsonl', 'rb'),
    purpose='fine-tune'
)

# Create fine-tuning job
job = client.fine_tuning.jobs.create(
    training_file=train_file.id,
    validation_file=val_file.id,
    model='gpt-4o-mini',  # base model to fine-tune
    hyperparameters={
        'n_epochs': 3,
        'batch_size': 'auto',
        'learning_rate_multiplier': 'auto'
    }
)
print(f'Fine-tuning job created: {job.id}')
# Monitor: client.fine_tuning.jobs.retrieve(job.id)
# Use: client.chat.completions.create(model=job.fine_tuned_model, ...)

Schnelltest

Testen Sie anhand dieser Lektion Ihr Verständnis des LoRA-Fine-Tunings.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: LoRA reduziert den GPU-Bedarf für Fine-Tuning um den Faktor 10–50, indem nur kleine Adaptermatrizen mit niedrigem Rang statt aller Modellparameter trainiert werden. QLoRA (4-Bit-Quantisierung und LoRA) macht das Fine-Tuning von 7B-Modellen auf GPUs für Endverbraucher mit etwa 12 GB VRAM möglich. Außerdem stellt der SFTTrainer aus TRL eine API auf hoher Abstraktionsebene bereit, die Tokenisierung, Batch-Verarbeitung, Loss-Maskierung und das Speichern von Checkpoints übernimmt. Als Nächstes evaluieren und stellen wir das Fine-Tuning-Modell bereit.

Kostenlos starten

Lerne Python mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
30
Lektionen
120

Häufig gestellte Fragen

Ist die Lektion „LoRA-Fine-Tuning mit Hugging Face PEFT“ kostenlos?

Ja — der vollständige Text von „LoRA-Fine-Tuning mit Hugging Face PEFT“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Engineering Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „LoRA-Fine-Tuning mit Hugging Face PEFT“?

Konfigurieren Sie LoRA-Rang, Alpha und Zielmodule, führen Sie über den TRL SFTTrainer überwachtes Fine-Tuning durch, überwachen Sie den Trainingsverlust und speichern Sie zusammengeführte sowie reine… Du übst AI Engineering Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Engineering Academy zu starten?

Keine Vorkenntnisse erforderlich. AI Engineering Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „LoRA-Fine-Tuning mit Hugging Face PEFT“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Engineering Academy-Lektion Code schreiben und ausführen?

Ja. Jede AI Engineering Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Wann Fine-Tuning besser ist als Prompting
  2. Einen hochwertigen Trainingsdatensatz vorbereiten
  3. LoRA-Fine-Tuning mit Hugging Face PEFT
  4. Ihr feinabgestimmtes Modell evaluieren und bereitstellen
← Zurück zu AI Engineering Academy