> For the complete documentation index, see [llms.txt](https://unsloth.ai/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://unsloth.ai/docs/fr/commencer/reinforcement-learning-rl-guide/tutorial-train-your-own-reasoning-model-with-grpo.md).

# Tutoriel : entraînez votre propre modèle de raisonnement avec GRPO

DeepSeek a développé [GRPO](https://unsloth.ai/blog/grpo) (Optimisation de politique relative à un groupe) pour entraîner ses modèles de raisonnement R1.

### Démarrage rapide

Ces instructions concernent nos notebooks Google Colab préfabriqués [notebooks](/docs/fr/commencer/unsloth-notebooks.md). Si vous installez Unsloth localement, vous pouvez aussi copier nos notebooks dans votre éditeur de code préféré. Nous utiliserons l’un de ces notebooks :

| [**Qwen3.5 (4B)**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_5_\(4B\)_Vision_GRPO.ipynb) **- Vision - nouveau** | [**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) - Avancé                          | [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) - Avancé |

{% stepper %}
{% step %}

#### Installer Unsloth

Si vous utilisez notre notebook Colab, cliquez sur **Runtime > Run all**. Nous vous recommandons vivement de consulter notre [Guide de fine-tuning](/docs/fr/commencer/fine-tuning-llms-guide.md) avant de commencer.

Si vous installez localement, assurez-vous d’avoir les bons [prérequis](/docs/fr/commencer/fine-tuning-for-beginners/unsloth-requirements.md) et utilisez `pip install unsloth` sous Linux ou suivez nos [instructions d’installation sous Windows ](/docs/fr/commencer/install/windows-installation.md).

<figure><img src="/files/2676d1730ca175e042e38af76add60191f2b7494" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### En savoir plus sur GRPO et les fonctions de récompense

Avant de commencer, il est recommandé d’en apprendre davantage sur GRPO, les fonctions de récompense et leur fonctionnement. Lisez-en plus à leur sujet, y compris [astuces et conseils](/docs/fr/commencer/reinforcement-learning-rl-guide.md#basics-tips)[ ici](/docs/fr/commencer/reinforcement-learning-rl-guide.md#basics-tips).

Vous aurez également besoin de suffisamment de VRAM. En général, nombre de paramètres du modèle = quantité de VRAM nécessaire. Dans Colab, nous utilisons leurs GPU gratuits avec 16 Go de VRAM, qui peuvent entraîner n’importe quel modèle jusqu’à 16B de paramètres.
{% endstep %}

{% step %}

#### Configurer les paramètres souhaités

Nous avons déjà présélectionné pour vous des paramètres optimaux afin d’obtenir les meilleurs résultats, et vous pouvez changer le modèle pour n’importe lequel de ceux listés dans nos [modèles pris en charge](/docs/fr/commencer/unsloth-model-catalog.md). Je ne recommanderais pas de modifier les autres paramètres si vous êtes débutant.

{% hint style="success" %}
Pour **GRPO avancé** documentation sur le batching, la génération et les paramètres d’entraînement, [lisez notre guide !](/docs/fr/commencer/reinforcement-learning-rl-guide/advanced-rl-documentation.md)
{% endhint %}

<figure><img src="/files/921d075dcef37ba437e5ddfedf421542ee535438" alt="" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Préparation des données

Nous avons présélectionné le jeu de données [GSM8K](https://huggingface.co/datasets/openai/gsm8k) d’OpenAI, qui contient des problèmes de mathématiques de niveau scolaire, mais vous pourriez le remplacer par le vôtre ou par n’importe quel jeu de données public sur Hugging Face. Vous pouvez en savoir plus sur les [jeux de données ici](/docs/fr/commencer/fine-tuning-llms-guide/datasets-guide.md).

Votre jeu de données doit toujours comporter au moins 2 colonnes pour les paires question-réponse. Cependant, la réponse ne doit pas révéler le raisonnement ayant permis de déduire la réponse à partir de la question. Voir ci-dessous un exemple :

<figure><img src="/files/3c9c99e541c68f4157c9f4461173fe1afb6cc233" alt=""><figcaption></figcaption></figure>

Nous allons structurer les données pour inciter le modèle à formuler son raisonnement avant de donner une réponse. Pour commencer, nous établirons un format clair pour les prompts et les réponses.

```
# Définir le prompt système qui demande au modèle d’utiliser un format spécifique
SYSTEM_PROMPT = """
Répondez dans le format suivant :
<raisonnement>
...
</raisonnement>
<réponse>
...
</réponse>
"""

XML_COT_FORMAT = """\
<raisonnement>
{reasoning}
</raisonnement>
<réponse>
{answer}
</réponse>
"""
```

Maintenant, pour préparer le jeu de données :

```
import re
from datasets import load_dataset, Dataset


# Fonctions utilitaires pour extraire les réponses de différents formats
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()


# Fonction pour préparer le jeu de données GSM8K
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()
```

Le jeu de données est préparé en extrayant les réponses et en les formatant sous forme de chaînes structurées.
{% endstep %}

{% step %}

#### Fonctions de récompense/validateur

[Fonctions de récompense/validateurs](/docs/fr/commencer/reinforcement-learning-rl-guide.md#reward-functions-verifier) nous permet de savoir si le modèle fonctionne bien ou non selon le jeu de données que vous avez fourni. Chaque génération sera évaluée en fonction de sa performance par rapport à la moyenne des autres générations. Vous pouvez créer vos propres fonctions de récompense, mais nous les avons déjà présélectionnées pour vous avec [les fonctions de récompense GSM8K de Will](/docs/fr/commencer/reinforcement-learning-rl-guide.md#gsm8k-reward-functions) . Avec cela, nous avons 5 façons différentes de récompenser chaque génération.

Vous pouvez envoyer vos générations à un LLM comme ChatGPT 4o ou Llama 3.1 (8B) et concevoir une fonction de récompense et un validateur pour l’évaluer. Par exemple, envoyez vos générations au LLM de votre choix et définissez une règle : « Si la réponse semble trop robotique, retirez 3 points. » Cela aide à affiner les sorties selon des critères de qualité. **Voir des exemples** de leur apparence possible [ici](/docs/fr/commencer/reinforcement-learning-rl-guide.md#reward-function-examples).

**Exemple de fonction de récompense pour une tâche d’automatisation d’e-mails :**

* **Question :** E-mail entrant
* **Réponse :** E-mail sortant
* **Fonctions de récompense :**
  * Si la réponse contient un mot-clé requis → **+1**
  * Si la réponse correspond exactement à la réponse idéale → **+1**
  * Si la réponse est trop longue → **-1**
  * Si le nom du destinataire est inclus → **+1**
  * Si un bloc de signature (téléphone, e-mail, adresse) est présent → **+1**

<figure><img src="/files/c9d097f2d800ffdf975fb2c788a2d73cf053349f" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Entraîner votre modèle

Nous avons présélectionné des hyperparamètres pour obtenir les résultats les plus optimaux, mais vous pouvez les modifier. Lisez tout sur les [paramètres ici](/docs/fr/commencer/fine-tuning-llms-guide/lora-hyperparameters-guide.md). Pour **GRPO avancé** documentation sur le batching, la génération et les paramètres d’entraînement, [lisez notre guide !](/docs/fr/commencer/reinforcement-learning-rl-guide/advanced-rl-documentation.md)

<figure><img src="/files/9a827f2b3c19519f7f471347e5a3e13b8d40d849" alt="" width="563"><figcaption></figcaption></figure>

Le **GRPOConfig** définit les hyperparamètres clés de l’entraînement :

* `use_vllm`: Active l’inférence rapide via vLLM.
* `learning_rate`: Détermine la vitesse d’apprentissage du modèle.
* `num_generations`: Spécifie le nombre de complétions générées par prompt.
* `max_steps`: Définit le nombre total d’étapes d’entraînement.

{% hint style="success" %}
**NOUVEAU !** Nous prenons désormais en charge DAPO, Dr. GRPO et la plupart des autres nouvelles techniques GRPO. Vous pouvez jouer avec les arguments suivants dans GRPOConfig pour activer :

```python
epsilon=0.2,
epsilon_high=0.28, # unilatéral
delta=1.5 # bilatéral

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

mask_truncated_completions=True,
```

{% endhint %}

Vous devriez voir la récompense augmenter au fil du temps. Nous vous recommandons d’entraîner pendant au moins 300 étapes, ce qui peut prendre 30 minutes ; cependant, pour des résultats optimaux, vous devriez entraîner plus longtemps.

{% hint style="warning" %}
Si vous rencontrez des problèmes parce que votre modèle GRPO n’apprend pas, nous vous recommandons vivement d’utiliser nos [notebooks GRPO avancés](/docs/fr/commencer/unsloth-notebooks.md#grpo-reasoning-notebooks) car ils disposent d’une bien meilleure fonction de récompense et vous devriez voir des résultats beaucoup plus rapidement et plus fréquemment.
{% endhint %}

Vous verrez également des réponses d’exemple qui vous permettent de voir comment le modèle apprend. Certaines peuvent contenir des étapes, des balises XML, des tentatives, etc., et l’idée est qu’au fur et à mesure de l’entraînement, il va devenir de plus en plus performant, car il obtiendra des scores de plus en plus élevés jusqu’à ce que nous obtenions les sorties désirées avec de longues chaînes de raisonnement.

<figure><img src="/files/7e70ffbcff253dae74bd7371b48470d219bca777" alt="" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Exécuter et évaluer votre modèle

Exécutez votre modèle en cliquant sur le bouton de lecture. Dans le premier exemple, il n’y a généralement pas de raisonnement dans la réponse et, pour voir le raisonnement, nous devons d’abord enregistrer les poids LoRA que nous venons d’entraîner avec GRPO en utilisant :

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

<figure><img src="/files/27017f1a3e71bbb77523b0e75d8dd1d2489e7732" alt=""><figcaption><p>La première exécution d’inférence d’exemple ne contient pas de raisonnement. Vous devez charger la LoRA et la tester pour révéler le raisonnement.</p></figcaption></figure>

Ensuite, nous chargeons la LoRA et nous la testons. Notre modèle de raisonnement est bien meilleur - il n’est pas toujours correct, puisque nous ne l’avons entraîné qu’environ une heure - il sera meilleur si nous allongeons la séquence et l’entraînons plus longtemps !

Vous pouvez ensuite enregistrer votre modèle au format GGUF, Ollama, etc. en suivant notre [guide ici](https://unsloth.ai/docs/fr/commencer/reinforcement-learning-rl-guide/pages/9bbe6f156adffaddead7109d8475ab4a8547be46#id-7.-running--saving-the-model).

<figure><img src="/files/6b495baa74a8b8ba9422523b486118cfaa9b3bce" alt=""><figcaption></figcaption></figure>

Si vous n’obtenez toujours aucun raisonnement, il se peut que vous n’ayez pas entraîné assez d’étapes ou que votre fonction de récompense/validateur n’ait pas été optimale.
{% endstep %}

{% step %}

#### Enregistrer votre modèle

Nous avons plusieurs options pour enregistrer votre modèle affiné, mais nous nous concentrerons sur les approches les plus simples et les plus populaires, sur lesquelles vous pouvez en savoir plus [ici](/docs/fr/notions-de-base/inference-and-deployment.md)

**Enregistrement en précision 16 bits**

Vous pouvez enregistrer le modèle en précision 16 bits avec la commande suivante :

```python
# Enregistrer en précision 16 bits
model.save_pretrained_merged("model", tokenizer, save_method="merged_16bit")
```

**Publier sur Hugging Face Hub**

Pour partager votre modèle, nous allons le publier sur Hugging Face Hub en utilisant la `push_to_hub_merged` méthode. Cela permet d’enregistrer le modèle dans plusieurs formats de quantification.

```python
# Publier sur Hugging Face Hub (nécessite un jeton)
model.push_to_hub_merged(
    "your-username/model-name", tokenizer, save_method="merged_16bit", token="your-token"
)
```

**Enregistrement au format GGUF pour llama.cpp**

Unsloth prend également en charge l’enregistrement au format **GGUF**, ce qui le rend compatible avec **llama.cpp** et **Ollama**.

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

Une fois enregistré au format GGUF, le modèle peut être facilement déployé dans des environnements légers à l’aide de **llama.cpp** ou utilisé dans d’autres moteurs d’inférence.
{% endstep %}
{% endstepper %}

## Tutoriels vidéo

Voici quelques tutoriels vidéo créés par d’incroyables YouTubeurs que nous trouvons fantastiques !

{% 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>" %}
Très utile pour apprendre à préparer votre jeu de données et les explications sur les bases de l’apprentissage par renforcement + GRPO
{% 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>" %}
GRPO local sur votre propre appareil
{% endembed %}
{% endcolumn %}
{% endcolumns %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/fr/commencer/reinforcement-learning-rl-guide/tutorial-train-your-own-reasoning-model-with-grpo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
