🐋DeepSeek-R1: ローカルでの実行方法
llama.cppを使ってDeepSeek-R1用の1.58ビットDynamic Quantを実行する方法のガイド。
llama.cpp を使用する(推奨)
〜を忘れないでください
<|User|>そして<|Assistant|>トークン! - あるいはチャットテンプレートフォーマッタを使ってください最新の
llama.cpp場所: github.com/ggml-org/llama.cpp。以下のビルド手順に従うこともできます。 Apple Mac / Metalデバイスの場合、次を設定します-DGGML_CUDA=OFFその後は通常どおり続けてください。Metalサポートはデフォルトで有効です。
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使用するのが最適です
--min-p 0.05非常にまれなトークン予測を抑えるためです。特に 1.58bit モデルではこれがうまく機能することがわかりました。以下からモデルをダウンロードします:
# 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 を選択
)Q4_0 K 量子化キャッシュの例 注意: -no-cnv は自動会話モードを無効にします
出力例:
GPU(たとえば RTX 4090)に 24GB あれば、複数の層を GPU にオフロードしてより高速に処理できます。複数の GPU があるなら、さらに多くの層をオフロードできるはずです。
こちらのブログ記事で述べた Flappy Bird の例をテストするには: https://unsloth.ai/blog/deepseekr1-dynamic、1.58bit の動的量子化を使って以下のように 2 つ目の例を生成できます:

オリジナルの DeepSeek R1

1.58bit 動的量子化
使用したプロンプトは以下のとおりです:
この例を使って llama.cpp を呼び出すには、次のようにします:
また、たとえば Ollama で使うために重みをまとめたい場合は、このスクリプトを使ってください:
DeepSeek R1 には 61 層あります。たとえば 24GB GPU または 80GB GPU なら、切り捨て後の層数をオフロードできると考えられます(メモリ不足になる場合は 1 減らしてください):
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 層ほどをオフロードできるはずです。
Ollama/Open WebUI で実行
Open WebUI は、R1 の実行方法についてのステップごとのチュートリアルをこちらで公開しています: https://docs.openwebui.com/tutorials/integrations/llm-providers/deepseekr1-dynamic
GGUF で Ollama を使って推論したい場合は、まず以下のコードのように 3 つの分割 GGUF ファイルを 1 つにまとめる必要があります。その後、モデルをローカルで実行します。
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 の対応表:
<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
モデル内の元のトークン:
<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 表
最終更新
役に立ちましたか?

