# Tutorial: Trainiere dein eigenes Reasoning-Modell mit GRPO

DeepSeek entwickelte [GRPO](https://unsloth.ai/blog/grpo) (Group Relative Policy Optimization), um ihre R1-Reasoning-Modelle zu trainieren.

### Schnellstart

Diese Anweisungen gelten für unser vorgefertigtes Google Colab [Notizbücher](https://unsloth.ai/docs/de/los-gehts/unsloth-notebooks). Wenn Sie Unsloth lokal installieren, können Sie unsere Notizbücher auch in Ihren bevorzugten Code-Editor kopieren. Wir verwenden eines der folgenden Notizbücher:

| [**Qwen3.5 (4B)**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_5_\(4B\)_Vision_GRPO.ipynb) **- Vision - neu** | [**gpt-oss-20b**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-\(20B\)-GRPO.ipynb) **-** GSPO       | [Gemma 3 (4B)](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3_\(4B\)-Vision-GRPO.ipynb) - Vision GSPO          |
| ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| [**Qwen3 (4B)**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_\(4B\)-GRPO.ipynb) - Erweitert                   | [Qwen3-VL-8B](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_VL_\(8B\)-Vision-GRPO.ipynb) - Vision GSPO | [Llama 3.2 (3B)](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Advanced_Llama3_2_\(3B\)_GRPO_LoRA.ipynb) - Erweitert |

{% stepper %}
{% step %}

#### Installieren Sie Unsloth

Wenn Sie unser Colab-Notizbuch verwenden, klicken Sie **Runtime > Run all**. Wir empfehlen dringend, vorher unser [Fine-tuning Guide](https://unsloth.ai/docs/de/los-gehts/fine-tuning-llms-guide) durchzulesen, bevor Sie beginnen.

Wenn Sie lokal installieren, stellen Sie sicher, dass Sie die richtigen [Abhängigkeiten](https://unsloth.ai/docs/de/los-gehts/fine-tuning-for-beginners/unsloth-requirements) haben und verwenden `pip install unsloth` unter Linux oder folgen Sie unserer [Windows-Installation ](https://unsloth.ai/docs/de/los-gehts/install/windows-installation)Anleitung.

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-313fa39c229225ae9d39b7c7a0d05c9005ddb94c%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Erfahren Sie mehr über GRPO & Belohnungsfunktionen

Bevor wir beginnen, wird empfohlen, mehr über GRPO, Belohnungsfunktionen und deren Funktionsweise zu erfahren. Lesen Sie mehr darüber einschließlich [Tipps & Tricks](https://unsloth.ai/docs/de/los-gehts/reinforcement-learning-rl-guide/..#basics-tips)[ hier](https://unsloth.ai/docs/de/los-gehts/reinforcement-learning-rl-guide/..#basics-tips).

Sie benötigen außerdem ausreichend VRAM. Im Allgemeinen gilt: Modellparameter = Menge an VRAM, die Sie benötigen. In Colab verwenden wir ihre kostenlosen 16GB-VRAM-GPUs, mit denen jedes Modell bis zu 16B Parametern trainiert werden kann.
{% endstep %}

{% step %}

#### Gewünschte Einstellungen konfigurieren

Wir haben bereits optimale Voreinstellungen für die besten Ergebnisse für Sie ausgewählt, und Sie können das Modell auf eines der in unseren [unterstützten Modelle](https://unsloth.ai/docs/de/los-gehts/unsloth-model-catalog)aufgelisteten Modelle ändern. Wenn Sie Anfänger sind, empfehlen wir nicht, andere Einstellungen zu ändern.

{% hint style="success" %}
Für **erweiterte GRPO** Dokumentation zu Batching, Generierung und Trainingsparametern, [lesen Sie unseren Leitfaden!](https://unsloth.ai/docs/de/los-gehts/reinforcement-learning-rl-guide/advanced-rl-documentation)
{% endhint %}

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-b1e9fac448706ac87dff7e7eff1298655dda456e%2Fimage.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Datenvorbereitung

Wir haben OpenAIs [GSM8K](https://huggingface.co/datasets/openai/gsm8k) Datensatz vorausgewählt, der Grundschul-Mathematikaufgaben enthält, aber Sie können ihn durch Ihren eigenen oder jeden öffentlichen Datensatz auf Hugging Face ersetzen. Mehr über [Datensätze hier](https://unsloth.ai/docs/de/los-gehts/fine-tuning-llms-guide/datasets-guide).

Ihr Datensatz sollte weiterhin mindestens 2 Spalten für Fragen- und Antwortpaare enthalten. Die Antwort darf jedoch nicht die Begründung offenlegen, wie sie die Antwort aus der Frage abgeleitet hat. Siehe unten ein Beispiel:

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-14a1ee796547f725abbd1097f2b0f9e4e6cc5976%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Wir strukturieren die Daten so, dass das Modell dazu angeregt wird, seine Begründung darzulegen, bevor es eine Antwort liefert. Zuerst legen wir ein klares Format für Aufforderungen und Antworten fest.

```
# Definieren Sie den System-Prompt, der das Modell anweist, ein bestimmtes Format zu verwenden
SYSTEM_PROMPT = """
Antworten Sie im folgenden Format:
<reasoning>
...
</reasoning>
<answer>
...
</answer>
"""

XML_COT_FORMAT = """\
<reasoning>
{reasoning}
</reasoning>
<answer>
{answer}
</answer>
"""
```

Nun, zur Vorbereitung des Datensatzes:

```
import re
from datasets import load_dataset, Dataset


# Hilfsfunktionen zum Extrahieren von Antworten aus verschiedenen Formaten
def extract_xml_answer(text: str) -> str:
    answer = text.split("<answer>")[-1]
    answer = answer.split("</answer>")[0]
    return answer.strip()


def extract_hash_answer(text: str) -> str | None:
    if "####" not in text:
        return None
    return text.split("####")[1].strip()


# Funktion zur Vorbereitung des GSM8K-Datensatzes
def get_gsm8k_questions(split="train") -> Dataset:
    data = load_dataset("openai/gsm8k", "main")[split]
    data = data.map(
        lambda x: {
            "prompt": [
                {"role": "system", "content": SYSTEM_PROMPT},
                {"role": "user", "content": x["question"]},
            ],
            "answer": extract_hash_answer(x["answer"]),
        }
    )
    return data


dataset = get_gsm8k_questions()
```

Der Datensatz wird vorbereitet, indem die Antworten extrahiert und als strukturierte Strings formatiert werden.
{% endstep %}

{% step %}

#### Belohnungsfunktionen/Verifizierer

[Belohnungsfunktionen/Verifizierer](https://unsloth.ai/docs/de/los-gehts/reinforcement-learning-rl-guide/..#reward-functions-verifier) teilt uns mit, ob das Modell gut arbeitet oder nicht, basierend auf dem von Ihnen bereitgestellten Datensatz. Jeder Generierungslauf wird danach bewertet, wie er im Vergleich zum Durchschnitt der übrigen Generierungen abschneidet. Sie können eigene Belohnungsfunktionen erstellen; wir haben sie jedoch bereits für Sie mit [Will's GSM8K](https://unsloth.ai/docs/de/los-gehts/reinforcement-learning-rl-guide/..#gsm8k-reward-functions) Belohnungsfunktionen vorausgewählt. Damit haben wir 5 verschiedene Möglichkeiten, wie wir jede Generierung bewerten können.

Sie können Ihre Generierungen in ein LLM wie ChatGPT 4o oder Llama 3.1 (8B) einspeisen und eine Belohnungsfunktion sowie einen Verifizierer entwerfen, um sie zu bewerten. Zum Beispiel: Geben Sie Ihre Generierungen an ein LLM Ihrer Wahl und setzen Sie eine Regel: "Wenn die Antwort zu robotic klingt, ziehe 3 Punkte ab." Dies hilft, Ausgaben anhand von Qualitätskriterien zu verfeinern. **Siehe Beispiele** wie sie aussehen können [hier](https://unsloth.ai/docs/de/los-gehts/reinforcement-learning-rl-guide/..#reward-function-examples).

**Beispiel für eine Belohnungsfunktion für eine E-Mail-Automatisierungsaufgabe:**

* **Frage:** Eingehende E-Mail
* **Antwort:** Ausgehende E-Mail
* **Belohnungsfunktionen:**
  * Wenn die Antwort ein erforderliches Schlüsselwort enthält → **+1**
  * Wenn die Antwort genau mit der idealen Antwort übereinstimmt → **+1**
  * Wenn die Antwort zu lang ist → **-1**
  * Wenn der Name des Empfängers enthalten ist → **+1**
  * Wenn ein Signaturblock (Telefon, E-Mail, Adresse) vorhanden ist → **+1**

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-95cd00b6a52b8161b31a2399e25863ee0349920e%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Trainieren Sie Ihr Modell

Wir haben Hyperparameter für die besten Ergebnisse voreingestellt, Sie können sie jedoch ändern. Lesen Sie alles über [Parameter hier](https://unsloth.ai/docs/de/los-gehts/fine-tuning-llms-guide/lora-hyperparameters-guide). Für **erweiterte GRPO** Dokumentation zu Batching, Generierung und Trainingsparametern, [lesen Sie unseren Leitfaden!](https://unsloth.ai/docs/de/los-gehts/reinforcement-learning-rl-guide/advanced-rl-documentation)

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-a22d3475d925d2d858c9fcc228f0e13893eff0f9%2Fimage.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

Die **GRPOConfig** definiert wichtige Hyperparameter für das Training:

* `use_vllm`: Aktiviert schnelle Inferenz mit vLLM.
* `learning_rate`: Bestimmt die Lernrate des Modells.
* `num_generations`: Gibt die Anzahl der pro Prompt generierten Vervollständigungen an.
* `max_steps`: Legt die Gesamtanzahl der Trainingsschritte fest.

{% hint style="success" %}
**NEU!** Wir unterstützen jetzt DAPO, Dr. GRPO und die meisten anderen neuen GRPO-Techniken. Sie können mit den folgenden Argumenten in GRPOConfig spielen, um sie zu aktivieren:

```python
epsilon=0.2,
epsilon_high=0.28, # einseitig
delta=1.5 # zweiseitig

loss_type='bnpo',
# oder:
loss_type='grpo',
# oder:
loss_type='dr_grpo',
# oder:
loss_type='dapo',

mask_truncated_completions=True,
```

{% endhint %}

Sie sollten sehen, wie die Belohnung im Laufe der Zeit steigt. Wir empfehlen mindestens 300 Schritte zu trainieren, was etwa 30 Minuten dauern kann; für optimale Ergebnisse sollten Sie jedoch länger trainieren.

{% hint style="warning" %}
Wenn Ihr GRPO-Modell nicht lernt, empfehlen wir dringend die Verwendung unserer [Advanced GRPO notebooks](https://unsloth.ai/docs/de/unsloth-notebooks#grpo-reasoning-notebooks) da diese eine deutlich bessere Belohnungsfunktion haben und Sie schneller und häufiger Ergebnisse sehen sollten.
{% endhint %}

Sie werden auch Beispielantworten sehen, die zeigen, wie das Modell lernt. Manche können Schritte, XML-Tags, Versuche usw. enthalten, und die Idee ist, dass es mit dem Training immer besser wird, weil es höhere Bewertungen erhält, bis wir die gewünschten Ausgaben mit langen Begründungsketten erreichen.

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-f33d6f494605ab9ca69a0b697ed5865dd3a30b18%2Fimage.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Starten & Bewerten Sie Ihr Modell

Starten Sie Ihr Modell, indem Sie auf die Wiedergabetaste klicken. Im ersten Beispiel gibt es normalerweise keine Begründung in der Antwort, und um die Begründung zu sehen, müssen wir zuerst die LoRA-Gewichte, die wir gerade mit GRPO trainiert haben, speichern mit:

<pre><code><strong>model.save_lora("grpo_saved_lora")
</strong></code></pre>

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-1ab351622655983aeda4d9d6d217cf354cb280be%2Fimage%20(10)%20(1)%20(1).png?alt=media" alt=""><figcaption><p>Das erste Inferenzbeispiellauf hat keine Begründung. Sie müssen die LoRA laden und testen, um die Begründung sichtbar zu machen.</p></figcaption></figure>

Dann laden wir die LoRA und testen sie. Unser Reasoning-Modell ist viel besser – es ist nicht immer korrekt, da wir es nur etwa eine Stunde trainiert haben – es wird besser, wenn wir die Sequenzlänge verlängern und länger trainieren!

Sie können Ihr Modell dann in GGUF, Ollama usw. speichern, indem Sie unserer [Anleitung hier](https://unsloth.ai/docs/de/fine-tuning-llms-guide#id-7.-running--saving-the-model).

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-38fa0c97184487aaa6b259f5b23b7f27345871d8%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

folgen.
{% endstep %}

{% step %}

#### Wenn Sie immer noch keine Begründungen erhalten, haben Sie möglicherweise zu wenige Schritte trainiert oder Ihre Belohnungsfunktion/Verifizierer war nicht optimal.

Speichern Sie Ihr Modell [hier](https://unsloth.ai/docs/de/grundlagen/inference-and-deployment)

**Wir haben mehrere Optionen zum Speichern Ihres feinabgestimmten Modells, konzentrieren uns hier jedoch auf die einfachsten und beliebtesten Ansätze, über die Sie mehr lesen können**

Speicherung in 16-Bit-Präzision

```python
Sie können das Modell mit 16-Bit-Präzision mit folgendem Befehl speichern:
# In 16-Bit-Präzision speichern
```

**model.save\_pretrained\_merged("model", tokenizer, save\_method="merged\_16bit")**

Zum Hugging Face Hub pushen `Um Ihr Modell zu teilen, pushen wir es zum Hugging Face Hub mit der` push\_to\_hub\_merged

```python
Methode. Dadurch kann das Modell in mehreren Quantisierungsformaten gespeichert werden.
# Push zum Hugging Face Hub (erfordert ein Token)
    model.push_to_hub_merged(
)
```

**"your-username/model-name", tokenizer, save\_method="merged\_16bit", token="your-token"**

Speicherung im GGUF-Format für llama.cpp **GGUF-Format**Unsloth unterstützt auch das Speichern in **llama.cpp** und **Ollama**.

```python
, wodurch es mit
    model.push_to_hub_gguf(
    "your-username/model-name",
    tokenizer,
    quantization_method=["q4_k_m", "q8_0", "q5_k_m"],
)
```

token="your-token", **llama.cpp** Sobald im GGUF-Format gespeichert, kann das Modell in leichtgewichtigen Umgebungen einfach bereitgestellt werden mit
{% endstep %}
{% endstepper %}

## oder in anderen Inferenz-Engines verwendet werden.

Video-Tutorials

{% embed url="<https://www.youtube.com/watch?v=9t-BAjzBWj8>" %}

{% columns %}
{% column width="50%" %}
{% embed url="<https://www.youtube.com/watch?t=3289s&v=bbFEYPx9Hpo>" %}
Hier sind einige Video-Tutorials von großartigen YouTubern, die wir für fantastisch halten!
{% endembed %}

{% embed url="<https://www.youtube.com/watch?v=oF0_eMhzRaQ>" %}
{% endcolumn %}

{% column width="50%" %}
{% embed url="<https://www.youtube.com/watch?v=juOh1afy-IE>" %}

{% embed url="<https://www.youtube.com/watch?v=SoPE1cUz3Hs>" %}
Gut, um zu lernen, wie man seinen Datensatz vorbereitet und Erklärungen zu Reinforcement Learning + GRPO-Grundlagen erhält
{% endembed %}
{% endcolumn %}
{% endcolumns %}
