DeepSeek-R1をローカル環境で安全に使う方法!ダウンロードから構築まで

DeepSeek-R1をローカル環境で安全に使う方法!ダウンロードから構築まで

DeepSeek-R1はローカル環境で使用すれば、外部にデータが送信されることなく、安全に利用することが可能です。

HuggingFaceやOllamaからモデルをダウンロードして、ローカル環境にDeepSeek-R1を構築できます。

この記事では、HuggingFace-Transformersで実装する方法と、Ollama-Pythonで実装する方法の2つを紹介します。

ざっくり言うと

  • DeepSeek-R1をローカル環境にダウンロードして利用する方法を解説
  • HuggingFace-TransformersでDeepSeek-R1を実装する方法を紹介
  • Ollama-PythonでDeepSeek-R1を実装する方法を紹介

2/25開催の無料ウェビナー!

目次

DeepSeek-R1は、ローカル環境で使える?

見出し画像

HuggingFaceやOllamaを使用することで、DeepSeek-R1をローカル環境にダウンロードして利用できます。

DeepSeek-R1をローカル環境で実行することで、外部のサーバーへデータを送信しなくて済むため、個人情報や機密情報が漏洩するリスクは基本的にありません。

この記事では、HuggingFace-Transformersで構築する方法と、Ollama-Pythonで構築する方法の2つを紹介します。

HuggingFace-TransformersとOllama-Python

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の詳しい使い方は?

STEP
Dockerfileの作成

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"]

[Ctrl + S]キーで変更内容を保存し、[Ctrl + X]キーで編集モードから抜けます。

コマンドの説明
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をインストールしています。

STEP
docker-compose.ymlファイルの作成

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'

[Ctrl + S]キーで変更内容を保存し、[Ctrl + X]キーで編集モードから抜けます。

コマンドの説明
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番ポートで起動しています。

STEP
Dockerコンテナを起動

Dockerfileからビルドしてコンテナを起動します。   

docker compose up

 

Dockerの起動後にブラウザの検索窓に”localhost:8888″を入力すると、Jupyter Labをブラウザで表示できます。

localhost:8888

DeepSeek-R1の実装(HuggingFace-Transformers編)

見出し画像

ここでは、HuggingFace-Transformersを使ったDeepSeek-R1の実装方法を紹介します。

その次のセクションでOllamaを使用した実装方法について解説します。

STEP
LLMの設定

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:量子化のパラメータを渡しています。

STEP
DeepSeek-R1を使ったテキスト生成

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実装方法を紹介します。

STEP
LLMの設定

Dockerコンテナで起動した JupyterLab上で、DeepSeek-R1を実装していきます。

OllamaからDeepSeek-R1のモデル「deepseek-r1:32b」をダウンロードします。

import ollama
ollama.pull('deepseek-r1:32b')

status=’success’が表示されたら、モデルのダウンロードが完了です。

DeepSeek-R1の他のモデルは?

STEP
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
GPUSOROBAN

GPUSOROBANは、高性能GPU「NVIDIA H200」を業界最安級の料金で使用することができます。

NVIDIA H200は、生成AI・LLMの計算にかかる時間を大幅に短縮することが可能です。

クラウドで使えるため、大規模な設備投資の必要がなく、煩雑なサーバー管理からも解放されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
EdgeHUBロゴ

メールマガジン登録

Stable Diffusion・LLM・RAGに関する最新情報をいち早くお届けします。

無料メルマガの配信をご希望の方は、下記フォームよりご登録ください。

    EdgeHUB編集部からのお知らせ

    無料ウェビナーのお知らせ

    ウェビナー

    業界を震撼させた革新的LLM「DeepSeek-R1」の使い方を解説する無料ウェビナー!

    開催日時:
    2025年2月25日(火) 11:00~12:00

    内容:

    • DeepSeek-R1のローカル環境での使い方、日本語モデルの解説
    • 業界最安級GPUクラウド「GPUSOROBAN」の紹介・使い方デモ

    このウェビナーでは、「DeepSeek-R1」のデモを交えてGPUクラウドの使い方を紹介します。

    生成AIに関心のある方、AI技術をビジネスに活かしたい方は、ぜひこの貴重な機会にご参加ください!

    こんな方におすすめ!

    • DeepSeek-R1の安全性に不安を感じている方
    • DeepSeek-R1の日本語モデルを使いたい方
    • DeepSeek-R1を使ったRAGの構築方法を知りたい方
    • GPUのコスト、リソースに課題を感じている方

    希望者にはデモで使用したソースコードをプレゼント!

    \簡単30秒で申し込み!/

    この記事を書いた人

    EdgeHUBは、NVIDIAクラウドパートナーである株式会社ハイレゾが運営しています。「AIと共にある未来へ繋ぐ」をテーマに、画像生成AI、文章生成AI、動画生成AI、機械学習・LLM、Stable Diffusionなど、最先端の生成AI技術の使い方をわかりやすく紹介します。

    目次