# 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 DeepSeek R1-0528 mise à jour (version du 28 mai 2025)
{% endhint %}

## En utilisant llama.cpp (recommandé)

1. N'oubliez pas les `<｜User｜>` et `<｜Assistant｜>` tokens ! - Ou utilisez un formateur de modèle de chat
2. Obtenez la dernière `llama.cpp` sur : [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 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 déterminer combien font 1 plus 1. Hmm, par où commencer ? Je me souviens qu'à l'école, additionner des nombres est assez basique, mais je veux m'assurer de bien le comprendre.
 Voyons voir, 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'en ai maintenant deux. Donc, 1 plus 1 devrait faire 2. Ça a du sens.
 Attendez, mais parfois les mathématiques peuvent être piégeuses. Est-ce que cela pourrait être autre chose ? Par exemple, dans un autre système de numération peut-être ? Mais je pense que la question est simple, utilisant des nombres ordinaires, pas du binaire ni de l'hexadécimal ni quoi que ce soit de ce genre.
 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 juste.
 Existe-t-il un scénario où 1 plus 1 ne ferait pas 2 ? Je ne vois rien...
```

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 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｜>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 comme 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="/files/7ee80db46f0c2562fa2294ef1b09a9ae012b75c7">/files/7ee80db46f0c2562fa2294ef1b09a9ae012b75c7</a></td></tr><tr><td>Quantification dynamique 1.58bit</td><td></td><td></td><td><a href="/files/76f1b85f3308d688898f9bec422114f8b14216fb">/files/76f1b85f3308d688898f9bec422114f8b14216fb</a></td></tr></tbody></table>

L'invite utilisée est la suivante :

{% code overflow="wrap" %}

```
<｜User｜>Crée un jeu Flappy Bird en Python. Vous devez inclure ces éléments :
1. Vous devez utiliser pygame.
2. La couleur de fond doit être choisie aléatoirement et être une teinte claire. Commencez avec 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 sombres.
5. Placez en bas un sol coloré en brun foncé ou en jaune, choisi aléatoirement.
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. Coloriez-les aléatoirement en vert foncé, marron clair ou 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 Échap quittera le jeu. Pour recommencer, appuyez à nouveau sur ESPACE.
Le jeu final doit être placé dans une section markdown en Python. Vérifiez votre code pour détecter 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｜>Crée un jeu Flappy Bird en Python. Vous devez inclure ces éléments :\n1. Vous devez utiliser pygame.\n2. La couleur de fond doit être choisie aléatoirement et être une teinte claire. Commencez avec 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 sombres.\n5. Placez en bas un sol coloré en brun foncé ou en jaune, choisi aléatoirement.\n6. Affichez un score en haut à droite. Incrémentez-le si vous passez les tuyaux sans les toucher.\n7. Créez des tuyaux espacés aléatoirement avec suffisamment d'espace. Coloriez-les aléatoirement en vert foncé, marron clair ou gris foncé.\n8. Lorsque vous perdez, affichez le meilleur score. Faites apparaître le texte à l'intérieur de l'écran. Appuyer sur q ou Échap quittera le jeu. Pour recommencer, appuyez à nouveau sur ESPACE.\nLe jeu final doit être placé dans une section markdown en Python. Vérifiez votre code pour détecter les erreurs et corrigez-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 a 61 couches. Par exemple, avec un GPU de 24 Go ou un GPU de 80 Go, vous pouvez vous attendre à décharger après arrondissement à l'inférieur (réduisez de 1 si cela 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 constatez que la machine manque de mémoire, réduisez-le. 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 তৈরি un tutoriel étape par étape sur la façon d'exécuter 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 séparés en 1, comme dans 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 R1 principal 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 contrer les doubles tokens BOS lors de l'inférence, vous ne devez appeler que *tokenizer.encode(..., add\_special\_tokens = False)* car le modèle de chat ajoute automatiquement aussi un token BOS.\
Pour l'inférence llama.cpp / GGUF, vous devez omettre le BOS puisqu'il l'ajoutera automatiquement.

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

Les tokens \<think> et \</think> disposent de leurs propres tokens dédiés. Pour les versions distillées de 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 des ID des tokens :**

| 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 d'origine 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 ainsi que les versions originales de R1 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 ensuite affiner davantage ces modèles de raisonnement. Cela provoquera des générations infinies sans fin, car la plupart des frameworks masqueront le token EOS en -100.\
\
Nous avons corrigé toutes les versions distillées ainsi que les versions originales de R1 avec le bon token de remplissage (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>Moyenne</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 à 1.56bit. <code>down_proj</code> dans MoE mélange de 2.06/1.56bit</td></tr><tr><td>1.73bit</td><td>UD-IQ1_M</td><td><strong>158 Go</strong></td><td>Bonne</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 à 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>Meilleure</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 à 2.06bit. <code>down_proj</code> dans MoE mélange 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>Meilleure</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 à 2.5bit. <code>down_proj</code> dans MoE mélange 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.
