# 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` at: [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
./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｜>1+1は何ですか？<｜Assistant｜>"
```

出力例:

```txt
 <think>
 よし、1たす1がいくつかを考えないといけない。うーん、どこから始めればいいかな？ 学校で、数を足すのはとても基本的だと習ったのを覚えているけど、きちんと理解したい。
 考えてみよう、1たす1。つまり、1つ持っていて、さらにもう1つ足す。たとえば、りんご1個にもう1個りんごを足すようなものかな。1個りんごがあって、誰かがもう1個くれたら、今は2個りんごがある。だから、1たす1は2のはずだ。それで納得できる。
 でも、数学は時々ややこしい。ほかの答えになることはあるだろうか？ たとえば、別の数体系なら？ でも、この質問は単純で、2進法や16進法などではなく、普通の数を使っていると思う。
 算術では、加算は数量をまとめることだということも思い出した。だから、1が2つあって、それを合わせれば合計は2になる。うん、それで合っているようだ。
 1たす1が2にならない場面はあるのかな？ 思いつかない...
```

4. GPU（たとえば RTX 4090）を24GB搭載しているなら、より高速に処理するために複数の層をGPUへオフロードできます。複数GPUがあるなら、さらに多くの層をオフロードできるはずです。

```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｜>PythonでFlappy Birdゲームを作成してください。<｜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="/files/046d1cda0c2a23341bc4a2b9a298d7cdee5f6d0d">/files/046d1cda0c2a23341bc4a2b9a298d7cdee5f6d0d</a></td></tr><tr><td>1.58bit 動的量子化</td><td></td><td></td><td><a href="/files/fefae8b576d8556efaa51ce1889a55de29384c8d">/files/fefae8b576d8556efaa51ce1889a55de29384c8d</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 の markdown セクション内に入れてください。最終的な markdown セクションの前にコードをエラー確認して修正してください。<｜Assistant｜>
```

{% endcode %}

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

```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｜>PythonでFlappy Birdゲームを作成してください。次の要素を必ず含めてください:\n1. pygame を使うこと。\n2. 背景色はランダムに選び、明るい色にすること。最初は薄い青にしてください。\n3. SPACE を何度も押すと鳥が加速すること。\n4. 鳥の形は四角、円、三角形のいずれかからランダムに選ぶこと。色は暗い色からランダムに選ぶこと。\n5. 画面下部に、濃い茶色または黄色からランダムに選んだ色の地面を配置すること。\n6. 右上にスコアを表示すること。パイプを通過して当たらなければ加点すること。\n7. 十分な間隔を空けてランダムな位置にパイプを配置すること。色は濃い緑、薄い茶色、または濃い灰色からランダムにすること。\n8. 失敗したらベストスコアを表示すること。テキストは画面内に収めること。q または Esc を押すとゲームを終了し、SPACE をもう一度押すと再開すること。\n最終的なゲームコードは Python の markdown セクション内に入れてください。最終的な markdown セクションの前にコードをエラー確認して修正してください。<｜Assistant｜>"
```

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

```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 は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
./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｜>PythonでFlappy Birdゲームを作成してください。<｜Assistant｜>"
```

### Ollama/Open WebUI で実行

Open WebUI は、R1 の実行方法について段階的なチュートリアルをこちらで公開しています: <https://docs.openwebui.com/tutorials/integrations/llm-providers/deepseekr1-dynamic>

\
GGUF で推論に Ollama を使いたい場合は、まず下のコードのように3つのGGUF分割ファイルを1つに結合する必要があります。その後、モデルをローカルで実行する必要があります。

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

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

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

`<｜begin▁of▁sentence｜><｜User｜>1+1は何ですか？<｜Assistant｜>2です。<｜end▁of▁sentence｜><｜User｜>もっと説明して！<｜Assistant｜>`

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

`<｜User｜>1+1は何ですか？<｜Assistant｜>`

\<think> と \</think> トークンには専用のトークンが割り当てられています。Qwen と Llama の蒸留版では一部のトークンが再マップされており、たとえば Qwen には BOS トークンがなかったため、代わりに <|object\_ref\_start|> を使う必要がありました。\
\
**トークナイザーID対応表:**

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

モデル内の元トークン:

| トークン                  | 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\|> |
| パディングトークン             | <\|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>UD-Q2_K_XL</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.
