🐋DeepSeek-R1 : Comment exécuter localement

Un guide sur la manière dont vous pouvez exécuter nos quantifications dynamiques 1,58-bit pour DeepSeek-R1 en utilisant llama.cpp.

circle-check

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.cpparrow-up-right. 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.

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 tokens très rares - j'ai trouvé 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 (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.

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

Cover

DeepSeek R1 original

Cover

Quantification dynamique 1,58bit

Le prompt utilisé est le suivant :

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

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

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

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/arrow-up-right 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.

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

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

1,58bit

UD-IQ1_S

131 Go

Moyen

MoE tout en 1,56bit. down_proj dans le mélange MoE de 2,06/1,56bit

1,73bit

UD-IQ1_M

158 Go

Bon

MoE tout en 1,56bit. down_proj dans MoE laissé à 2,06bit

2,22bit

UD-IQ2_XXS

183 Go

Mieux

MoE tout en 2,06bit. down_proj dans le mélange MoE de 2,5/2,06bit

2,51bit

UD-Q2_K_XL

212 Go

Meilleur

MoE tout en 2,5bit. down_proj dans le mélange MoE de 3,5/2,5bit

Mis à jour

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