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.
🌐 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.
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.


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 = 1024Empfohlen für schnelle Tests und erste Experimente.
load_in_4bit = TrueVerwenden Sie
Falschfür LoRA-Training (Hinweis: Wenn du dies aufFalschsetzt, benötigst du mindestens 43 GB VRAM). Du MUSS auchmodel_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.

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.
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.

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|> .
Passe den Prompt und die Struktur gerne an deinen eigenen Datensatz oder Anwendungsfall an. Für weitere Hinweise siehe unseren Datensatzleitfaden.
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.

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:

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
Holen Sie sich die neueste
llama.cppauf hier auf GitHub. Sie können auch die folgenden Build-Anweisungen befolgen. Ändern Sie-DGGML_CUDA=ONzu-DGGML_CUDA=OFFwenn 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.cppKonvertiere das MXFP4 zusammengeführte Modell:
python3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned-mxfp4.ggufFü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.
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_kernelsgpt-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 = 2048Empfohlen für schnelle Tests und erste Experimente.
load_in_4bit = TrueVerwenden Sie
Falschfür LoRA-Training (Hinweis: Wenn du dies aufFalschsetzt, benötigst du mindestens 43 GB VRAM). Du MUSS auchmodel_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.
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.
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
)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")
Datensatzgpt-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|> .
Passe den Prompt und die Struktur gerne an deinen eigenen Datensatz oder Anwendungsfall an. Für weitere Hinweise siehe unseren Datensatzleitfaden.
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.

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:

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
Holen Sie sich die neueste
llama.cppauf hier auf GitHub. Sie können auch die folgenden Build-Anweisungen befolgen. Ändern Sie-DGGML_CUDA=ONzu-DGGML_CUDA=OFFwenn 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.cpDas 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_0Fü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?


