🐋DeepSeek-R1: Anleitung zum lokalen Betrieb

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

circle-check

Verwendung von llama.cpp (empfohlen)

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

  2. Holen Sie sich die neueste llama.cpp bei: github.com/ggerganov/llama.cpparrow-up-right. Du kannst auch den untenstehenden Build-Anweisungen folgen:

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. Am besten verwendest du --min-p 0.05 um sehr seltene Token-Vorhersagen entgegenzuwirken - ich fand, dass dies besonders gut für das 1,58-Bit-Modell funktioniert.

  2. 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 Quant-Typ UD-IQ1_S für 1,58 Bit
)
  1. Beispiel mit Q4_0 K quantisiertem Cache Hinweis -no-cnv deaktiviert den automatischen Konversationsmodus

Beispielausgabe:

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

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

Cover

Original DeepSeek R1

Cover

1,58-Bit Dynamische Quantisierung

Der verwendete Prompt ist wie folgt:

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

  1. Wenn du außerdem die Gewichte zusammenführen willst, z. B. für die Verwendung in Ollama, benutze dieses Skript:

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

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

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

Bei Apple-Metal-Geräten sei vorsichtig mit --n-gpu-layers. Wenn der Rechner in den Out-of-Memory-Zustand gerät, reduziere diesen Wert. Bei einer Maschine mit 128 GB Unified Memory solltest du in der Lage sein, ungefähr 59 Schichten auszulagern.

Ausführen in Ollama/Open WebUI

Open WebUI hat ein Schritt-für-Schritt-Tutorial, wie man R1 ausführt, hier: docs.openwebui.com/tutorials/integrations/deepseekr1-dynamic/arrow-up-right Wenn du Ollama für Inferenz mit GGUFs verwenden willst, musst du zuerst die 3 GGUF-Split-Dateien zu einer zusammenführen wie im Code unten. Dann musst du das Modell lokal ausführen.

DeepSeek Chat-Template

Alle distillierten Versionen und das Hauptmodell R1 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-Token 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 Tokens. Für die distillierten Versionen von Qwen und Llama werden einige Tokens neu zugeordnet, 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 distillierten und die ursprünglichen R1-Versionen scheinen den Padding-Token versehentlich auf <|end▁of▁sentence|> gesetzt zu haben, was meistens keine gute Idee ist, besonders wenn du diese Reasoning-Modelle weiter feinabstimmen möchtest. Dies verursacht endlose, unendliche Generierungen, da die meisten Frameworks das EOS-Token als -100 maskieren. Wir haben alle distillierten 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 eigenes hinzugefügtes <|PAD▁TOKEN|>).

GGUF R1 Tabelle

MoE-Bits
Typ
Platten-/Festplattengröße
Genauigkeit
Link
Details

1,58bit

UD-IQ1_S

131GB

Fair

MoE alle 1,56 Bit. down_proj in MoE Mischung aus 2,06/1,56 Bit

1,73bit

UD-IQ1_M

158GB

Gut

MoE alle 1,56 Bit. down_proj in MoE links bei 2,06 Bit

2,22bit

UD-IQ2_XXS

183GB

Besser

MoE alle 2,06 Bit. down_proj in MoE Mischung aus 2,5/2,06 Bit

2,51bit

UD-Q2_K_XL

212GB

Am besten

MoE alle 2,5 Bit. down_proj in MoE Mischung aus 3,5/2,5 Bit

Zuletzt aktualisiert

War das hilfreich?