For the complete documentation index, see llms.txt. This page is also available as Markdown.

Tutorial: Wie man gpt-oss feinabstimmt

Lerne Schritt für Schritt, wie du OpenAI gpt-oss lokal mit Unsloth trainierst.

In diesem Leitfaden mit Screenshots lernst du, dein eigenes benutzerdefiniertes gpt-oss-Modell feinabzustimmen, entweder lokal auf deinem Rechner mit Unsloth oder kostenlos mit Google Colab. Wir führen dich durch den gesamten Prozess, vom Einrichten bis zum Ausführen und Speichern deines trainierten Modells.

Schnellstart: Feinabstimmung von gpt-oss-20b kostenlos mit unserem: Colab-Notebook

Unsloth gpt-oss-Fine-Tuning erreicht im Vergleich zu allen anderen FA2-Implementierungen 1,5× schnelleres Training, 70 % weniger VRAM-Verbrauch und 10× längere Kontextlängen – ohne Genauigkeitsverlust.

  • QLoRA-Anforderungen: gpt-oss-20b = 14 GB VRAM • gpt-oss-120b = 65 GB VRAM.

  • BF16-LoRA-Anforderungen: gpt-oss-20b = 44 GB VRAM • gpt-oss-120b = 210 GB VRAM.

Lokaler LeitfadenColab-Leitfaden

🌐 Colab gpt-oss-Feinabstimmung

Dieser Abschnitt behandelt die Feinabstimmung von gpt-oss mit unseren Google-Colab Notebooks. Du kannst das gpt-oss-Notebook auch speichern und in deinem bevorzugten Code-Editor verwenden und unserem lokalen gpt-oss-Leitfaden.

1

Unsloth installieren (in Colab)

In Colab, führe Zellen aus von oben nach unten. Verwenden Sie Alle ausführen für den ersten Durchlauf. Die erste Zelle installiert Unsloth (und zugehörige Abhängigkeiten) und gibt GPU-/Speicherinformationen aus. Wenn eine Zelle einen Fehler wirft, führe sie einfach erneut aus.

2

gpt-oss und Reasoning Effort konfigurieren

Wir laden gpt-oss-20b mithilfe von Unsloths linearisierten Version (da keine andere Version funktionieren wird).

Konfiguriere die folgenden Parameter:

  • max_seq_length = 1024

    • Empfohlen für schnelle Tests und erste Experimente.

  • load_in_4bit = True

    • Verwenden Sie Falsch für LoRA-Training (Hinweis: Wenn du dies auf Falsch setzt, benötigst du mindestens 43 GB VRAM). Du MUSS auch model_name = "unsloth/gpt-oss-20b-BF16"

Du solltest eine Ausgabe sehen, die dem folgenden Beispiel ähnelt. Hinweis: Wir ändern den dtype zu float32 explizit, um das korrekte Trainingsverhalten sicherzustellen.

3

Feinabstimmungs-Hyperparameter (LoRA)

Jetzt ist es an der Zeit, deine Trainings-Hyperparameter anzupassen. Für einen tieferen Einblick, wie, wann und was angepasst werden sollte, schau dir unseren detaillierten Hyperparameter-Leitfaden.

Um Überanpassung, behalte deinen Trainingsverlust im Auge und vermeide, diese Werte zu hoch einzustellen.

Dieser Schritt fügt LoRA-Adapter für eine parameter-effiziente Feinabstimmung hinzu. Nur etwa 1 % der Modellparameter werden trainiert, was den Prozess deutlich effizienter macht.

4

Inference ausprobieren

Im Notebook gibt es einen Abschnitt namens "Reasoning Effort" der die gpt-oss-Inferenz in Colab demonstriert. Du kannst diesen Schritt überspringen, musst das Modell jedoch später trotzdem ausführen, sobald du mit der Feinabstimmung fertig bist.

5

Datenvorbereitung

Für dieses Beispiel verwenden wir den HuggingFaceH4/Multilingual-Thinking. Dieses Datenset enthält Chain-of-Thought-Reasoning-Beispiele, die aus Benutzerfragen abgeleitet und aus dem Englischen in vier weitere Sprachen übersetzt wurden.

Dies ist dasselbe Datenset, das auch im Fine-Tuning-Cookbook von OpenAI erwähnt wird.

Das Ziel der Verwendung eines mehrsprachigen Datensatzes ist es, dem Modell zu helfen, Schlussfolgerungsmuster über mehrere Sprachen hinweg zu lernen und zu verallgemeinern.

gpt-oss führt ein System für Reasoning Effort ein, das steuert, wie viel Schlussfolgerung das Modell durchführt. Standardmäßig ist der Reasoning Effort auf niedrig, gesetzt, aber du kannst ihn ändern, indem du den reasoning_effort Parameter auf niedrig, mittel oder hoch.

Beispiel:

tokenizer.apply_chat_template(
    text, 
    tokenize = False, 
    add_generation_prompt = False,
    reasoning_effort = "medium",
)

Um den Datensatz zu formatieren, wenden wir eine angepasste Version des gpt-oss-Prompts an:

from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
dataset = dataset.map(formatting_prompts_func, batched = True,)

Schauen wir uns den Datensatz an, indem wir das erste Beispiel ausgeben:

print(dataset[0]['text'])

Ein einzigartiges Merkmal von gpt-oss ist die Verwendung des OpenAI-Harmony-Formats, das strukturierte Unterhaltungen, Reasoning-Ausgaben und Tool-Aufrufe unterstützt. Dieses Format enthält Tags wie <|start|> , <|message|> , und <|return|> .

🦥 Unsloth korrigiert die Chatvorlage, um sicherzustellen, dass sie korrekt ist. Sieh dir diesen Tweet für technische Details zu unserer Vorlagenkorrektur an.

Passe den Prompt und die Struktur gerne an deinen eigenen Datensatz oder Anwendungsfall an. Für weitere Hinweise siehe unseren Datensatzleitfaden.

6

Das Modell trainieren

Wir haben die Trainings-Hyperparameter für optimale Ergebnisse vorab ausgewählt. Du kannst sie jedoch an deinen spezifischen Anwendungsfall anpassen. Sieh dir unseren Hyperparameter-Leitfaden.

In diesem Beispiel trainieren wir 60 Schritte lang, um den Prozess zu beschleunigen. Für einen vollständigen Trainingslauf setze num_train_epochs=1 und deaktiviere die Schrittbegrenzung, indem du max_steps=None.

Während des Trainings beobachte den Verlust, um sicherzustellen, dass er im Laufe der Zeit sinkt. Dies bestätigt, dass der Trainingsprozess korrekt funktioniert.

7

Inference: Dein trainiertes Modell ausführen

Jetzt ist es an der Zeit, Inferenz mit deinem feinabgestimmten Modell auszuführen. Du kannst die Anweisung und die Eingabe ändern, aber die Ausgabe leer lassen.

In diesem Beispiel testen wir die Fähigkeit des Modells, auf Französisch zu schlussfolgern, indem wir dem System-Prompt eine spezifische Anweisung hinzufügen, nach derselben Struktur, die in unserem Datensatz verwendet wird.

Dies sollte eine Ausgabe erzeugen, die ähnlich aussieht wie:

8

Speichere/exportiere dein Modell

Um dein feinabgestimmtes Modell zu speichern, kannst du dein feinabgestimmtes Modell sowohl im bf16-Format , mit unserem On-Demand-Dekwantisierung von MXFP4 Basismodellen mithilfe von save_method="merged_16bit"oder im nativen MXFP4 Safetensors-Format mit save_method="mxfp4" .

Der MXFP4 Das native Merge-Format bietet erhebliche Leistungsverbesserungen im Vergleich zum bf16-Format: Es benötigt bis zu 75 % weniger Speicherplatz, reduziert den VRAM-Verbrauch um 50 %, beschleunigt das Zusammenführen um das 5- bis 10-Fache und ermöglicht eine deutlich schnellere Konvertierung in GGUF Format.

Nachdem du dein gpt-oss-Modell feinabgestimmt hast, kannst du es zusammenführen zu MXFP4 Format mit:

model.save_pretrained_merged(save_directory, tokenizer, save_method="mxfp4)

Wenn du das Modell lieber zusammenführen und direkt auf den Hugging-Face-Hub pushen möchtest:

model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token, save_method="mxfp4")

✨ Speichern für Llama.cpp

  1. Holen Sie sich die neueste llama.cpp auf hier auf GitHub. Sie können auch die folgenden Build-Anweisungen befolgen. Ändern Sie -DGGML_CUDA=ON zu -DGGML_CUDA=OFF wenn Sie keine GPU haben oder nur CPU-Inferenz möchten.

    apt-get update
    apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
    git clone https://github.com/ggml-org/llama.cpp
    cmake llama.cpp -B llama.cpp/build \\
        -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
    cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-gguf-split
    cp llama.cpp/build/bin/llama-* llama.cpp
  2. Konvertiere das MXFP4 zusammengeführte Modell:

    python3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned-mxfp4.gguf
  3. Führe Inferenz auf dem quantisierten Modell aus:

    llama.cpp/llama-cli --model gpt-oss-finetuned-mxfp4.gguf \\
        --jinja -ngl 99 --threads -1 --ctx-size 16384 \\
        --temp 1.0 --top-p 1.0 --top-k 0 \\
         -p "The meaning to life and the universe is"

🖥️ Lokale gpt-oss-Feinabstimmung

Dieses Kapitel behandelt die Feinabstimmung von gpt-oss auf deinem lokalen Gerät. Während gpt-oss-20b die Feinabstimmung mit nur 14 GB VRAM möglich ist, empfehlen wir, mindestens 16 GB VRAM verfügbar zu haben, um stabile und zuverlässige Trainingsläufe zu gewährleisten.

Wir empfehlen, Elemente aus unserem Colab Notebooks herunterzuladen oder in dein lokales Setup zu integrieren, um die Nutzung zu erleichtern.

1

Unsloth lokal installieren

Stelle sicher, dass dein Gerät mit Unsloth kompatibel ist, und du kannst unseren ausführlichen Installationsleitfaden.

lesen. Du kannst Unsloth auch mit unserem.

Docker-Image installieren. Beachte, dass

# Wir installieren die neueste Torch-, Triton-, OpenAI-Triton-Kernels-, Transformers- und Unsloth-Version!
!pip install --upgrade -qqq uv
try: import numpy; install_numpy = f"numpy=={numpy.__version__}"
except: install_numpy = "numpy"
!uv pip install -qqq \
    "torch>=2.8.0" "triton>=3.4.0" {install_numpy} \\
    "unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo" \
    "unsloth[base] @ git+https://github.com/unslothai/unsloth" \
    torchvision bitsandbytes \\
    git+https://github.com/huggingface/transformers \\
    git+https://github.com/triton-lang/triton.git@05b2c186c1b6c9a08375389d5efe9cb4c401c075#subdirectory=python/triton_kernels
2

gpt-oss und Reasoning Effort konfigurieren

Wir laden gpt-oss-20b mithilfe von Unsloths linearisierten Version (da keine andere Version für QLoRA-Feinabstimmung funktionieren wird). Konfiguriere die folgenden Parameter:

  • max_seq_length = 2048

    • Empfohlen für schnelle Tests und erste Experimente.

  • load_in_4bit = True

    • Verwenden Sie Falsch für LoRA-Training (Hinweis: Wenn du dies auf Falsch setzt, benötigst du mindestens 43 GB VRAM). Du MUSS auch model_name = "unsloth/gpt-oss-20b-BF16"

from unsloth import FastLanguageModel
import torch
max_seq_length = 1024
dtype = None

# Wir unterstützen vorquantisierte 4-Bit-Modelle für 4x schnelleres Herunterladen + keine OOMs.
fourbit_models = [
    "unsloth/gpt-oss-20b-unsloth-bnb-4bit", # 20B-Modell mit bitsandbytes 4-Bit-Quantisierung
    "unsloth/gpt-oss-120b-unsloth-bnb-4bit",
    "unsloth/gpt-oss-20b", # 20B-Modell mit MXFP4-Format
    "unsloth/gpt-oss-120b",
] # Weitere Modelle unter https://huggingface.co/unsloth

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/gpt-oss-20b",
    dtype = dtype, # None für automatische Erkennung
    max_seq_length = max_seq_length, # Wähle irgendetwas für langen Kontext!
    load_in_4bit = True,  # 4 bit quantization to reduce memory
    full_finetuning = False, # [NEW!] We have full finetuning now!
    # token = "hf_...", # verwende einen, wenn du gesperrte Modelle nutzt
)

Du solltest eine Ausgabe sehen, die dem folgenden Beispiel ähnelt. Hinweis: Wir ändern den dtype zu float32 explizit, um das korrekte Trainingsverhalten sicherzustellen.

3

Feinabstimmungs-Hyperparameter (LoRA)

Jetzt ist es an der Zeit, deine Trainings-Hyperparameter anzupassen. Für einen tieferen Einblick, wie, wann und was angepasst werden sollte, schau dir unseren detaillierten Hyperparameter-Leitfaden.

Um Überanpassung, behalte deinen Trainingsverlust im Auge und vermeide, diese Werte zu hoch einzustellen.

Dieser Schritt fügt LoRA-Adapter für eine parameter-effiziente Feinabstimmung hinzu. Nur etwa 1 % der Modellparameter werden trainiert, was den Prozess deutlich effizienter macht.

model = FastLanguageModel.get_peft_model(
    model,
    r = 8, # Wähle jede Zahl > 0! Empfohlen: 8, 16, 32, 64, 128
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 16,
    lora_dropout = 0, # Unterstützt alles, aber = 0 ist optimiert
    bias = "none",    # Unterstützt alles, aber = "none" ist optimiert
    # [NEU] "unsloth" benötigt 30 % weniger VRAM und passt in 2x größere Batchgrößen!
    use_gradient_checkpointing = "unsloth", # True oder "unsloth" für sehr lange Kontexte
    random_state = 3407,
    use_rslora = False,  # Wir unterstützen rank-stabilisiertes LoRA
    loftq_config = None, # Und LoftQ
)
4

Datenvorbereitung

Für dieses Beispiel verwenden wir den HuggingFaceH4/Multilingual-Thinking. Dieses Datenset enthält Chain-of-Thought-Reasoning-Beispiele, die aus Benutzerfragen abgeleitet und aus dem Englischen in vier weitere Sprachen übersetzt wurden.

Dies ist dasselbe Datenset, das auch im Fine-Tuning-Cookbook von OpenAI erwähnt wird. Das Ziel der Verwendung eines mehrsprachigen Datensatzes ist es, dem Modell zu helfen, Schlussfolgerungsmuster über mehrere Sprachen hinweg zu lernen und zu verallgemeinern.

def formatting_prompts_func(examples):
    convos = examples["messages"]
    texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False) for convo in convos]
    return { "text" : texts, }
pass

from datasets import load_dataset

dataset = load_dataset("HuggingFaceH4/Multilingual-Thinking", split="train")
Datensatz

gpt-oss führt ein System für Reasoning Effort ein, das steuert, wie viel Schlussfolgerung das Modell durchführt. Standardmäßig ist der Reasoning Effort auf niedrig, gesetzt, aber du kannst ihn ändern, indem du den reasoning_effort Parameter auf niedrig, mittel oder hoch.

Beispiel:

tokenizer.apply_chat_template(
    text, 
    tokenize = False, 
    add_generation_prompt = False,
    reasoning_effort = "medium",
)

Um den Datensatz zu formatieren, wenden wir eine angepasste Version des gpt-oss-Prompts an:

from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
dataset = dataset.map(formatting_prompts_func, batched = True,)

Schauen wir uns den Datensatz an, indem wir das erste Beispiel ausgeben:

print(dataset[0]['text'])

Ein einzigartiges Merkmal von gpt-oss ist die Verwendung des OpenAI-Harmony-Formats, das strukturierte Unterhaltungen, Reasoning-Ausgaben und Tool-Aufrufe unterstützt. Dieses Format enthält Tags wie <|start|> , <|message|> , und <|return|> .

🦥 Unsloth korrigiert die Chatvorlage, um sicherzustellen, dass sie korrekt ist. Sieh dir diesen Tweet für technische Details zu unserer Vorlagenkorrektur an.

Passe den Prompt und die Struktur gerne an deinen eigenen Datensatz oder Anwendungsfall an. Für weitere Hinweise siehe unseren Datensatzleitfaden.

5

Das Modell trainieren

Wir haben die Trainings-Hyperparameter für optimale Ergebnisse vorab ausgewählt. Du kannst sie jedoch an deinen spezifischen Anwendungsfall anpassen. Sieh dir unseren Hyperparameter-Leitfaden.

In diesem Beispiel trainieren wir 60 Schritte lang, um den Prozess zu beschleunigen. Für einen vollständigen Trainingslauf setze num_train_epochs=1 und deaktiviere die Schrittbegrenzung, indem du max_steps=None.

from trl import SFTConfig, SFTTrainer
trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset,
    args = SFTConfig(
        per_device_train_batch_size = 1,
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        # num_train_epochs = 1, # Dies für einen vollständigen Trainingslauf setzen.
        max_steps = 30,
        learning_rate = 2e-4,
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "outputs",
        report_to = "none", # Verwenden Sie dies für WandB usw.
    ),
)

Während des Trainings beobachte den Verlust, um sicherzustellen, dass er im Laufe der Zeit sinkt. Dies bestätigt, dass der Trainingsprozess korrekt funktioniert.

6

Inference: Dein trainiertes Modell ausführen

Jetzt ist es an der Zeit, Inferenz mit deinem feinabgestimmten Modell auszuführen. Du kannst die Anweisung und die Eingabe ändern, aber die Ausgabe leer lassen.

In diesem Beispiel testen wir die Fähigkeit des Modells, auf Französisch zu schlussfolgern, indem wir dem System-Prompt eine spezifische Anweisung hinzufügen, nach derselben Struktur, die in unserem Datensatz verwendet wird.

messages = [
    {"role": "system", "content": "Reasoning-Sprache: Französisch\n\nDu bist ein hilfreicher Assistent, der mathematische Probleme lösen kann."},
    {"role": "user", "content": "Löse x^5 + 3x^4 - 10 = 3."},
]
inputs = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt = True,
    return_tensors = "pt",
    return_dict = True,
    reasoning_effort = "medium",
).to(model.device)
from transformers import TextStreamer
_ = model.generate(**inputs, max_new_tokens = 2048, streamer = TextStreamer(tokenizer))

Dies sollte eine Ausgabe erzeugen, die ähnlich aussieht wie:

7

Speichere und exportiere dein Modell

Um dein feinabgestimmtes Modell zu speichern, kann es mit unserem neuen im Safetensors-Format exportiert werden On-Demand-Dekwantisierung von MXFP4 Basismodelle (wie gpt-oss) während des LoRA-Zusammenführungsprozesses. Dadurch ist es möglich, dein feinabgestimmtes Modell im bf16-Format zu exportieren.

Nachdem du dein gpt-oss-Modell feinabgestimmt hast, kannst du es mit folgendem Befehl in das 16-Bit-Format zusammenführen:

model.save_pretrained_merged(save_directory, tokenizer)

Wenn du das Modell lieber zusammenführen und direkt auf den Hugging-Face-Hub pushen möchtest:

model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token)

✨ Speichern für Llama.cpp

  1. Holen Sie sich die neueste llama.cpp auf hier auf GitHub. Sie können auch die folgenden Build-Anweisungen befolgen. Ändern Sie -DGGML_CUDA=ON zu -DGGML_CUDA=OFF wenn Sie keine GPU haben oder nur CPU-Inferenz möchten.

    apt-get update
    apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
    git clone https://github.com/ggml-org/llama.cpp
    cmake llama.cpp -B llama.cpp/build \\
        -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
    cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-gguf-split
    cp llama.cpp/build/bin/llama-* llama.cp
  2. Das zusammengeführte Modell konvertieren und quantisieren:

    python3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned.gguf
    llama.cpp/llama-quantize gpt-oss-finetuned.gguf  gpt-oss-finetuned-Q8_0.gguf Q8_0
  3. Führe Inferenz auf dem quantisierten Modell aus:

    llama.cpp/llama-cli --model gpt-oss-finetuned-Q8_0.gguf \\
        --jinja -ngl 99 --threads -1 --ctx-size 16384 \\
        --temp 1.0 --top-p 1.0 --top-k 0 \\
         -p "The meaning to life and the universe is"

🏁 Und das war's!

Du hast gpt-oss mit Unsloth feinabgestimmt. Wir arbeiten derzeit an RL- und GRPO-Implementierungen sowie an verbessertem Speichern und Ausführen von Modellen, also bleib dran.

Wie immer kannst du dich gerne an unseren Discord oder Reddit wenden, wenn du Hilfe brauchst.

❓FAQ (Häufig gestellte Fragen)

1. Kann ich mein Modell exportieren, um es später in Hugging Face, llama.cpp GGUF oder vLLM zu verwenden?

Ja, du kannst jetzt dein feinabgestimmtes gpt-oss speichern/exportieren mit Unsloths neuem Update!

2. Kann ich mit gpt-oss ein fp4- oder MXFP4-Training durchführen?

Nein, derzeit unterstützt kein Framework fp4- oder MXFP4-Training. Unsloth ist jedoch das einzige Framework, das QLoRA-4-Bit-Feinabstimmung für das Modell unterstützt und damit mehr als 4x weniger VRAM-Verbrauch ermöglicht.

3. Kann ich mein Modell nach dem Training in das MXFP4-Format exportieren?

Nein, derzeit unterstützt keine Bibliothek oder kein Framework dies.

4. Kann ich mit gpt-oss Reinforcement Learning (RL) oder GRPO durchführen?

Ja! Unsloth unterstützt jetzt RL für gpt-oss mit GRPO/GSPO. Wir haben es in einem kostenlosen Kaggle-Notebook zum Laufen gebracht und die schnellste Inferenz für RL erreicht. Lesen Sie hier mehr


Danksagungen: Ein riesiges Dankeschön an Eyera für den Beitrag zu diesem Leitfaden!

Zuletzt aktualisiert

War das hilfreich?