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

{% 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é)

1. N'oubliez pas `<｜User｜>` et `<｜Assistant｜>` tokens ! - Ou utilisez un formateur de modèle de chat
2. Obtenez la dernière `llama.cpp` à : [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 - le support Metal est activé 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 tokens très rares - j'ai trouvé que cela fonctionne bien surtout pour le modèle 1,58bit.
4. Téléchargez le modèle via :

```python
# pip install huggingface_hub hf_transfer
# import os # Optionnel 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,58bit
)
```

6. Exemple avec cache quantifié Q4\_0 K **Remarque -no-cnv désactive le mode 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｜>What is 1+1?<｜Assistant｜>"
```

Exemple de sortie :

```txt
 <think>
 D'accord, je dois donc déterminer combien font 1 plus 1. Hmm, par où commencer ? Je me souviens à l'école que l'addition est assez basique, mais je veux m'assurer de bien comprendre.
 Laissez-moi réfléchir, 1 plus 1. Donc, j'ai un objet et j'en ajoute un autre. Peut-être comme 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. Cela a du sens.
 Attendez, mais parfois les maths peuvent être délicates. Cela pourrait-il être autre chose ? Par exemple dans un autre système de numération ? Mais je pense que la question est simple, en utilisant les nombres habituels, pas du binaire ou de l'hexadécimal ou autre.
 Je me rappelle aussi qu'en arithmétique, l'addition consiste à combiner des quantités. Donc, si vous avez deux quantités de 1, les combiner donne un total de 2. Oui, cela semble correct.
 Y a-t-il un scénario où 1 plus 1 ne serait pas 2 ? Je n'en vois pas...
```

4. Si vous avez un GPU (par exemple une RTX 4090) avec 24 Go, vous pouvez décharger plusieurs couches vers le GPU pour un traitement plus rapide. Si vous avez plusieurs GPU, vous pouvez 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｜>Create a Flappy Bird game in 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 1,58bit :

<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,58bit</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>

Le prompt utilisé est le suivant :

{% code overflow="wrap" %}

```
<｜User｜>Create a Flappy Bird game in Python. You must include these things:
1. Vous devez utiliser pygame.
2. La couleur de fond doit être choisie au hasard et être une teinte claire. Commencez avec un 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 carré, cercle ou triangle. La couleur doit être choisie aléatoirement et être sombre.
5. Placez en bas un morceau de terrain coloré en brun foncé ou jaune choisi au hasard.
6. Affichez un score en haut à droite. Incrémentez-le si vous passez les tuyaux sans les toucher.
7. Créez des tuyaux espacés aléatoirement avec suffisamment d'espace. Colorez-les aléatoirement en vert foncé, marron clair ou une teinte gris foncé.
8. Lorsque vous perdez, affichez le meilleur score. Faites apparaître le texte à l'intérieur de l'écran. Appuyer sur q ou Esc quittera le jeu. Redémarrer se fait en appuyant de nouveau sur ESPACE.
Le jeu final doit être dans une section markdown en Python. Vérifiez votre code pour les erreurs et corrigez-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｜>Create a Flappy Bird game in Python. You must include these things:\n1. You must use pygame.\n2. The background color should be randomly chosen and is a light shade. Start with a light blue color.\n3. Pressing SPACE multiple times will accelerate the bird.\n4. The bird's shape should be randomly chosen as a square, circle or triangle. The color should be randomly chosen as a dark color.\n5. Place on the bottom some land colored as dark brown or yellow chosen randomly.\n6. Make a score shown on the top right side. Increment if you pass pipes and don't hit them.\n7. Make randomly spaced pipes with enough space. Color them randomly as dark green or light brown or a dark gray shade.\n8. When you lose, show the best score. Make the text inside the screen. Pressing q or Esc will quit the game. Restarting is pressing SPACE again.\nThe final game should be inside a markdown section in Python. Check your code for errors and fix them before the final markdown section.<｜Assistant｜>"
```

5. De plus, si vous souhaitez fusionner les poids ensemble pour une utilisation 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 a 61 couches. Par exemple, avec un GPU de 24 Go ou 80 Go, vous pouvez vous attendre à décharger après arrondi vers le bas (réduire de 1 s'il dépasse la mémoire) :

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

### Exécution sur Mac / appareils Apple

Pour les appareils Apple Metal, faites attention à --n-gpu-layers. Si vous voyez que la machine manque de mémoire, réduisez-le. Pour une machine à mémoire unifiée de 128 Go, 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｜>Create a Flappy Bird game in Python.<｜Assistant｜>"
```

### Exécuter dans Ollama/Open WebUI

Open WebUI a réalisé un tutoriel pas à pas sur la façon d'exécuter R1 ici : [docs.openwebui.com/tutorials/integrations/deepseekr1-dynamic/](https://docs.openwebui.com/tutorials/integrations/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 le code ci-dessous. Ensuite, vous devrez 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 chat DeepSeek

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

`<｜begin▁of▁sentence｜><｜User｜>What is 1+1?<｜Assistant｜>It's 2.<｜end▁of▁sentence｜><｜User｜>Explain more!<｜Assistant｜>`

Un BOS est ajouté de force, et un EOS sépare chaque interaction. Pour éviter les doubles tokens BOS pendant l'inférence, vous ne devez appeler que *tokenizer.encode(..., add\_special\_tokens = False)* puisque le modèle de chat ajoute automatiquement un token BOS également.\
Pour l'inférence avec llama.cpp / GGUF, vous devez ignorer le BOS car il l'ajoutera automatiquement.

`<｜User｜>What is 1+1?<｜Assistant｜>`

Les tokens \<think> et \</think> obtiennent leurs propres tokens dédiés. Pour les versions distillées pour Qwen et Llama, certains tokens sont remappés, tandis que Qwen par exemple n'avait pas de token BOS, donc <|object\_ref\_start|> a dû être utilisé à la place.\
\
**Mappages d'ID du tokenizer :**

| Token                     | R1     | Distill Qwen | Distill Llama |
| ------------------------- | ------ | ------------ | ------------- |
| \<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        |
| Token de remplissage      | 2      | 151654       | 128004        |

Tokens originaux dans les modèles :

| Token                 | 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\|> |
| Token de remplissage  | <\|vision\_pad\|>        | <\|finetune\_right\_pad\_id\|>    |

Toutes les versions distillées et les versions R1 originales semblent avoir attribué par erreur le token de remplissage à <｜end▁of▁sentence｜>, ce qui n'est généralement pas une bonne idée, surtout si vous souhaitez affiner ces modèles de raisonnement. Cela provoquera des générations infinies sans fin, car la plupart des frameworks masquent le token EOS en le remplaçant par -100.\
\
Nous avons corrigé toutes les versions distillées et les versions R1 originales avec le token de remplissage correct (Qwen utilise <|vision\_pad|>, Llama utilise <|finetune\_right\_pad\_id|>, et R1 utilise <｜▁pad▁｜> ou notre propre <｜PAD▁TOKEN｜> ajouté).

## 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,58bit</td><td>UD-IQ1_S</td><td><strong>131 Go</strong></td><td>Moyen</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ1_S">Lien</a></td><td>MoE tout en 1,56bit. <code>down_proj</code> dans le mélange MoE de 2,06/1,56bit</td></tr><tr><td>1,73bit</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 tout en 1,56bit. <code>down_proj</code> dans MoE laissé à 2,06bit</td></tr><tr><td>2,22bit</td><td>UD-IQ2_XXS</td><td><strong>183 Go</strong></td><td>Mieux</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ2_XXS">Lien</a></td><td>MoE tout en 2,06bit. <code>down_proj</code> dans le mélange MoE de 2,5/2,06bit</td></tr><tr><td>2,51bit</td><td>UD-Q2_K_XL</td><td><strong>212 Go</strong></td><td>Meilleur</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-Q2_K_XL">Lien</a></td><td>MoE tout en 2,5bit. <code>down_proj</code> dans le mélange MoE de 3,5/2,5bit</td></tr></tbody></table>


---

# Agent Instructions: 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/modeles/tutorials/deepseek-r1-how-to-run-locally.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.
