🐋DeepSeek-R1: Wie man lokal ausführt
Ein Leitfaden, wie du unsere 1,58-Bit Dynamic Quants für DeepSeek-R1 mit llama.cpp ausführen kannst.
Bitte siehe https://docs.unsloth.ai/basics/deepseek-r1-0528-how-to-run-locally für ein aktualisiertes DeepSeek R1-0528 (Version vom 28. Mai 2025)
Verwendung von llama.cpp (empfohlen)
Vergiss nicht die
<|User|>und<|Assistant|>Tokens! - Oder verwende einen Chat-Template-FormatterBeschaffen Sie die neueste
llama.cppunter: github.com/ggml-org/llama.cpp. Du kannst auch den Build-Anweisungen unten folgen. Für Apple Mac / Metal-Geräte, setze-DGGML_CUDA=OFFund 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.cppAm besten verwendet man
--min-p 0.05um sehr seltene Token-Vorhersagen auszugleichen - ich habe festgestellt, dass dies besonders für das 1.58bit-Modell gut funktioniert.Lade das Modell herunter über:
# pip install huggingface_hub hf_transfer
# import os # Optional für schnelleres Herunterladen
# 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 den Quantisierungstyp UD-IQ1_S für 1.58bit
)Beispiel mit Q4_0 K-quantisiertem Cache Hinweis: -no-cnv deaktiviert den Auto-Konversationsmodus
Beispielausgabe:
Wenn du eine GPU hast (zum Beispiel eine RTX 4090) mit 24 GB, kannst du mehrere Schichten auf die GPU auslagern, um die Verarbeitung zu beschleunigen. Wenn du mehrere GPUs hast, kannst du wahrscheinlich noch mehr Schichten auslagern.
Um unser Flappy-Bird-Beispiel zu testen, wie in unserem Blogbeitrag hier erwähnt: https://unsloth.ai/blog/deepseekr1-dynamic, können wir das zweite Beispiel wie unten mit unserem 1.58bit-Dynamic-Quant erzeugen:

Originales DeepSeek R1

1.58bit Dynamic Quant
Die verwendete Eingabeaufforderung ist wie folgt:
Um llama.cpp mit diesem Beispiel aufzurufen, machen wir Folgendes:
Wenn du außerdem die Gewichte beispielsweise für die Verwendung in Ollama zusammenführen möchtest, verwende dieses Skript:
DeepSeek R1 hat 61 Schichten. Mit einer 24GB-GPU oder 80GB-GPU kannst du nach Abrunden erwarten, dass du auslagern kannst (bei Out-of-Memory um 1 reduzieren):
1.58bit
131GB
7
33
Alle Schichten 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
Für Apple-Metal-Geräte sei vorsichtig mit --n-gpu-layers. Wenn du feststellst, dass dem System der Speicher ausgeht, reduziere den Wert. Bei einem Gerät mit 128 GB Unified Memory solltest du etwa 59 Schichten auslagern können.
In Ollama/Open WebUI ausführen
Open WebUI hat hier ein Schritt-für-Schritt-Tutorial erstellt, wie man R1 ausführt: https://docs.openwebui.com/tutorials/integrations/llm-providers/deepseekr1-dynamic
Wenn du Ollama für Inferenz auf GGUFs verwenden möchtest, musst du zuerst die 3 gesplitteten GGUF-Dateien zu 1 zusammenführen, wie im folgenden Code. Danach 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|>Was ist 1+1?<|Assistant|>Es ist 2.<|end▁of▁sentence|><|User|>Erkläre mehr!<|Assistant|>
Ein BOS wird erzwungen 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|>Was ist 1+1?<|Assistant|>
Die Tokens <think> und </think> erhalten ihre eigenen speziellen Tokens. Für die destillierten Versionen von Qwen und Llama werden einige Tokens neu zugewiesen, während Qwen zum Beispiel kein BOS-Token hatte, sodass stattdessen <|object_ref_start|> verwendet werden musste. Tokenizer-ID-Zuordnungen:
<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:
<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 dem Padding-Token versehentlich <|end▁of▁sentence|> zugewiesen zu haben, was meistens keine gute Idee ist, insbesondere wenn du auf Basis dieser Reasoning-Modelle weiter feinabstimmen möchtest. Dies führt zu endlosen, unendlichen Generierungen, 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 behoben (Qwen verwendet <|vision_pad|>, Llama verwendet <|finetune_right_pad_id|>, und R1 verwendet <|▁pad▁|> oder unser eigenes hinzugefügtes <|PAD▁TOKEN|>.
GGUF-R1-Tabelle
Zuletzt aktualisiert
War das hilfreich?

