Tutorial: Wie man gpt-oss finetunt

Lerne Schritt für Schritt, wie man OpenAI gpt-oss lokal mit Unsloth trainiert.

In diesem Leitfaden mit Screenshots erfahren Sie, wie Sie Ihr eigenes angepasstes gpt-oss-Modell feinabstimmen, entweder lokal auf Ihrem Rechner mit Unslotharrow-up-right oder kostenlos mit Google Colab. Wir führen Sie durch den gesamten Prozess, von der Einrichtung bis zum Ausführen und Speichern Ihres trainierten Modells.

circle-check

Schnellstart: Feinabstimmung von gpt-oss-20b kostenlos mit unserem: Colab-Notebookarrow-up-right

Unsloth gpt-oss Feinabstimmung erreicht im Vergleich zu allen anderen FA2-Implementierungen ein 1,5× schnelleres Training, eine Reduktion des VRAM-Verbrauchs um 70% und 10× längere Kontextlängen – ohne Genauigkeitsverlust.

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

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

Lokale AnleitungColab-Anleitung

🌐 Colab gpt-oss Feinabstimmung

Dieser Abschnitt behandelt die Feinabstimmung von gpt-oss mithilfe unseres Google Colab Notebooks. Sie können das gpt-oss-Notebook auch in Ihren bevorzugten Code-Editor speichern und unsere lokale gpt-oss-Anleitung.

1

Unsloth installieren (in Colab)

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

2

Konfiguration von gpt-oss und Reasoning Effort

Wir laden gpt-oss-20b mit Unsloth's linearisierten Version (da keine andere Version funktionieren wird).

Konfigurieren Sie 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 Sie dies auf Falsch setzen, benötigen Sie mindestens 43GB VRAM). Sie MÜSSEN auch model_name = "unsloth/gpt-oss-20b-BF16"

Sie sollten eine Ausgabe ähnlich dem untenstehenden Beispiel sehen. Hinweis: Wir ändern explizit den dtype zu float32 um ein korrektes Trainingsverhalten sicherzustellen.

3

Hyperparameter der Feinabstimmung (LoRA)

Jetzt ist es an der Zeit, Ihre Trainingshyperparameter anzupassen. Für einen tieferen Einblick, wie, wann und was zu tun ist, sehen Sie sich unseren ausführlichen Hyperparameter-Leitfaden.

circle-info

Um Overfittingzu vermeiden, überwachen Sie Ihren Trainingsverlust und vermeiden Sie es, diese Werte zu hoch zu setzen.

Dieser Schritt fügt LoRA-Adapter für 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. Sie können diesen Schritt überspringen, aber Sie müssen das Modell später ausführen, sobald Sie die Feinabstimmung abgeschlossen haben.

5

Datenvorbereitung

Für dieses Beispiel verwenden wir das HuggingFaceH4/Multilingual-Thinkingarrow-up-right. Dieser Datensatz enthält Chain-of-Thought-Reasoning-Beispiele, die aus Nutzerfragen abgeleitet und aus dem Englischen in vier zusätzliche Sprachen übersetzt wurden.

Dies ist derselbe Datensatz, der im Feinabstimmungs-Cookbook von OpenAI referenziert wird.

Das Ziel der Verwendung eines multilingualen Datensatzes ist es, dem Modell zu helfen, Reasoning-Muster über mehrere Sprachen hinweg zu lernen und zu verallgemeinern.

gpt-oss führt ein Reasoning-Effort-System ein, das steuert, wie viel Reasoning das Modell durchführt. Standardmäßig ist der Reasoning-Effort auf niedriggesetzt, aber Sie können ihn ändern, indem Sie 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,)

Lassen Sie uns den Datensatz untersuchen, indem wir das erste Beispiel ausdrucken:

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

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

circle-info

🦥 Unsloth korrigiert die Chat-Vorlage, um sicherzustellen, dass sie korrekt ist. Siehe diesen Tweetarrow-up-right für technische Details zu unserer Vorlagenkorrektur.

Passen Sie das Prompt und die Struktur gerne an Ihren eigenen Datensatz oder Anwendungsfall an. Für weitere Hinweise siehe unseren Datensatz-Leitfaden.

6

Trainieren Sie das Modell

Wir haben Trainingshyperparameter für optimale Ergebnisse vorausgewählt. Sie können sie jedoch je nach Ihrem konkreten Anwendungsfall ändern. Siehe unseren Hyperparameter-Leitfaden.

In diesem Beispiel trainieren wir 60 Schritte, um den Prozess zu beschleunigen. Für einen vollständigen Trainingslauf setzen Sie num_train_epochs=1 und deaktivieren die Schrittbeschränkung, indem Sie max_steps=None.

Während des Trainings überwachen Sie den Loss, um sicherzustellen, dass er im Laufe der Zeit abnimmt. Dies bestätigt, dass der Trainingsprozess korrekt funktioniert.

7

Inference: Führen Sie Ihr trainiertes Modell aus

Jetzt ist es Zeit, Inferenz mit Ihrem feinabgestimmten Modell durchzuführen. Sie können die Anweisung und die Eingabe ändern, lassen Sie jedoch die Ausgabe leer.

In diesem Beispiel testen wir die Fähigkeit des Modells, auf Französisch zu schlussfolgern, indem wir eine spezifische Anweisung in das System-Prompt einfügen, entsprechend der Struktur unseres Datensatzes.

Dies sollte eine Ausgabe ähnlich der folgenden erzeugen:

8

Speichern/exportieren Sie Ihr Modell

Um Ihr feinabgestimmtes Modell zu speichern, können Sie es sowohl im bf16-Format , mit unserer On-Demand-Dequantisierung von MXFP4 Basismodellen unter Verwendung von save_method="merged_16bit"oder im nativen MXFP4 Safetensors-Format mit save_method="mxfp4" .

Der MXFP4 Das native Merge-Format bietet im Vergleich zum bf16-Formaterhebliche Leistungsverbesserungen: Es benötigt bis zu 75% weniger Festplattenspeicher, reduziert den VRAM-Verbrauch um 50%, beschleunigt das Mergen um das 5–10-fache und ermöglicht eine viel schnellere Konvertierung in das GGUF Format.

circle-check

Nach der Feinabstimmung Ihres gpt-oss-Modells können Sie es in MXFP4 Format zusammenführen mit:

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

Wenn Sie das Modell lieber zusammenführen und direkt zum Hugging Face Hub pushen möchten:

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 GitHub hierarrow-up-right. Sie können auch den unten stehenden Build-Anweisungen folgen. Ändern Sie -DGGML_CUDA=ON zu -DGGML_CUDA=OFF wenn Sie keine GPU haben oder nur CPU-Inferenz wünschen.

    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. Konvertieren Sie 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ühren Sie 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 Ihrem lokalen Gerät. Während gpt-oss-20b die Feinabstimmung bereits mit nur 14GB VRAM funktionieren kann, empfehlen wir, mindestens 16GB VRAM verfügbar zu haben, um stabile und zuverlässige Trainingsläufe zu gewährleisten.

circle-info

Wir empfehlen, unsere Colab-Elemente herunterzuladen oder in Ihr lokales Setup zu integrieren, um die Nutzung zu erleichtern. Notebooks Installieren Sie Unsloth lokal

1

Stellen Sie sicher, dass Ihr Gerät

Unsloth-kompatibel ist, und Sie können unseren detaillierten Installationsleitfaden lesen..

Sie können Unsloth auch mit unserem Docker-Imagearrow-up-right.

installieren. Beachten Sie, dass pip install unsloth

für dieses Setup nicht funktionieren wird, da wir die neuesten Versionen von PyTorch, Triton und zugehörigen Paketen benötigen. Installieren Sie Unsloth mit diesem spezifischen Befehl:
!pip install --upgrade -qqq uv
# Wir installieren das neueste Torch, Triton, OpenAI's Triton-Kernels, Transformers und Unsloth!
try: import numpy; install_numpy = f"numpy=={numpy.__version__}"
!uv pip install -qqq \
    except: install_numpy = "numpy"
    "unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo" \
    "unsloth[base] @ git+https://github.com/unslothai/unsloth" \
    "torch>=2.8.0" "triton>=3.4.0" {install_numpy} \
    torchvision bitsandbytes \
    git+https://github.com/triton-lang/triton.git@05b2c186c1b6c9a08375389d5efe9cb4c401c075#subdirectory=python/triton_kernels
2

Konfiguration von gpt-oss und Reasoning Effort

Wir laden gpt-oss-20b mit Unsloth's linearisierten Version git+https://github.com/huggingface/transformers \

  • 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 Sie dies auf Falsch setzen, benötigen Sie mindestens 43GB VRAM). Sie MÜSSEN auch model_name = "unsloth/gpt-oss-20b-BF16"

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

(da keine andere Version für QLoRA-Feinabstimmung funktionieren wird). Konfigurieren Sie die folgenden Parameter:
# 4bit vorquantisierte Modelle, die wir für 4× schnelleren Download + keine OOMs unterstützen.
    fourbit_models = [
    "unsloth/gpt-oss-20b-unsloth-bnb-4bit", # 20B-Modell mit bitsandbytes 4bit-Quantisierung
    "unsloth/gpt-oss-120b-unsloth-bnb-4bit",
    "unsloth/gpt-oss-20b", # 20B-Modell im MXFP4-Format
"unsloth/gpt-oss-120b",

model, tokenizer = FastLanguageModel.from_pretrained(
    ] # Mehr Modelle unter https://huggingface.co/unsloth
    model_name = "unsloth/gpt-oss-20b",
    dtype = dtype, # None für automatische Erkennung
    max_seq_length = max_seq_length, # Wählen Sie beliebig für lange Kontexte!
    load_in_4bit = True,  # 4-Bit-Quantisierung zur Reduzierung des Speichers
    full_finetuning = False, # [NEU!] Wir haben jetzt Full-Finetuning!
)

Sie sollten eine Ausgabe ähnlich dem untenstehenden Beispiel sehen. Hinweis: Wir ändern explizit den dtype zu float32 um ein korrektes Trainingsverhalten sicherzustellen.

3

Hyperparameter der Feinabstimmung (LoRA)

Jetzt ist es an der Zeit, Ihre Trainingshyperparameter anzupassen. Für einen tieferen Einblick, wie, wann und was zu tun ist, sehen Sie sich unseren ausführlichen Hyperparameter-Leitfaden.

circle-info

Um Overfittingzu vermeiden, überwachen Sie Ihren Trainingsverlust und vermeiden Sie es, diese Werte zu hoch zu setzen.

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

model = FastLanguageModel.get_peft_model(
    model,
    # token = "hf_...", # verwenden Sie eins, wenn Sie gated Modelle nutzen
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 16,
    lora_dropout = 0, # Unterstützt beliebige Werte, aber = 0 ist optimiert
    bias = "none",    # Unterstützt beliebige Werte, aber = "none" ist optimiert
    r = 8, # Wählen Sie eine beliebige Zahl > 0! Vorgeschlagen: 8, 16, 32, 64, 128
    use_gradient_checkpointing = "unsloth", # True oder "unsloth" für sehr langen Kontext
    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 das HuggingFaceH4/Multilingual-Thinkingarrow-up-right. Dieser Datensatz enthält Chain-of-Thought-Reasoning-Beispiele, die aus Nutzerfragen abgeleitet und aus dem Englischen in vier zusätzliche Sprachen übersetzt wurden.

# [NEU] "unsloth" verwendet 30% weniger VRAM, ermöglicht 2× größere Batch-Größen!

Dies ist derselbe Datensatz, der im Feinabstimmungs-Cookbook von OpenAI referenziert wird. Das Ziel der Verwendung eines multilingualen Datensatzes ist es, dem Modell zu helfen, Reasoning-Muster ü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, }

from datasets import load_dataset

pass
Datensatz

gpt-oss führt ein Reasoning-Effort-System ein, das steuert, wie viel Reasoning das Modell durchführt. Standardmäßig ist der Reasoning-Effort auf niedriggesetzt, aber Sie können ihn ändern, indem Sie 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,)

Lassen Sie uns den Datensatz untersuchen, indem wir das erste Beispiel ausdrucken:

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

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

circle-info

🦥 Unsloth korrigiert die Chat-Vorlage, um sicherzustellen, dass sie korrekt ist. Siehe diesen Tweetarrow-up-right für technische Details zu unserer Vorlagenkorrektur.

Passen Sie das Prompt und die Struktur gerne an Ihren eigenen Datensatz oder Anwendungsfall an. Für weitere Hinweise siehe unseren Datensatz-Leitfaden.

5

Trainieren Sie das Modell

Wir haben Trainingshyperparameter für optimale Ergebnisse vorausgewählt. Sie können sie jedoch je nach Ihrem konkreten Anwendungsfall ändern. Siehe unseren Hyperparameter-Leitfaden.

In diesem Beispiel trainieren wir 60 Schritte, um den Prozess zu beschleunigen. Für einen vollständigen Trainingslauf setzen Sie num_train_epochs=1 und deaktivieren die Schrittbeschränkung, indem Sie max_steps=None.

dataset = load_dataset("HuggingFaceH4/Multilingual-Thinking", split="train")
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, # Set this for 1 full training run.
        from trl import SFTConfig, SFTTrainer
        num_train_epochs = 1
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "outputs",
        report_to = "none", # Use this for WandB etc
    ),
)

Während des Trainings überwachen Sie den Loss, um sicherzustellen, dass er im Laufe der Zeit abnimmt. Dies bestätigt, dass der Trainingsprozess korrekt funktioniert.

6

max_steps = 30,

Jetzt ist es Zeit, Inferenz mit Ihrem feinabgestimmten Modell durchzuführen. Sie können die Anweisung und die Eingabe ändern, lassen Sie jedoch die Ausgabe leer.

In diesem Beispiel testen wir die Fähigkeit des Modells, auf Französisch zu schlussfolgern, indem wir eine spezifische Anweisung in das System-Prompt einfügen, entsprechend der Struktur unseres Datensatzes.

Inference: Führen Sie Ihr trainiertes Modell aus
    messages = [
    {"role": "system", "content": "reasoning language: French\n\nYou are a helpful assistant that can solve mathematical problems."},
]
{"role": "user", "content": "Solve x^5 + 3x^4 - 10 = 3."},
    messages,
    inputs = tokenizer.apply_chat_template(
    add_generation_prompt = True,
    return_tensors = "pt",
    reasoning_effort = "medium",
return_dict = True,
from transformers import TextStreamer
).to(model.device)

Dies sollte eine Ausgabe ähnlich der folgenden erzeugen:

7

_ = model.generate(**inputs, max_new_tokens = 2048, streamer = TextStreamer(tokenizer))

Speichern und Exportieren Ihres Modells On-Demand-Dequantisierung von MXFP4 Um Ihr feinabgestimmtes Modell zu speichern, kann es im Safetensors-Format mit unserer neuen Basismodellen (wie gpt-oss) während des LoRA-Merge-Prozesses. Dies macht es möglich,.

circle-check

Ihr feinabgestimmtes Modell im bf16-Format zu exportieren

Nach der Feinabstimmung Ihres gpt-oss-Modells können Sie es in 16-Bit-Format zusammenführen mit:

Wenn Sie das Modell lieber zusammenführen und direkt zum Hugging Face Hub pushen möchten:

model.save_pretrained_merged(save_directory, tokenizer)

Speichern für Llama.cpp

  1. Holen Sie sich die neueste llama.cpp auf GitHub hierarrow-up-right. Sie können auch den unten stehenden Build-Anweisungen folgen. Ändern Sie -DGGML_CUDA=ON zu -DGGML_CUDA=OFF wenn Sie keine GPU haben oder nur CPU-Inferenz wünschen.

    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. model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token)

    Konvertieren und quantisieren Sie das zusammengeführte Modell:
    python3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned.gguf
  3. Führen Sie Inferenz auf dem quantisierten Modell aus:

    llama.cpp/llama-quantize gpt-oss-finetuned.gguf  gpt-oss-finetuned-Q8_0.gguf Q8_0
        --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"

llama.cpp/llama-cli --model gpt-oss-finetuned-Q8_0.gguf \

🏁 Und das war's!

Sie haben gpt-oss mit Unsloth feinabgestimmt. Wir arbeiten derzeit an RL- und GRPO-Implementierungen sowie an verbessertem Modellspeichern und Ausführen, also bleiben Sie dran. Wie immer können Sie gerne bei unseremarrow-up-right oder Discordarrow-up-right Reddit

vorbeischauen, wenn Sie Hilfe benötigen.

❓FAQ (Häufig gestellte Fragen)

1. Kann ich mein Modell später exportieren, um es in Hugging Face, llama.cpp GGUF oder vLLM zu verwenden? Ja, Sie können jetzt Ihr gpt-oss feinabgestimmtes Modell mit Unsloths neuem Update speichern/exportieren!

2. Kann ich fp4- oder MXFP4-Training mit gpt-oss 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 dadurch mehr als 4× 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 Reinforcement Learning (RL) oder GRPO mit gpt-oss 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 erzielt. Lesen Sie hier mehr


Danksagungen: Ein großer Dank an Eyeraarrow-up-right für den Beitrag zu diesem Leitfaden!

Zuletzt aktualisiert

War das hilfreich?