> 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/modeles/tutorials/deepseek-r1-how-to-run-locally.md).

# DeepSeek-R1 : comment l'exécuter localement

Un guide pour exécuter nos quants dynamiques 1,58 bit pour DeepSeek-R1 en utilisant llama.cpp.

{% hint style="success" %}
Veuillez consulter <https://docs.unsloth.ai/basics/deepseek-r1-0528-how-to-run-locally> pour une version mise à jour de DeepSeek R1-0528 (version du 28 mai 2025)
{% endhint %}

## Utilisation de llama.cpp (recommandée)

1. N’oubliez pas les `<｜User｜>` et `<｜Assistant｜>` jetons ! – Ou utilisez un formateur de modèle de discussion
2. Obtenez la dernière version `llama.cpp` à l’adresse : [github.com/ggml-org/llama.cpp](https://github.com/ggml-org/llama.cpp). Vous pouvez également suivre les instructions de compilation ci-dessous. **Pour les appareils Apple Mac / Metal**, définissez `-DGGML_CUDA=OFF` puis continuez comme d'habitude - la prise en charge de Metal est activée par défaut.

```bash
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=ON -DGGML_CUDA=ON -DLLAMA_CURL=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-quantize llama-cli llama-gguf-split
cp llama.cpp/build/bin/llama-* llama.cpp
```

3. Il est préférable d’utiliser `--min-p 0.05` pour contrer les prédictions de jetons très rares ; j’ai constaté que cela fonctionne particulièrement bien pour le modèle 1,58 bit.
4. Téléchargez le modèle via :

```python
# pip install huggingface_hub hf_transfer
# import os # Facultatif pour un téléchargement plus rapide
# os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"

from huggingface_hub import snapshot_download
snapshot_download(
  repo_id = "unsloth/DeepSeek-R1-GGUF",
  local_dir = "DeepSeek-R1-GGUF",
  allow_patterns = ["*UD-IQ1_S*"], # Sélectionnez le type de quantification UD-IQ1_S pour 1,58 bit
)
```

6. Exemple avec un cache quantifié Q4\_0 K **Remarque : -no-cnv désactive le mode de conversation automatique**

```bash
./llama.cpp/llama-cli \
    --model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
    --cache-type-k q4_0 \
    -no-cnv --prio 2 \
    --temp 0.6 \
    --ctx-size 8192 \
    --seed 3407 \
    --prompt "<｜User｜>Combien font 1+1 ?<｜Assistant｜>"
```

Exemple de sortie :

```txt
 <think>
 D’accord, je dois donc déterminer combien font 1 plus 1. Hum, par où commencer ? Je me souviens de l’école que l’addition de nombres est assez élémentaire, mais je veux m’assurer de bien la comprendre.
 Réfléchissons : 1 plus 1. J’ai donc un objet et j’en ajoute un autre. Par exemple, une pomme plus une autre pomme. Si j’ai une pomme et que quelqu’un m’en donne une autre, j’ai maintenant deux pommes. Donc, 1 plus 1 devrait faire 2. C’est logique.
 Attendez, mais les mathématiques peuvent parfois être complexes. Cela pourrait-il être autre chose ? Peut-être dans un système numérique différent ? Mais je pense que la question est simple, avec des nombres ordinaires, et non du binaire, de l’hexadécimal ou autre chose.
 Je me souviens aussi qu’en arithmétique, l’addition consiste à combiner des quantités. Donc, si vous avez deux quantités de 1, les combiner vous donne un total de 2. Oui, cela semble correct.
 Y a-t-il un scénario dans lequel 1 plus 1 ne ferait pas 2 ? Je n’en vois aucun...
```

4. Si vous avez un GPU (une RTX 4090 par exemple) avec 24 Go, vous pouvez décharger plusieurs couches sur le GPU pour un traitement plus rapide. Si vous avez plusieurs GPU, vous pourrez probablement décharger davantage de couches.

```bash
./llama.cpp/llama-cli \
    --model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
    --cache-type-k q4_0 \
    -no-cnv --prio 2 \
    --n-gpu-layers 7 \
    --temp 0.6 \
    --ctx-size 8192 \
    --seed 3407 \
    --prompt "<｜User｜>Crée un jeu Flappy Bird en Python.<｜Assistant｜>"
```

5. Pour tester notre exemple Flappy Bird comme mentionné dans notre article de blog ici : <https://unsloth.ai/blog/deepseekr1-dynamic>, nous pouvons produire le 2e exemple ci-dessous en utilisant notre quantification dynamique de 1,58 bit :

<table data-column-title-hidden data-view="cards" data-full-width="false"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td>DeepSeek R1 original</td><td></td><td></td><td><a href="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-3c484081174c631653c8c7bf7e7674f05255f740%2FInShot_20250127_043158375_H8Uu6tyJXYAFwUEIu04Am.gif?alt=media">InShot_20250127_043158375_H8Uu6tyJXYAFwUEIu04Am.gif</a></td></tr><tr><td>Quantification dynamique 1,58 bit</td><td></td><td></td><td><a href="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-c41eac0fea9362017e94123ee8f9793df21b8e97%2FInShot_20250127_042648160_lrtL8-eRhl4qtLaUDSU87.gif?alt=media">InShot_20250127_042648160_lrtL8-eRhl4qtLaUDSU87.gif</a></td></tr></tbody></table>

L’invite utilisée est la suivante :

{% code overflow="wrap" %}

```
<｜User｜>Crée un jeu Flappy Bird en Python. Tu dois inclure les éléments suivants :
1. Tu dois utiliser pygame.
2. La couleur d’arrière-plan doit être choisie aléatoirement et être une teinte claire. Commence par une couleur bleu clair.
3. Appuyer plusieurs fois sur ESPACE accélérera l’oiseau.
4. La forme de l’oiseau doit être choisie aléatoirement parmi un carré, un cercle ou un triangle. La couleur doit être choisie aléatoirement parmi des couleurs foncées.
5. Place en bas un sol coloré en brun foncé ou en jaune, choisi aléatoirement.
6. Affiche un score en haut à droite. Incrémente-le si tu passes les tuyaux sans les heurter.
7. Crée des tuyaux espacés aléatoirement avec suffisamment d’espace. Colore-les aléatoirement en vert foncé, brun clair ou dans une teinte de gris foncé.
8. Lorsque tu perds, affiche le meilleur score. Le texte doit se trouver à l’intérieur de l’écran. Appuyer sur q ou Échap quittera le jeu. Pour redémarrer, appuie à nouveau sur ESPACE.
Le jeu final doit se trouver dans une section markdown en Python. Vérifie ton code pour détecter les erreurs et corrige-les avant la section markdown finale.<｜Assistant｜>
```

{% endcode %}

Pour appeler llama.cpp en utilisant cet exemple, nous faisons :

```bash
./llama.cpp/llama-cli \
    --model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
    --cache-type-k q4_0 \
    -no-cnv --prio 2 \
    --n-gpu-layers 7 \
    --temp 0.6 \
    --ctx-size 8192 \
    --seed 3407 \
    --prompt "<｜User｜>Crée un jeu Flappy Bird en Python. Tu dois inclure les éléments suivants :\n1. Tu dois utiliser pygame.\n2. La couleur d’arrière-plan doit être choisie aléatoirement et être une teinte claire. Commence par une couleur bleu clair.\n3. Appuyer plusieurs fois sur ESPACE accélérera l’oiseau.\n4. La forme de l’oiseau doit être choisie aléatoirement parmi un carré, un cercle ou un triangle. La couleur doit être choisie aléatoirement parmi des couleurs foncées.\n5. Place en bas un sol coloré en brun foncé ou en jaune, choisi aléatoirement.\n6. Affiche un score en haut à droite. Incrémente-le si tu passes les tuyaux sans les heurter.\n7. Crée des tuyaux espacés aléatoirement avec suffisamment d’espace. Colore-les aléatoirement en vert foncé, brun clair ou dans une teinte de gris foncé.\n8. Lorsque tu perds, affiche le meilleur score. Le texte doit se trouver à l’intérieur de l’écran. Appuyer sur q ou Échap quittera le jeu. Pour redémarrer, appuie à nouveau sur ESPACE.\nLe jeu final doit se trouver dans une section markdown en Python. Vérifie ton code pour détecter les erreurs et corrige-les avant la section markdown finale.<｜Assistant｜>"
```

5. De plus, si vous souhaitez fusionner les poids pour les utiliser dans Ollama par exemple, utilisez ce script :

```bash
./llama.cpp/llama-gguf-split --merge \
    DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
    merged_file.gguf
```

6. DeepSeek R1 possède 61 couches. Par exemple, avec un GPU de 24 Go ou de 80 Go, vous pouvez vous attendre à décharger le nombre de couches suivant après arrondi à l’inférieur (réduisez de 1 en cas de manque de mémoire) :

| Quantification | Taille du fichier | GPU de 24 Go | GPU de 80 Go | 2 GPU de 80 Go        |
| -------------- | ----------------- | ------------ | ------------ | --------------------- |
| 1,58 bit       | 131 Go            | 7            | 33           | Toutes les 61 couches |
| 1,73 bit       | 158 Go            | 5            | 26           | 57                    |
| 2,22 bit       | 183 Go            | 4            | 22           | 49                    |
| 2,51 bit       | 212 Go            | 2            | 19           | 32                    |

### Exécution sur Mac / appareils Apple

Pour les appareils Apple Metal, faites attention à --n-gpu-layers. Si vous constatez que la machine manque de mémoire, réduisez cette valeur. Pour une machine avec 128 Go de mémoire unifiée, vous devriez pouvoir décharger environ 59 couches.

```bash
./llama.cpp/llama-cli \
    --model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
    --cache-type-k q4_0 \
    --prio 2 \
    --temp 0.6 \
    --ctx-size 8192 \
    --seed 3407 \
    --n-gpu-layers 59 \
    -no-cnv \
    --prompt "<｜User｜>Crée un jeu Flappy Bird en Python.<｜Assistant｜>"
```

### Exécuter dans Ollama/Open WebUI

Open WebUI a créé un tutoriel pas à pas sur l’exécution de R1 ici : <https://docs.openwebui.com/tutorials/integrations/llm-providers/deepseekr1-dynamic>

\
Si vous souhaitez utiliser Ollama pour l’inférence sur des GGUF, vous devez d’abord fusionner les 3 fichiers GGUF fractionnés en 1, comme dans le code ci-dessous. Vous devrez ensuite exécuter le modèle localement.

```bash
./llama.cpp/llama-gguf-split --merge \
  DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
	merged_file.gguf
```

## Modèle de discussion DeepSeek

Toutes les versions distillées et le modèle R1 principal de 671B utilisent le même modèle de discussion :

`<｜begin▁of▁sentence｜><｜User｜>Combien font 1+1 ?<｜Assistant｜>Cela fait 2.<｜end▁of▁sentence｜><｜User｜>Explique davantage !<｜Assistant｜>`

Un BOS est ajouté de force, et un EOS sépare chaque interaction. Pour contrer les doubles jetons BOS pendant l’inférence, vous ne devez appeler que *tokenizer.encode(..., add\_special\_tokens = False)* car le modèle de discussion ajoute aussi automatiquement un jeton BOS.\
Pour l’inférence llama.cpp / GGUF, vous devez ignorer le BOS car il sera ajouté automatiquement.

`<｜User｜>Combien font 1+1 ?<｜Assistant｜>`

Les jetons \<think> et \</think> possèdent leurs propres jetons désignés. Pour les versions distillées de Qwen et Llama, certains jetons sont remappés ; Qwen, par exemple, n’avait pas de jeton BOS, donc <|object\_ref\_start|> a dû être utilisé à la place.\
\
**Mappages des ID de jetons :**

| Jeton                     | R1     | Qwen distillé | Llama distillé |
| ------------------------- | ------ | ------------- | -------------- |
| \<think>                  | 128798 | 151648        | 128013         |
| \</think>                 | 128799 | 151649        | 128014         |
| <\|begin\_of\_sentence\|> | 0      | 151646        | 128000         |
| <\|end\_of\_sentence\|>   | 1      | 151643        | 128001         |
| <\|User\|>                | 128803 | 151644        | 128011         |
| <\|Assistant\|>           | 128804 | 151645        | 128012         |
| Jeton de remplissage      | 2      | 151654        | 128004         |

Jetons d’origine dans les modèles :

| Jeton                 | Qwen 2.5 32B Base        | Llama 3.3 70B Instruct            |
| --------------------- | ------------------------ | --------------------------------- |
| \<think>              | <\|box\_start\|>         | <\|reserved\_special\_token\_5\|> |
| \</think>             | <\|box\_end\|>           | <\|reserved\_special\_token\_6\|> |
| <｜begin▁of▁sentence｜> | <\|object\_ref\_start\|> | <\|begin\_of\_text\|>             |
| <｜end▁of▁sentence｜>   | <\|endoftext\|>          | <\|end\_of\_text\|>               |
| <｜User｜>              | <\|im\_start\|>          | <\|reserved\_special\_token\_3\|> |
| <｜Assistant｜>         | <\|im\_end\|>            | <\|reserved\_special\_token\_4\|> |
| Jeton de remplissage  | <\|vision\_pad\|>        | <\|finetune\_right\_pad\_id\|>    |

Toutes les versions distillées et la version R1 originale semblent avoir accidentellement attribué le jeton de remplissage à <｜end▁of▁sentence｜>, ce qui n’est généralement pas une bonne idée, surtout si vous souhaitez effectuer un réglage fin supplémentaire sur ces modèles de raisonnement. Cela entraînera des générations infinies sans fin, puisque la plupart des frameworks masqueront le jeton EOS en -100.\
\
Nous avons corrigé toutes les versions distillées et la version R1 originale avec le bon jeton de remplissage (Qwen utilise <|vision\_pad|>, Llama utilise <|finetune\_right\_pad\_id|>, et R1 utilise <｜▁pad▁｜> ou notre propre jeton ajouté <｜PAD▁TOKEN｜>.

## Tableau GGUF R1

<table data-full-width="true"><thead><tr><th>Bits MoE</th><th>Type</th><th>Taille sur disque</th><th>Précision</th><th>Lien</th><th>Détails</th></tr></thead><tbody><tr><td>1,58 bit</td><td>UD-IQ1_S</td><td><strong>131 Go</strong></td><td>Correct</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ1_S">Lien</a></td><td>MoE entièrement en 1,56 bit. <code>down_proj</code> dans un mélange MoE de 2,06/1,56 bit</td></tr><tr><td>1,73 bit</td><td>UD-IQ1_M</td><td><strong>158 Go</strong></td><td>Bon</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ1_M">Lien</a></td><td>MoE entièrement en 1,56 bit. <code>down_proj</code> dans MoE laissé à 2,06 bit</td></tr><tr><td>2,22 bit</td><td>UD-IQ2_XXS</td><td><strong>183 Go</strong></td><td>Meilleur</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ2_XXS">Lien</a></td><td>MoE entièrement en 2,06 bit. <code>down_proj</code> dans un mélange MoE de 2,5/2,06 bit</td></tr><tr><td>2,51 bit</td><td>UD-Q2_K_XL</td><td><strong>212 Go</strong></td><td>Excellent</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-Q2_K_XL">Lien</a></td><td>MoE entièrement en 2,5 bit. <code>down_proj</code> dans un mélange MoE de 3,5/2,5 bit</td></tr></tbody></table>


---

# 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://unsloth.ai/docs/fr/modeles/tutorials/deepseek-r1-how-to-run-locally.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
