🐋DeepSeek-R1: Anleitung zum lokalen Betrieb

Eine Anleitung, wie du unsere 1,58-Bit-Dynamic-Quants für DeepSeek-R1 mit llama.cpp verwenden kannst.

circle-check

Verwendung von llama.cpp (empfohlen)

  1. Vergiss nicht <|User|> und <|Assistant|> Tokens! - Oder verwende einen Chat-Template-Formatter

  2. Hole das neueste llama.cpp unter: github.com/ggml-org/llama.cpparrow-up-right. Du kannst auch den untenstehenden Build-Anweisungen folgen. Für Apple Mac / Metal-Geräte, setze -DGGML_CUDA=OFF und fahre dann wie gewohnt fort - Metal-Unterstützung ist standardmäßig aktiviert.

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. Am besten ist es, --min-p 0.05 zu verwenden, um sehr seltene Token-Vorhersagen entgegenzuwirken - ich fand dies besonders für das 1.58bit-Modell als gut funktionierend.

  2. Lade das Modell herunter über:

# pip install huggingface_hub hf_transfer
# import os # Optional für schnelleren Download
# 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*"], # Wähle Quant-Typ UD-IQ1_S für 1.58bit
)
  1. Beispiel mit Q4_0 K quantisiertem Cache Beachte -no-cnv deaktiviert den automatischen Konversationsmodus

Beispielausgabe:

  1. Wenn du eine GPU (z. B. RTX 4090) mit 24 GB hast, kannst du mehrere Layer auf die GPU auslagern für schnellere Verarbeitung. Wenn du mehrere GPUs hast, kannst du wahrscheinlich mehr Layer auslagern.

  1. Um unser Flappy Bird-Beispiel wie in unserem Blogbeitrag hier zu testen: https://unsloth.ai/blog/deepseekr1-dynamicarrow-up-right, können wir das 2. Beispiel unten mit unserem 1.58bit dynamischen Quant erzeugen:

Cover

Original DeepSeek R1

Cover

1.58bit Dynamisches Quant

Der verwendete Prompt ist wie folgt:

Um llama.cpp mit diesem Beispiel aufzurufen, machen wir:

  1. Wenn du außerdem die Gewichte zusammenführen möchtest, um sie z. B. in Ollama zu verwenden, benutze dieses Skript:

  1. DeepSeek R1 hat 61 Layer. Zum Beispiel kannst du bei einer 24GB- oder 80GB-GPU erwarten, nach Abrunden (um 1 reduzieren, wenn es zu Out-of-Memory kommt) auszulagern:

Quant
Dateigröße
24GB GPU
80GB GPU
2x80GB GPU

1.58bit

131GB

7

33

Alle Layer 61

1.73bit

158GB

5

26

57

2.22bit

183GB

4

22

49

2.51bit

212GB

2

19

32

Ausführung auf Mac / Apple-Geräten

Bei Apple Metal-Geräten sei vorsichtig mit --n-gpu-layers. Wenn der Rechner wegen zu wenig Speicher abstürzt, reduziere diesen Wert. Bei einer Maschine mit 128 GB Unified Memory solltest du etwa 59 Layer oder so auslagern können.

Ausführung in Ollama/Open WebUI

Open WebUI hat ein Schritt-für-Schritt-Tutorial zum Ausführen von R1 hier erstellt: docs.openwebui.com/tutorials/integrations/deepseekr1-dynamic/arrow-up-right Wenn du Ollama für Inferenz auf GGUFs verwenden möchtest, musst du zuerst die 3 GGUF-Split-Dateien zu 1 zusammenführen wie im folgenden Code. Dann musst du das Modell lokal ausführen.

DeepSeek Chat-Template

Alle destillierten Versionen und das Hauptmodell R1 mit 671B verwenden dasselbe Chat-Template:

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

Ein BOS wird zwangsweise hinzugefügt, und ein EOS trennt jede Interaktion. Um doppelte BOS-Tokens während der Inferenz zu vermeiden, solltest du nur tokenizer.encode(..., add_special_tokens = False) aufrufen, da das Chat-Template ebenfalls automatisch ein BOS-Token hinzufügt. Für llama.cpp / GGUF-Inferenz solltest du das BOS überspringen, da es automatisch hinzugefügt wird.

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

Die <think>- und </think>-Tokens erhalten eigene zugewiesene Token. Bei den destillierten Versionen für Qwen und Llama werden einige Tokens umgemappt, während Qwen zum Beispiel kein BOS-Token hatte, sodass stattdessen <|object_ref_start|> verwendet werden musste. Tokenizer-ID-Zuordnungen:

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

Padding-Token

2

151654

128004

Ursprüngliche Tokens in Modellen:

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

Padding-Token

<|vision_pad|>

<|finetune_right_pad_id|>

Alle destillierten und die ursprünglichen R1-Versionen scheinen versehentlich das Padding-Token auf <|end▁of▁sentence|> gesetzt zu haben, was meistens keine gute Idee ist, besonders wenn du weiter auf diesen Reasoning-Modellen feinabstimmen möchtest. Dies verursacht endlose Generationen, da die meisten Frameworks das EOS-Token als -100 maskieren. Wir haben alle destillierten und die ursprünglichen R1-Versionen mit dem korrekten Padding-Token korrigiert (Qwen verwendet <|vision_pad|>, Llama verwendet <|finetune_right_pad_id|> und R1 verwendet <|▁pad▁|> oder unser hinzugefügtes <|PAD▁TOKEN|>).

GGUF R1 Tabelle

MoE Bits
Typ
Platzbedarf auf Datenträger
Genauigkeit
Link
Details

1.58bit

UD-IQ1_S

131GB

Fair

MoE alles 1.56bit. down_proj in MoE Mischung aus 2.06/1.56bit

1.73bit

UD-IQ1_M

158GB

Gut

MoE alles 1.56bit. down_proj in MoE links bei 2.06bit

2.22bit

UD-IQ2_XXS

183GB

Besser

MoE alles 2.06bit. down_proj in MoE Mischung aus 2.5/2.06bit

2.51bit

UD-Q2_K_XL

212GB

Am besten

MoE alles 2.5bit. down_proj in MoE Mischung aus 3.5/2.5bit

Zuletzt aktualisiert

War das hilfreich?