> For the complete documentation index, see [llms.txt](https://unsloth.ai/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://unsloth.ai/docs/de/modelle/tutorials/deepseek-r1-how-to-run-locally.md).

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

{% hint style="success" %}
Bitte beachten Sie <https://docs.unsloth.ai/basics/deepseek-r1-0528-how-to-run-locally> für ein aktualisiertes DeepSeek R1-0528 (Version vom 28. Mai 2025)
{% endhint %}

## Verwendung von llama.cpp (empfohlen)

1. Vergessen Sie nicht `<｜User｜>` und `<｜Assistant｜>` Tokens! - Oder verwenden Sie einen Chat-Template-Formatter
2. Holen Sie sich die neueste `llama.cpp` unter: [github.com/ggml-org/llama.cpp](https://github.com/ggml-org/llama.cpp). Sie können auch den untenstehenden Build-Anweisungen folgen. **Für Apple-Mac-/Metal-Geräte**, setzen Sie `-DGGML_CUDA=OFF` und fahren Sie dann wie gewohnt fort – Metal-Unterstützung ist standardmäßig aktiviert.

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

3. Am besten verwendet man `--min-p 0.05` um sehr seltene Token-Vorhersagen auszugleichen – ich habe festgestellt, dass dies besonders gut für das 1,58-Bit-Modell funktioniert.
4. Laden Sie das Modell herunter über:

```python
# 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ählen Sie den Quantisierungstyp UD-IQ1_S für 1,58 Bit
)
```

6. Beispiel mit Q4\_0-K-quantisiertem Cache **Hinweis: -no-cnv deaktiviert den automatischen Gesprächsmodus**

```bash
./llama.cpp/llama-cli \\
    --model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \\
    --cache-type-k q4_0 \\
    -no-cnv --prio 2 \\
    --temp 0.6 \
    --ctx-size 8192 \\
    --seed 3407 \\
    --prompt "<｜User｜>What is 1+1?<｜Assistant｜>"
```

Beispielausgabe:

```txt
 <think>
 Okay, ich muss also herausfinden, was 1 plus 1 ist. Hmm, wo fange ich überhaupt an? Ich erinnere mich aus der Schule, dass das Addieren von Zahlen ziemlich einfach ist, aber ich möchte sicherstellen, dass ich es richtig verstehe.
 Lassen Sie mich nachdenken: 1 plus 1. Also habe ich einen Gegenstand und füge einen weiteren hinzu. Vielleicht wie ein Apfel plus ein weiterer Apfel. Wenn ich einen Apfel habe und mir jemand einen weiteren gibt, habe ich jetzt zwei Äpfel. Also sollte 1 plus 1 gleich 2 sein. Das ergibt Sinn.
 Moment, aber Mathematik kann manchmal knifflig sein. Könnte es etwas anderes sein? Vielleicht in einem anderen Zahlensystem? Aber ich denke, die Frage ist eindeutig und verwendet normale Zahlen, nicht etwa Binär- oder Hexadezimalzahlen oder so.
 Ich erinnere mich auch daran, dass Addition in der Arithmetik das Zusammenführen von Mengen ist. Wenn Sie also zwei Mengen von 1 haben, ergibt das Zusammenführen eine Gesamtmenge von 2. Ja, das scheint richtig zu sein.
 Gibt es einen Fall, in dem 1 plus 1 nicht 2 wäre? Mir fällt keiner ein...
```

4. Wenn Sie eine GPU (zum Beispiel RTX 4090) mit 24 GB haben, können Sie mehrere Schichten auf die GPU auslagern, um die Verarbeitung zu beschleunigen. Wenn Sie mehrere GPUs haben, können Sie wahrscheinlich noch mehr Schichten auslagern.

```bash
./llama.cpp/llama-cli \\
    --model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \\
    --cache-type-k q4_0 \\
    -no-cnv --prio 2 \\
    --n-gpu-layers 7 \\
    --temp 0.6 \
    --ctx-size 8192 \\
    --seed 3407 \\
    --prompt "<｜User｜>Create a Flappy Bird game in Python.<｜Assistant｜>"
```

5. Um unser Flappy-Bird-Beispiel zu testen, wie hier in unserem Blogbeitrag erwähnt: <https://unsloth.ai/blog/deepseekr1-dynamic>, können wir das zweite Beispiel wie unten gezeigt mit unserer dynamischen 1,58-Bit-Quantisierung erzeugen:

<table data-column-title-hidden data-view="cards" data-full-width="false"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td>Originales DeepSeek R1</td><td></td><td></td><td><a href="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-3c484081174c631653c8c7bf7e7674f05255f740%2FInShot_20250127_043158375_H8Uu6tyJXYAFwUEIu04Am.gif?alt=media">InShot_20250127_043158375_H8Uu6tyJXYAFwUEIu04Am.gif</a></td></tr><tr><td>Dynamische 1,58-Bit-Quantisierung</td><td></td><td></td><td><a href="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-c41eac0fea9362017e94123ee8f9793df21b8e97%2FInShot_20250127_042648160_lrtL8-eRhl4qtLaUDSU87.gif?alt=media">InShot_20250127_042648160_lrtL8-eRhl4qtLaUDSU87.gif</a></td></tr></tbody></table>

Der verwendete Prompt lautet wie folgt:

{% code overflow="wrap" %}

```
<｜User｜>Erstellen Sie ein Flappy-Bird-Spiel in Python. Sie müssen Folgendes einbauen:
1. Sie müssen pygame verwenden.
2. Die Hintergrundfarbe sollte zufällig gewählt werden und hell sein. Beginnen Sie mit einer hellblauen Farbe.
3. Wenn die LEERTASTE mehrmals gedrückt wird, beschleunigt sich der Vogel.
4. Die Form des Vogels sollte zufällig als Quadrat, Kreis oder Dreieck gewählt werden. Die Farbe sollte zufällig als dunkle Farbe gewählt werden.
5. Platzieren Sie unten etwas Land, das zufällig dunkelbraun oder gelb gefärbt ist.
6. Zeigen Sie oben rechts einen Punktestand an. Erhöhen Sie ihn, wenn Sie Rohre passieren und sie nicht berühren.
7. Erstellen Sie zufällig verteilte Rohre mit genügend Abstand. Färben Sie sie zufällig dunkelgrün, hellbraun oder in einem dunklen Grauton.
8. Wenn Sie verlieren, zeigen Sie den Bestwert an. Platzieren Sie den Text innerhalb des Bildschirms. Mit q oder Esc wird das Spiel beendet. Ein Neustart erfolgt durch erneutes Drücken von LEERTASTE.
Das fertige Spiel sollte sich innerhalb eines Markdown-Abschnitts in Python befinden. Überprüfen Sie Ihren Code vor dem finalen Markdown-Abschnitt auf Fehler und beheben Sie diese.<｜Assistant｜>
```

{% endcode %}

Um llama.cpp mit diesem Beispiel aufzurufen, gehen wir so vor:

```bash
./llama.cpp/llama-cli \\
    --model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \\
    --cache-type-k q4_0 \\
    -no-cnv --prio 2 \\
    --n-gpu-layers 7 \\
    --temp 0.6 \
    --ctx-size 8192 \\
    --seed 3407 \\
    --prompt "<｜User｜>Erstellen Sie ein Flappy-Bird-Spiel in Python. Sie müssen Folgendes einbauen:\n1. Sie müssen pygame verwenden.\n2. Die Hintergrundfarbe sollte zufällig gewählt werden und hell sein. Beginnen Sie mit einer hellblauen Farbe.\n3. Wenn die LEERTASTE mehrmals gedrückt wird, beschleunigt sich der Vogel.\n4. Die Form des Vogels sollte zufällig als Quadrat, Kreis oder Dreieck gewählt werden. Die Farbe sollte zufällig als dunkle Farbe gewählt werden.\n5. Platzieren Sie unten etwas Land, das zufällig dunkelbraun oder gelb gefärbt ist.\n6. Zeigen Sie oben rechts einen Punktestand an. Erhöhen Sie ihn, wenn Sie Rohre passieren und sie nicht berühren.\n7. Erstellen Sie zufällig verteilte Rohre mit genügend Abstand. Färben Sie sie zufällig dunkelgrün, hellbraun oder in einem dunklen Grauton.\n8. Wenn Sie verlieren, zeigen Sie den Bestwert an. Platzieren Sie den Text innerhalb des Bildschirms. Mit q oder Esc wird das Spiel beendet. Ein Neustart erfolgt durch erneutes Drücken von LEERTASTE.\nDas fertige Spiel sollte sich innerhalb eines Markdown-Abschnitts in Python befinden. Überprüfen Sie Ihren Code vor dem finalen Markdown-Abschnitt auf Fehler und beheben Sie diese.<｜Assistant｜>"
```

5. Außerdem, wenn Sie die Gewichte beispielsweise für die Verwendung in Ollama zusammenführen möchten, verwenden Sie dieses Skript:

```bash
./llama.cpp/llama-gguf-split --merge \
    DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \\
    merged_file.gguf
```

6. DeepSeek R1 hat 61 Schichten. Bei einer 24-GB-GPU oder 80-GB-GPU können Sie beispielsweise nach unten gerundet mit folgendem Offload rechnen (um 1 reduzieren, wenn der Speicher ausgeht):

| Quant    | Dateigröße | 24-GB-GPU | 80-GB-GPU | 2x80-GB-GPU       |
| -------- | ---------- | --------- | --------- | ----------------- |
| 1,58 Bit | 131 GB     | 7         | 33        | Alle 61 Schichten |
| 1,73 Bit | 158 GB     | 5         | 26        | 57                |
| 2,22 Bit | 183 GB     | 4         | 22        | 49                |
| 2,51 Bit | 212 GB     | 2         | 19        | 32                |

### Ausführung auf Mac-/Apple-Geräten

Bei Apple-Metal-Geräten seien Sie vorsichtig mit --n-gpu-layers. Wenn der Speicher knapp wird, verringern Sie den Wert. Bei einem Gerät mit 128 GB Unified Memory sollten Sie etwa 59 Schichten auslagern können.

```bash
./llama.cpp/llama-cli \\
    --model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \\
    --cache-type-k q4_0 \\
    --prio 2 \\
    --temp 0.6 \
    --ctx-size 8192 \\
    --seed 3407 \\
    --n-gpu-layers 59 \\
    -no-cnv \\
    --prompt "<｜User｜>Create a Flappy Bird game in Python.<｜Assistant｜>"
```

### In Ollama/Open WebUI ausführen

Open WebUI hat hier ein Schritt-für-Schritt-Tutorial zur Ausführung von R1 erstellt: <https://docs.openwebui.com/tutorials/integrations/llm-providers/deepseekr1-dynamic>

\
Wenn Sie Ollama für Inferenz auf GGUFs verwenden möchten, müssen Sie zuerst die 3 GGUF-Splitdateien zu 1 Datei zusammenführen, wie im folgenden Code gezeigt. Danach müssen Sie das Modell lokal ausführen.

```bash
./llama.cpp/llama-gguf-split --merge \
  DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \\
	merged_file.gguf
```

## DeepSeek-Chat-Template

Alle destillierten Versionen und das Hauptmodell R1 mit 671 Mrd. Parametern verwenden dasselbe Chat-Template:

`<｜begin▁of▁sentence｜><｜User｜>Was ist 1+1?<｜Assistant｜>Es ist 2.<｜end▁of▁sentence｜><｜User｜>Erklär mehr!<｜Assistant｜>`

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

`<｜User｜>Was ist 1+1?<｜Assistant｜>`

Die Tokens \<think> und \</think> erhalten ihre eigenen vorgesehenen Tokens. Bei den destillierten Versionen für Qwen und Llama werden einige Tokens neu zugeordnet; Qwen hatte beispielsweise kein BOS-Token, sodass stattdessen <|object\_ref\_start|> verwendet werden musste.\
\
**Tokenizer-ID-Zuordnungen:**

| Token                     | R1     | Destilliertes Qwen | Destilliertes 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              |

Originale 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 Versionen und die ursprünglichen R1-Versionen scheinen aus Versehen dem Padding-Token <｜end▁of▁sentence｜> zugewiesen zu haben, was meistens keine gute Idee ist, insbesondere wenn Sie auf diesen Reasoning-Modellen weiter feinabstimmen möchten. Dies führt zu endlosen Generierungen, da die meisten Frameworks das EOS-Token als -100 maskieren.\
\
Wir haben alle destillierten und die ursprünglichen R1-Versionen mit dem richtigen Padding-Token korrigiert (Qwen verwendet <|vision\_pad|>, Llama verwendet <|finetune\_right\_pad\_id|>, und R1 verwendet <｜▁pad▁｜> oder unser eigens hinzugefügtes <｜PAD▁TOKEN｜>).

## GGUF-R1-Tabelle

<table data-full-width="true"><thead><tr><th>MoE-Bits</th><th>Typ</th><th>Festplattengröße</th><th>Genauigkeit</th><th>Link</th><th>Details</th></tr></thead><tbody><tr><td>1,58 Bit</td><td>UD-IQ1_S</td><td><strong>131 GB</strong></td><td>Mittel</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ1_S">Link</a></td><td>MoE insgesamt 1,56 Bit. <code>down_proj</code> in der MoE-Mischung aus 2,06/1,56 Bit</td></tr><tr><td>1,73 Bit</td><td>UD-IQ1_M</td><td><strong>158 GB</strong></td><td>Gut</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ1_M">Link</a></td><td>MoE insgesamt 1,56 Bit. <code>down_proj</code> in der MoE bei 2,06 Bit belassen</td></tr><tr><td>2,22 Bit</td><td>UD-IQ2_XXS</td><td><strong>183 GB</strong></td><td>Besser</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ2_XXS">Link</a></td><td>MoE insgesamt 2,06 Bit. <code>down_proj</code> in der MoE-Mischung aus 2,5/2,06 Bit</td></tr><tr><td>2,51 Bit</td><td>UD-Q2_K_XL</td><td><strong>212 GB</strong></td><td>Am besten</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-Q2_K_XL">Link</a></td><td>MoE insgesamt 2,5 Bit. <code>down_proj</code> in der MoE-Mischung aus 3,5/2,5 Bit</td></tr></tbody></table>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://unsloth.ai/docs/de/modelle/tutorials/deepseek-r1-how-to-run-locally.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
