🐋DeepSeek-R1 : Comment exécuter localement

Un guide sur la façon 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|> jetons ! - Ou utilisez un formatteur de modèle de chat

  2. Obtenez le dernier llama.cpp à : github.com/ggerganov/llama.cpparrow-up-right. Vous pouvez également suivre les instructions de build ci-dessous :

apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone https://github.com/ggerganov/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 trouvé que cela fonctionnait bien en particulier pour le modèle 1,58 bit.

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

Exemple de sortie :

  1. Si vous disposez d'un GPU (par exemple une RTX 4090) 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 plus 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 2ᵉ exemple ci-dessous en utilisant notre quantification dynamique 1,58 bit :

Cover

DeepSeek R1 original

Cover

Quantification dynamique 1,58 bit

Le prompt utilisé est le suivant :

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

  1. Aussi, si vous voulez 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 si cela provoque un dépassement de mémoire) :

Quant
Taille du fichier
GPU 24 Go
GPU 80 Go
2xGPU 80 Go

1,58 bit

131 Go

7

33

Toutes les couches 61

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-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 réalisé un tutoriel étape par étape sur la façon d'exécuter R1 ici : docs.openwebui.com/tutorials/integrations/deepseekr1-dynamic/arrow-up-right Si vous voulez utiliser Ollama pour l'inférence sur des GGUF, vous devez d'abord fusionner les 3 fichiers GGUF scindé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 jetons BOS lors de l'inférence, vous ne devriez appeler que tokenizer.encode(..., add_special_tokens = False) puisque le modèle de chat ajoute automatiquement un jeton BOS également. Pour l'inférence avec llama.cpp / GGUF, vous devez ignorer le BOS puisqu'il l'ajoutera automatiquement.

<|User|>What is 1+1?<|Assistant|>

Les jetons <think> et </think> ont leurs propres jetons désignés. Pour les versions distillées de Qwen et Llama, certains jetons ont été remappés, tandis que Qwen par exemple n'avait pas de jeton BOS, donc <|object_ref_start|> a dû être utilisé à la place. Mappages d'ID du tokenizer :

Jeton
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

Jeton de remplissage

2

151654

128004

Jetons originaux 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 les versions R1 originales semblent avoir attribué par erreur le jeton de remplissage à <|end▁of▁sentence|>, ce qui n'est généralement pas une bonne idée, surtout si vous souhaitez affiner davantage ces modèles de raisonnement. Cela provoquera des générations infinies sans fin, car la plupart des frameworks masquent le jeton EOS en le remplaçant par -100. Nous avons corrigé toutes les versions distillées et les versions R1 originales avec le jeton 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,58 bit

UD-IQ1_S

131 Go

Correct

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

1,73 bit

UD-IQ1_M

158 Go

Bon

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

2,22 bit

UD-IQ2_XXS

183 Go

Meilleur

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

2,51 bit

UD-Q2_K_XL

212 Go

Meilleur

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

Mis à jour

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