DeepSeek-R1はローカル環境で使用すれば、外部にデータが送信されることなく、安全に利用することが可能です。
HuggingFaceやOllamaからモデルをダウンロードして、ローカル環境にDeepSeek-R1を構築できます。
この記事では、HuggingFace-Transformersで実装する方法と、Ollama-Pythonで実装する方法の2つを紹介します。
ざっくり言うと
- DeepSeek-R1をローカル環境にダウンロードして利用する方法を解説
- HuggingFace-TransformersでDeepSeek-R1を実装する方法を紹介
- Ollama-PythonでDeepSeek-R1を実装する方法を紹介
DeepSeek-R1は、ローカル環境で使える?

HuggingFaceやOllamaを使用することで、DeepSeek-R1をローカル環境にダウンロードして利用できます。
DeepSeek-R1をローカル環境で実行することで、外部のサーバーへデータを送信しなくて済むため、個人情報や機密情報が漏洩するリスクは基本的にありません。
この記事では、HuggingFace-Transformersで構築する方法と、Ollama-Pythonで構築する方法の2つを紹介します。
HuggingFace-Transformers
HuggingFaceからモデルをダウンロードでき、モデルのファインチューニングや量子化など自由度が高い利用が可能です。
Ollama-Python
Ollamaではデフォルトで量子化済みのモデルが提供されているため、簡単に高速な推論を実行可能です。また、OllamaはLangChainにも対応しており、RAG環境での LLM 利用にも適しています。Ollama-Pythonは、OllamaをPythonから操作するためのライブラリです。
DeepSeek-R1をChatGPT風に構築するには?

DeepSeek-R1の日本語モデルとは?

DeepSeek-R1を活用したRAGの構築方法は?

DeepSeekのアプリの使い方は?

DeepSeek-R1の環境構築

この記事で用意した実行環境は以下のとおりです。
- GPU:NVIDIA A100 80GB
- GPUメモリ(VRAM):80GB
- OS :Ubuntu 22.04
- Docker
DeepSeek-R1に必要なGPUメモリは?

Dockerで環境構築
Dockerを使用してDeepSeek-R1の環境構築をします
Dockerの詳しい使い方は?

Ubuntuのコマンドラインで、Dockerfileを作成します。
mkdir deepseekr1-inf
cd deepseekr1-inf
nano Dockerfile
Dockerfileに以下の記述を貼り付けます。
# ベースイメージ(CUDA)の指定
FROM nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04
# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y python3-pip python3-venv git nano curl
# Ollamaをインストール
RUN curl -fsSL https://ollama.com/install.sh | sh
# 作業ディレクトリを設定
WORKDIR /app
# アプリケーションコードをコピー
COPY . /app
# Python仮想環境の作成
RUN python3 -m venv /app/.venv
# 仮想環境をアクティベートするコマンドを.bashrcに追加
RUN echo "source /app/.venv/bin/activate" >> /root/.bashrc
# JupyterLabのインストール
RUN /app/.venv/bin/pip install Jupyter jupyterlab
# PyTorchのインストール
RUN /app/.venv/bin/pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 --index-url https://download.pytorch.org/whl/cu121
# Transformers関連のインストール
RUN /app/.venv/bin/pip install transformers==4.47.0 accelerate bitsandbytes
# Ollama関連のインストール
RUN /app/.venv/bin/pip install ollama==0.4.4
# コンテナの起動時にbashを実行
CMD ["/bin/bash"]
FROM nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04
CUDA12.1のベースイメージを指定しています。
RUN apt-get update && apt-get install -y python3-pip python3-venv git nano curl
Python関連のパッケージをインストールしています。
RUN curl -fsSL https://ollama.com/install.sh | sh
Linux用のOllamaをインストールします。
RUN /app/.venv/bin/pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 --index-url https://download.pytorch.org/whl/cu121
PyTorch関連のパッケージをインストールしています。
RUN /app/.venv/bin/pip install transformers==4.47.0 accelerate bitsandbytes
Transformers関連のパッケージをインストールしています。
RUN /app/.venv/bin/pip install ollama==0.4.4
Python用のOllamaをインストールしています。
docker-compose.ymlでDockerコンテナの設定をします。
docker-compose.ymlのYAMLファイルを作成して開きます。
nano docker-compose.yml
以下のコードをコピーして、YAMLファイルに貼り付けます。
services:
deepseekr1-inf:
build:
context: .
dockerfile: Dockerfile
image: deepseekr1-inf
runtime: nvidia
container_name: deepseekr1-inf
ports:
- "8888:8888"
volumes:
- .:/app/deepseekr1-inf
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
command: >
bash -c '/usr/local/bin/ollama serve & /app/.venv/bin/jupyter lab --ip="*" --port=8888 --NotebookApp.token="" --NotebookApp.password="" --no-browser --allow-root'
bash -c '/usr/local/bin/ollama serve
Ollama Serverを起動しています。
PythonのOllamaを使用する際に、Ollama Serverを起動しておく必要がありますので、ご注意ください。
& /app/.venv/bin/jupyter lab --ip="*" --port=8888 --NotebookApp.token="" --NotebookApp.password="" --no-browser --allow-root'
Jupyter Labを8888番ポートで起動しています。
Dockerfileからビルドしてコンテナを起動します。
docker compose up
Dockerの起動後にブラウザの検索窓に”localhost:8888″を入力すると、Jupyter Labをブラウザで表示できます。
localhost:8888
DeepSeek-R1の実装(HuggingFace-Transformers編)

ここでは、HuggingFace-Transformersを使ったDeepSeek-R1の実装方法を紹介します。
その次のセクションでOllamaを使用した実装方法について解説します。
Dockerコンテナで起動した JupyterLab上で、DeepSeek-R1を実装していきます。
DeepSeek-R1のモデル「deepseek-ai/DeepSeek-R1-Distill-Qwen-32B」をダウンロードします。
import torch
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer,BitsAndBytesConfig
model_id = "cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese"
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="cuda",
quantization_config=quantization_config,
)
DeepSeek-R1の他のモデルは?

model_id = "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B"
HuggingFaceからダウンロードするモデルIDを指定します。
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
量子化のパラメータを指定しています。量子化より精度を落とす代わりにGPUメモリを節約できます。
load_in_4bit=True
:4-bit 量子化を有効化しています。
bnb_4bit_quant_type="nf4"
:4-bit 量子化の方式をNormalFloat4に指定しています。
bnb_4bit_compute_dtype=torch.float16
:量子化モデルの計算時のデータ型をbfloat16に指定しています。
tokenizer = AutoTokenizer.from_pretrained(model_id)
指定したモデルに対応するトークナイザーをダウンロードして読み込みます。
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="cuda",
quantization_config=quantization_config,
)
モデルをダウンロードして読み込みます。
torch_dtype=torch.bfloat16
:モデルのデータ型をbfloat16に指定します。
device_map="cuda"
:GPUにモデルに割り当てます。
quantization_config=quantization_config
:量子化のパラメータを渡しています。
DeepSeek-R1のモデルを活用して、実際にテキストを生成してみます。
DEFAULT_SYSTEM_PROMPT = "あなたは日本語で回答するアシスタントです。"
text = """P、Q、Rはそれぞれボールを持っていて、次のことがわかっている。
Ⅰ. 3人合わせて 8 個のボールを持っている。
Ⅱ. P と Q は同じ個数のボールを持っている。
Ⅲ. R は P の 2 倍のボールを持っている。
このとき、R は何個のボールを持っているか?"""
messages = [
{"role": "system", "content": DEFAULT_SYSTEM_PROMPT},
{"role": "user", "content": text},
]
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
token_ids = tokenizer.encode(
prompt, add_special_tokens=False,
return_tensors="pt"
)
with torch.no_grad():
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=4096,
do_sample=True,
temperature=0.7,
)
output = tokenizer.decode(
output_ids.tolist()[0][token_ids.size(1):],
skip_special_tokens=True
)
print(output)
messages = [
{"role": "system", "content": DEFAULT_SYSTEM_PROMPT},
{"role": "user", "content": text},
]
DEFAULT_SYSTEM_PROMPT
にシステムプロンプトが入ります。
text
にユーザープロンプトが入ります。
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
apply_chat_template()
: 会話履歴をモデルが理解しやすいプロンプトの形式に整形します。tokenize=False
: ここでは文字列としてプロンプトを返すため、内部でのトークン化は行いません。add_generation_prompt=True
: モデルが回答を開始する位置を明示するための指示がプロンプトに自動的に追加されます。
token_ids = tokenizer.encode(
prompt, add_special_tokens=False,
return_tensors="pt"
)
生成された文字列を、モデルが処理できるトークンIDに変換します。
add_special_tokens=False
: 特殊トークンを追加しない設定をします。return_tensors="pt"
: 結果を PyTorch のテンソル形式で返します。
with torch.no_grad():
output_ids = model.generate(
token_ids.to(model.device),
max_new_tokens=4096,
do_sample=True,
temperature=0.7,
)
モデルの回答をトークンIDの形式で生成します。
torch.no_grad()
: 推論時は勾配計算を行わず、メモリや計算リソースの消費を抑えます。
token_ids.to(model.device)
: トークンIDをモデルが動作しているデバイス(CPUまたはGPU)に転送します。
max_new_tokens=4096
: 生成する新規トークンの最大数を指定しています。ここでは最大4096トークンまで生成可能です。
do_sample=True
: サンプリングを使って文章を生成する設定です。生成結果に確率的なバリエーションが生まれます。
temperature=0.7
: 値を上げると生成によりランダム性が加わり、値を下げるとより保守的で確定的なテキストが生成されます。
output = tokenizer.decode(
output_ids.tolist()[0][token_ids.size(1):],
skip_special_tokens=True
)
モデルが生成したトークンIDを、人間が読める文字列に変換します。
output_ids
はトークンIDのテンソル形式になっていますので、.tolist()
でPyTorchのテンソルをPythonのリスト形式に変換します。
[token_ids.size(1):]
により、入力プロンプト部分をスライスで除外 し、モデルが新たに生成した部分のみを取得します。
モデルの回答
まず、P、Q、Rが持っているボールの個数をP、Q、Rとします。
条件Ⅰより、P + Q + R = 8です。
条件Ⅱより、P = Qです。
条件Ⅲより、R = 2Pです。
QをPで置き換えると、P + P + 2P = 8となり、4P = 8です。
したがって、P = 2です。
R = 2P = 4です。
</think>
**解答:**
P、Q、Rが持っているボールの個数をそれぞれ \( P \)、\( Q \)、\( R \) とします。
1. **条件Ⅰ:**
\( P + Q + R = 8 \)
2. **条件Ⅱ:**
\( P = Q \)
3. **条件Ⅲ:**
\( R = 2P \)
**解き方:**
- 条件Ⅱより、\( Q = P \) であるので、条件Ⅰを \( P \) で表します:
\[
P + P + R = 8 \quad \Rightarrow \quad 2P + R = 8
\]
- 条件Ⅲより、\( R = 2P \) であるので、上式に代入します:
\[
2P + 2P = 8 \quad \Rightarrow \quad 4P = 8 \quad \Rightarrow \quad P = 2
\]
- したがって、\( R = 2P = 2 \times 2 = 4 \) です。
**答:**
\(\boxed{4}\)
DeepSeek-R1の実装(Ollama-Python編)

ここからOllama-Python使ったDeepSeek-R1実装方法を紹介します。
Dockerコンテナで起動した JupyterLab上で、DeepSeek-R1を実装していきます。
OllamaからDeepSeek-R1のモデル「deepseek-r1:32b」をダウンロードします。
import ollama
ollama.pull('deepseek-r1:32b')
DeepSeek-R1の他のモデルは?

DeepSeek-R1のモデルを活用して、実際にテキストを生成してみます。
DEFAULT_SYSTEM_PROMPT = "あなたは日本語で回答するアシスタントです。"
text ="""
【問題】
X、Y、Zが同じ絵を見てて、次のように発言した。
X この絵には虎が描かれている。
Y この絵には少なくとも虎か龍が描かれている。
Z この絵には龍が描かれている。
全員が本当のことを言っているとは限らない。そこで、以下の推論がなされた。次のうち正しいものを一つ選びなさい。
<選択肢>
Yが正しければXは必ず正しい
Zが正しければYは必ず正しい
Xが正しければZは必ず正しい
"""
response = ollama.chat(model='deepseek-r1:32b', messages=[
{
'role': 'system',
'content': DEFAULT_SYSTEM_PROMPT,
},
{
'role': 'user',
'content': text,
},
])
print(response['message']['content'])
response = ollama.chat(...)
:deepseek-r1:32b’モデルを使用して回答を生成
DEFAULT_SYSTEM_PROMPT
にシステムプロンプトが入ります。
text
にユーザープロンプトが入ります。
モデルの回答
<think>
まず、問題の内容を理解します。X、Y、Zの3人が同じ絵を見ていて、それぞれ次のような発言をしています。
- X: 絵には虎が描かれている。
- Y: 絵には少なくとも虎か龍が描かれている。
- Z: 絵には龍が描かれている。
全員が真実を述べているとは限らないため、以下の推論の中で正しいものを選ばなければなりません。選択肢は3つあります:
1. Yが正しければXは必ず正しい
2. Zが正しければYは必ず正しい
3. Xが正しければZは必ず正しい
次に、各選択肢について分析します。
**第一の選択肢:Yが正しければXは必ず正しい**
- Yの発言は「少なくとも虎か龍が描かれている」です。
- しかし、この発言が真である場合でも、絵に虎のみが描かれている可能性があります。その場合、Xの発言も真となります。
- 反対に、絵に龍のみが描かれている場合でもYの発言は真ですが、Xの発言は偽になります。
- したがって、Yが正しくてもXが必ず正しいとは限らないため、この選択肢は不正解です。
**第二の選択肢:Zが正しければYは必ず正しい**
- Zの発言は「龍が描かれている」です。
- Yの発言は「虎か龍が描かれている」という論理的なORです。したがって、もしZの発言が真であれば(すなわち絵に龍が描かれている)、Yの発言も自動的に真になります。
- 逆に、Zの発言が偽である場合でも、Yの発言が真である可能性があります(例えば虎が描かれている場合)。
- しかし問題は「Zが正しければYは必ず正しい」かどうかについてで、Zが真であればYも真になるため、この選択肢は正解です。
**第三の選択肢:Xが正しければZは必ず正しい**
- Xの発言は「虎が描かれている」です。
- Zの発言は「龍が描かれている」です。これらは独立した事柄で、Xが真である場合でもZが真である必要はありません(例えば絵に虎のみ描かれていた場合)。
- したがって、Xが正しくてもZが必ず正しいとは限らないため、この選択肢も不正解です。
**結論**
分析の結果、第二の選択肢「Zが正しければYは必ず正しい」が唯一正しい推論です。理由はZが真であれば、YのOR条件である虎か龍が描かれていることのどちらかが真になるからです。
</think>
<解答>
**Zが正しければYは必ず正しい**
<解説>
- **Yの発言**:「少なくとも虎か龍が描かれている」。これは、虎または龍の少なくとも一方が描かれていれば成立します。
- **Zの発言**:「龍が描かれている」。もしZが正しく(龍が描かれていた場合)、Yの条件(虎か龍)も当然満たされます。したがって、Zが真であればYも必ず真になります。
<他の選択肢>
1. **Yが正しければXは必ず正しい**:Yが正しくても、龍のみ描かれている場合にXが不正確になるため不成立です。
2. **Xが正しければZは必ず正しい**:Xが正しくても、虎のみ描かれており龙が描かれていない場合もありえるため不成立です。
したがって、唯一正しい選択肢は「Zが正しければYは必ず正しい」です。
DeepSeek-R1をChatGPT風に構築するには?

DeepSeek-R1の日本語モデルとは?

DeepSeek-R1を活用したRAGの構築方法は?

生成AI・LLMのコストでお困りなら
GPUのスペック不足で生成AIの開発が思うように進まないことはありませんか?
そんなときには、高性能なGPUをリーズナブルな価格で使えるGPUクラウドサービスがおすすめです!

GPUSOROBANは、高性能GPU「NVIDIA H200」を業界最安級の料金で使用することができます。
NVIDIA H200は、生成AI・LLMの計算にかかる時間を大幅に短縮することが可能です。
クラウドで使えるため、大規模な設備投資の必要がなく、煩雑なサーバー管理からも解放されます。