For the complete documentation index, see llms.txt. This page is also available as Markdown.

🐋DeepSeek-R1 : comment exécuter localement

Un guide sur la façon d'exécuter nos quantifications dynamiques 1,58 bit pour DeepSeek-R1 en utilisant llama.cpp.

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. 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.

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
  1. 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.

  2. Téléchargez le modèle via :

# 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
)
  1. Exemple avec cache quantifié Q4_0 K Remarque : -no-cnv désactive le mode conversation automatique

Exemple de sortie :

  1. 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.

  1. 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 :

Cover

DeepSeek R1 original

Cover

Quantification dynamique 1.58bit

L'invite utilisée est la suivante :

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

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

  1. 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.

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.

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

Bits MoE
Type
Taille sur disque
Précision
Lien
Détails

1.58bit

UD-IQ1_S

131 Go

Moyenne

MoE entièrement à 1.56bit. down_proj dans MoE mélange de 2.06/1.56bit

1.73bit

UD-IQ1_M

158 Go

Bonne

MoE entièrement à 1.56bit. down_proj dans MoE laissé à 2.06bit

2.22bit

UD-IQ2_XXS

183 Go

Meilleure

MoE entièrement à 2.06bit. down_proj dans MoE mélange de 2.5/2.06bit

2.51bit

UD-Q2_K_XL

212 Go

Meilleure

MoE entièrement à 2.5bit. down_proj dans MoE mélange de 3.5/2.5bit

Mis à jour

Ce contenu vous a-t-il été utile ?