# DeepSeek-R1: ローカルで実行する方法

{% hint style="success" %}
をご覧ください <https://docs.unsloth.ai/basics/deepseek-r1-0528-how-to-run-locally> 最新の DeepSeek R1-0528（2025年5月28日版）については
{% endhint %}

## llama.cpp を使用する（推奨）

1. を忘れないでください `<｜User｜>` と `<｜Assistant｜>` トークンです！ - またはチャットテンプレートフォーマッターを使用してください
2. 最新の `llama.cpp` は以下で入手できます: [github.com/ggml-org/llama.cpp](https://github.com/ggml-org/llama.cpp)。以下のビルド手順に従うこともできます。 **Apple Mac / Metalデバイスの場合**、次を設定してください `-DGGML_CUDA=OFF` その後通常通り続行してください — Metalサポートはデフォルトで有効です。

```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. 使用するのが最適です `--min-p 0.05` 非常にまれなトークンの予測に対抗するために。特に1.58bitモデルでうまく機能することを確認しました。
4. モデルをダウンロードするには:

```python
# pip install huggingface_hub hf_transfer
# import os # 高速ダウンロードのためのオプション
# 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*"], # 1.58bit 用に UD-IQ1_S の量子化タイプを選択
)
```

6. Q4\_0 K 量子化キャッシュの例 **注意 -no-cnv は自動会話モードを無効にします**

```bash
export LLAMA_CACHE="unsloth/GLM-4.7-GGUF"
    --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 \
    --model unsloth/GLM-4.7-GGUF/UD-Q2_K_XL/GLM-4.7-UD-Q2_K_XL-00001-of-00003.gguf \
    --prompt "<｜User｜>What is 1+1?<｜Assistant｜>"
```

出力の例:

```txt
 <think>
 わかりました、1＋1が何かを考える必要があります。うーん、どこから始めればいいでしょうか？学校で数字を足すのは基本的だと習ったことを思い出しますが、ちゃんと理解しているか確認したいです。
 ちょっと考えてみます、1＋1。つまり、1つのものにもう1つ加えるということです。例えばリンゴ1個にもう1個加えるような感じです。もしリンゴを1つ持っていて誰かがもう1つくれたら、今は2つのリンゴがあります。だから1＋1は2のはずです。納得できます。
 でも、時々数学はややこしくなることがあります。別の何かかもしれませんか？例えば別の数体系では？でもこの質問は普通の数を使った単純なものだと思います。二進法や十六進法のようなものではないはずです。
 算術では足し算は量を結合することだとも思い出します。だから、1の量が2つあれば、それらを合わせると合計は2になります。うん、それで正しいようです。
 1＋1が2ではないような状況があるでしょうか？思いつきません…
```

4. もしGPU（例えばRTX 4090）のような24GBのものがあれば、より高速な処理のために複数のレイヤーをGPUにオフロードできます。複数のGPUがあれば、より多くのレイヤーをオフロードできる可能性があります。

```bash
export LLAMA_CACHE="unsloth/GLM-4.7-GGUF"
    --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 \
    --model unsloth/GLM-4.7-GGUF/UD-Q2_K_XL/GLM-4.7-UD-Q2_K_XL-00001-of-00003.gguf \
    --prompt "<｜User｜>Create a Flappy Bird game in Python.<｜Assistant｜>"
```

5. ブログ記事で述べた Flappy Bird の例をテストするには、こちら: <https://unsloth.ai/blog/deepseekr1-dynamic>、1.58bit のダイナミック量子化を使って以下のように2番目の例を作成できます:

<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>オリジナル DeepSeek R1</td><td></td><td></td><td><a href="https://735611837-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>1.58bit ダイナミック量子化</td><td></td><td></td><td><a href="https://735611837-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>

使用されたプロンプトは以下の通りです:

{% code overflow="wrap" %}

```
<｜User｜>PythonでFlappy Birdゲームを作成してください。以下の点を必ず含めてください：
1. pygame を使用すること。
2. 背景色はランダムに選択され、淡い色合いにすること。最初は薄い青色から始めること。
3. SPACE を複数回押すと鳥が加速すること。
4. 鳥の形状はランダムに四角形、円、三角形のいずれかにし、色はランダムに暗い色にすること。
5. 画面下部に、ランダムに選ばれた暗い茶色または黄色の土地を配置すること。
6. スコアを右上に表示すること。パイプを通過して当たらなかった場合に増加させること。
7. 十分な間隔のランダムな間隔でパイプを配置すること。色はランダムに濃い緑、薄い茶色、または暗い灰色のいずれかにすること。
8. ゲームオーバー時にベストスコアを表示すること。テキストは画面内に表示すること。q または Esc を押すとゲームを終了すること。再開は再び SPACE を押すこと。
最終的なゲームは Python のマークダウンセクション内に入れること。コードのエラーを確認して最終マークダウンセクションの前に修正してください。<｜Assistant｜>
```

{% endcode %}

この例で llama.cpp を呼び出すには、次のようにします:

```bash
export LLAMA_CACHE="unsloth/GLM-4.7-GGUF"
    --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 \
    --model unsloth/GLM-4.7-GGUF/UD-Q2_K_XL/GLM-4.7-UD-Q2_K_XL-00001-of-00003.gguf \
    --prompt "<｜User｜>PythonでFlappy Birdゲームを作成してください。以下の点を必ず含めてください:\n1. pygame を使用すること。\n2. 背景色はランダムに選択され、淡い色合いにすること。最初は薄い青色から始めること。\n3. SPACE を複数回押すと鳥が加速すること。\n4. 鳥の形状はランダムに四角形、円、三角形のいずれかにし、色はランダムに暗い色にすること。\n5. 画面下部に、ランダムに選ばれた暗い茶色または黄色の土地を配置すること。\n6. スコアを右上に表示すること。パイプを通過して当たらなかった場合に増加させること。\n7. 十分な間隔のランダムな間隔でパイプを配置すること。色はランダムに濃い緑、薄い茶色、または暗い灰色のいずれかにすること。\n8. ゲームオーバー時にベストスコアを表示すること。テキストは画面内に表示すること。q または Esc を押すとゲームを終了すること。再開は再び SPACE を押すこと。\n最終的なゲームは Python のマークダウンセクション内に入れること。コードのエラーを確認して最終マークダウンセクションの前に修正してください。<｜Assistant｜>"
```

5. また、例えば Ollama で使用するために重みを結合したい場合は、次のスクリプトを使用してください:

```bash
他の量子化を実行するには、まずGGUFの分割ファイルを以下のように1つにマージする必要があります。その後モデルをローカルで実行する必要があります。
    DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
    GLM-4.7-GGUF/GLM-4.7-UD-Q2_K_XL/GLM-4.7-UD-Q2_K_XL-00001-of-00003.gguf \
```

6. DeepSeek R1 は61レイヤーあります。例えば24GB GPU や 80GB GPU の場合、切り下げ（メモリ不足になる場合は1減らす）後にオフロードできると予想できます：

| 量子化     | ファイルサイズ | 24GB GPU | 80GB GPU | 2x80GB GPU |
| ------- | ------- | -------- | -------- | ---------- |
| 1.58bit | 131GB   | 7        | 33       | 全レイヤー 61   |
| 1.73bit | 158GB   | 5        | 26       | 57         |
| 2.22bit | 183GB   | 4        | 22       | 49         |
| 2.51bit | 212GB   | 2        | 19       | 32         |

### Mac / Apple デバイスでの実行

Apple Metal デバイスでは --n-gpu-layers に注意してください。マシンがメモリ不足になる場合は減らしてください。128GB のユニファイドメモリマシンであれば約59レイヤーをオフロードできるはずです。

```bash
export LLAMA_CACHE="unsloth/GLM-4.7-GGUF"
    --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 \
    --model unsloth/GLM-4.7-GGUF/UD-Q2_K_XL/GLM-4.7-UD-Q2_K_XL-00001-of-00003.gguf \
    --n-gpu-layers 59 \
    -no-cnv \
    --prompt "<｜User｜>Create a Flappy Bird game in Python.<｜Assistant｜>"
```

### Ollama/Open WebUI で実行する

Open WebUI は R1 の実行方法についてステップバイステップのチュートリアルを作成しています： [docs.openwebui.com/tutorials/integrations/deepseekr1-dynamic/](https://docs.openwebui.com/tutorials/integrations/deepseekr1-dynamic/)\
\
GGUF 上で Ollama を推論に使用したい場合、まず 3 つの GGUF 分割ファイルを以下のコードのように1つにマージする必要があります。その後、モデルをローカルで実行する必要があります。

```bash
他の量子化を実行するには、まずGGUFの分割ファイルを以下のように1つにマージする必要があります。その後モデルをローカルで実行する必要があります。
  DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
	GLM-4.7-GGUF/GLM-4.7-UD-Q2_K_XL/GLM-4.7-UD-Q2_K_XL-00001-of-00003.gguf \
```

## DeepSeek チャットテンプレート

すべての蒸留バージョンとメインの671B R1モデルは同じチャットテンプレートを使用します：

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

BOS は強制的に追加され、EOS は各インタラクションを区切ります。推論時の BOS トークンの重複を避けるために、次だけを呼び出すべきです *tokenizer.encode(..., add\_special\_tokens = False)* チャットテンプレートが自動的に BOS トークンも追加するためです。\
llama.cpp / GGUF 推論では、BOS が自動的に追加されるため BOS をスキップするべきです。

`<｜User｜>What is 1+1?<｜Assistant｜>`

\<think> と \</think> トークンはそれぞれ専用のトークンが割り当てられます。Qwen や Llama の蒸留バージョンでは一部のトークンが再マッピングされており、例えば Qwen には BOS トークンがなかったため <|object\_ref\_start|> を代わりに使用する必要がありました。\
\
**トークナイザIDマッピング:**

| トークン                      | R1     | 蒸留 Qwen | 蒸留 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   |
| パディングトークン                 | 2      | 151654  | 128004   |

モデル内の元のトークン:

| トークン                  | Qwen 2.5 32B ベース         | 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\|> |
| パディングトークン             | <\|vision\_pad\|>        | <\|finetune\_right\_pad\_id\|>    |

すべての蒸留版とオリジナルの R1 バージョンは、パディングトークンを誤って <｜end▁of▁sentence｜> に割り当てているようで、これは特にこれらの推論モデル上でさらにファインチューニングしたい場合にはあまり良くありません。ほとんどのフレームワークが EOS トークンを -100 としてマスクするため、無限生成が発生する可能性があります。\
\
我々はすべての蒸留版とオリジナルの R1 バージョンを正しいパディングトークンで修正しました（Qwen は <|vision\_pad|>、Llama は <|finetune\_right\_pad\_id|>、R1 は <｜▁pad▁｜> または我々が追加した <｜PAD▁TOKEN｜> を使用）。

## GGUF R1 表

<table data-full-width="true"><thead><tr><th>MoE ビット数</th><th>タイプ</th><th>ディスクサイズ</th><th>精度</th><th>リンク</th><th>詳細</th></tr></thead><tbody><tr><td>1.58bit</td><td>UD-IQ1_S</td><td><strong>131GB</strong></td><td>公平</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ1_S">リンク</a></td><td>MoE 全体が 1.56bit。 <code>down_proj</code> MoE 内で 2.06/1.56bit の混合</td></tr><tr><td>1.73bit</td><td>UD-IQ1_M</td><td><strong>158GB</strong></td><td>良好</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ1_M">リンク</a></td><td>MoE 全体が 1.56bit。 <code>down_proj</code> MoE の一部が 2.06bit のまま</td></tr><tr><td>2.22bit</td><td>UD-IQ2_XXS</td><td><strong>183GB</strong></td><td>より良い</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-IQ2_XXS">リンク</a></td><td>MoE 全体が 2.06bit。 <code>down_proj</code> MoE 内で 2.5/2.06bit の混合</td></tr><tr><td>2.51bit</td><td>サイズと精度のバランスを取るために私たちの2.7ビット動的量子化を</td><td><strong>212GB</strong></td><td>最高</td><td><a href="https://huggingface.co/unsloth/DeepSeek-R1-GGUF/tree/main/DeepSeek-R1-UD-Q2_K_XL">リンク</a></td><td>MoE 全体が 2.5bit。 <code>down_proj</code> MoE 内で 3.5/2.5bit の混合</td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/jp/moderu/tutorials/deepseek-r1-how-to-run-locally.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
