所要時間: 約45分 | 難易度: ★★★★☆

この記事で作るもの

  • DeepSeek-V3(671B MoEモデル)を、vLLMを用いてマルチGPU環境でサービングし、OpenAI互換APIとして外部から利用できる環境を構築します。
  • 前提知識: Dockerの基本操作、Python環境構築、Linuxコマンドの基礎。
  • 必要なもの: NVIDIA GPU(VRAM合計200GB以上推奨)、NVIDIA Container Toolkit、十分なストレージ容量(1TB以上の高速NVMe SSD)。

📦 この記事に関連する商品

NVIDIA GeForce RTX 4090

24GB VRAMはローカルLLM運用の最低ラインであり、複数枚挿しで真価を発揮します

Amazonで見る 楽天で見る

※アフィリエイトリンクを含みます

なぜこの方法を選ぶのか

クラウドのAPIを使えば済む話ですが、あえて「自宅のDGXクラス環境」や「マルチGPUサーバー」でDeepSeek-V3を動かす理由は、機密データの漏洩リスクをゼロにし、かつプロンプトの入力トークン制限や検閲から解放されるためです。 これまでLlama 3 70Bクラスを動かしていた層にとって、DeepSeek-V3は「日本語能力」と「論理的思考力」の両面でGPT-4oに匹敵する衝撃を与えました。 しかし、671Bという巨大なパラメータを持つMoE(Mixture of Experts)モデルを「使い物になる速度」で動かすには、llama.cppによるCPU推論では限界があります。 そこで、推論スループットが圧倒的に高いvLLMを採用し、かつ複数のGPUに計算を分散させる「Tensor Parallelism(テンソル並列)」を駆使する構成がベストだと判断しました。 私自身、RTX 4090を2枚挿して検証していますが、この構成に最適化した設定を施すことで、ローカルでも秒間20〜30トークンという「実用的なレスポンス」を叩き出すことが可能です。

Step 1: 環境を整える

まずはGPUを正しく認識し、分散推論を可能にするためのベース環境を作ります。

# NVIDIA Container Toolkitのインストール確認
nvidia-container-runtime --version

# vLLMを動かすための専用ディレクトリ作成
mkdir -p ~/deepseek-v3-local && cd ~/deepseek-v3-local

# モデルをダウンロードするためのHugging Face CLIをインストール
pip install -U "huggingface_hub[cli]"

NVIDIA Container Toolkitは、Dockerコンテナ内からホストのGPUへアクセスするために必須です。 これが入っていないと、コンテナがGPUを見つけられず、CPU推論にフォールバックしてしまいます。 また、DeepSeek-V3のモデルサイズはFP8量子化版でも約700GB〜という巨大なサイズになるため、モデル保存先のストレージは必ずNVMe SSDを指定してください。HDDでは読み込みに数時間かかり、推論時のスワップで実用になりません。

⚠️ 落とし穴: Ubuntu 22.04などでデフォルトのDockerをインストールしている場合、GPUパススルーが設定されていないことがあります。nvidia-smiが通るからといって安心せず、docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smiを実行して、コンテナ内からもGPUが見えるか必ず確認してください。

Step 2: 基本の設定

DeepSeek-V3を動かすためのDocker Composeファイルを準備します。直書きのAPIキーではなく、環境変数を利用する構成にします。

# docker-compose.yml
services:
  vllm:
    image: vllm/vllm-openai:latest
    runtime: nvidia
    ports:
      - "8000:8000"
    volumes:
      - ~/.cache/huggingface:/root/.cache/huggingface
      - ./models:/models
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NCCL_P2P_DISABLE=0 # P2P通信を有効化して速度向上
    command: >
      --model deepseek-ai/DeepSeek-V3
      --tensor-parallel-size 2
      --max-model-len 8192
      --trust-remote-code
      --quantization fp8
      --enforce-eager

--tensor-parallel-sizeは、使用するGPUの数に合わせて調整してください。 例えばRTX 4090を2枚使っているなら「2」にします。 --quantization fp8を指定しているのは、DeepSeek-V3をフル精度で動かすには数TBのVRAMが必要になり、現実的ではないからです。 FP8(8ビット浮動小数点)であれば、精度劣化を最小限に抑えつつ、VRAM消費を大幅に削減できます。 NCCL_P2P_DISABLE=0の設定は、GPU間の高速通信(P2P)を明示的に許可するもので、これがないとGPU間のデータ転送がボトルネックとなり、推論速度が著しく低下します。

Step 3: 動かしてみる

設定が完了したら、コンテナを起動してモデルのロードを開始します。

# モデルのダウンロード(事前に実施しておくと起動がスムーズ)
huggingface-cli download deepseek-ai/DeepSeek-V3 --local-dir ./models --local-dir-use-symlinks False

# コンテナ起動
docker compose up -d

起動後、ログを確認して「Uvicorn running on http://0.0.0.0:8000」と表示されれば成功です。 以下のPythonスクリプトで、APIが正しく応答するかテストします。

import openai

client = openai.OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY" # ローカルなので認証なし
)

response = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V3",
    messages=[
        {"role": "user", "content": "マルチGPU環境での分散推論のメリットを3行で教えて。"}
    ],
    temperature=0.7
)

print(response.choices[0].message.content)

期待される出力

1. VRAMを複数のGPUに分散させることで、単体では載り切らない超巨大モデルを起動できる。
2. テンソル並列化により計算を同時実行し、1トークンあたりの生成時間を大幅に短縮できる。
3. クラウドAPIの制限を受けず、高速なローカル帯域でプライベートな推論環境を維持できる。

結果が返ってくるまで数秒かかる場合は、ログを見てNCCLのタイムアウトが発生していないかチェックしてください。 私の環境では、初回起動時の重みロードに5分ほどかかりましたが、一度ロードしてしまえばレスポンスは一瞬でした。

Step 4: 実用レベルにする

このままでは単なるチャットボットですが、仕事で使うなら「特定の業務知識」を持たせたいところです。 ここでは、既存の社内ドキュメントを読み込ませるRAG(検索拡張生成)への応用を想定し、コンテキストウィンドウを最適化します。

# 実用的なバッチ処理とエラーハンドリングの例
import time
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")

def generate_business_report(task_description):
    try:
        start_time = time.time()

        # DeepSeek-V3のMoE特性を活かすため、少し長めのシステムプロンプトを投入
        response = client.chat.completions.create(
            model="deepseek-ai/DeepSeek-V3",
            messages=[
                {"role": "system", "content": "あなたはSIer出身のシニアエンジニアです。技術的正確性とビジネスの妥当性を厳しくチェックしてください。"},
                {"role": "user", "content": task_description}
            ],
            max_tokens=2048,
            stream=True # ストリーミングでユーザー体験を向上
        )

        print("回答開始: ", end="", flush=True)
        for chunk in response:
            if chunk.choices[0].delta.content:
                print(chunk.choices[0].delta.content, end="", flush=True)

        end_time = time.time()
        print(f"\n\n[計測] 処理時間: {end_time - start_time:.2f}秒")

    except Exception as e:
        print(f"接続エラーが発生しました。vLLMコンテナの状態を確認してください: {e}")

generate_business_report("次世代のAIサーバー構築における冷却システムの重要性について、液冷と空冷を比較して。")

実務で使う上で重要なのは、stream=Trueにすることです。 DeepSeek-V3のような巨大モデルは、最初の1トークン目が出るまでの「Time to First Token (TTFT)」は短くても、全ての文章を生成し終えるまでに時間がかかります。 ストリーミングにすることで、ユーザーは生成されている過程をリアルタイムで見ることができ、体感的な待ち時間を解消できます。 また、SIerでの経験上、こうした巨大モデルは「システムプロンプト」による役割固定が非常に強力に効きます。 あえて「シニアエンジニア」などの役割を明示することで、回答の解像度が一段上がります。

よくあるトラブルと解決法

エラー内容原因解決策
Out of Memory (OOM)--max-model-len が大きすぎる値を4096や8192に下げてVRAM消費を抑える
NCCL Error: P2P failureGPU間のNVLinkまたはPCIe P2Pが未対応NCCL_P2P_DISABLE=1 を環境変数に設定する
Model not foundマウントパスの不一致docker-compose.ymlvolumes 設定を絶対パスで書き直す

次のステップ

ここまでで、DeepSeek-V3という世界最高峰のモデルを、自分の支配下にあるハードウェアで動かす環境が整いました。 次のステップとしては、このAPIを「Open WebUI」のようなGUIフロントエンドと接続することをお勧めします。 Open WebUIを使えば、過去のチャット履歴の保存や、RAGのためのドキュメントアップロードがブラウザ上から直感的に行えるようになります。

さらに上を目指すなら、vLLMの「Lora Adapters」機能を使って、特定の業務に特化させた微調整(Fine-tuning)済みの重みを動的にロードする運用を試してみてください。 DeepSeek-V3は非常に素直なモデルなので、少量の高品質なデータで驚くほど挙動が変わります。 私自身、今は自宅の4090 2枚環境で、自分専用のコーディングアシスタントとしてこのDeepSeekを24時間稼働させていますが、コードレビューの精度はもはや人間を超える場面が多々あります。 皆さんも、この「自分専用の知能」をどう使い倒すか、ぜひ自分なりのユースケースを開拓してください。

よくある質問

Q1: RTX 3060などのミドルレンジGPUでも動かせますか?

DeepSeek-V3(671B)はFP8量子化しても膨大なVRAMを必要とするため、ミドルレンジ1枚では厳しいです。ただし、パラメータを削った「DeepSeek-V3-Small」的なモデル(Distill版)や、Llama 3 8B等であれば12GBのVRAMでも十分に動作します。

Q2: Dockerを使わずに直接Python環境で動かす方が速いですか?

理論上のオーバーヘッドはほぼゼロですが、依存関係(CUDA, NCCL, PyTorch, vLLMのバージョン整合性)の解決が地獄のように難しいため、Dockerを強く推奨します。SIer時代、環境構築の不整合で数日溶かした経験から言える結論です。

Q3: 16x DGXのような超ハイスペック環境で動かす場合の注意点は?

GPU数が8枚を超えると、ノード間通信のボトルネックが顕著になります。--tensor-parallel-size だけでなく、--pipeline-parallel-size を併用して、データの流れを最適化する必要があります。設定を間違うと、GPUを増やしても逆に遅くなる「逆転現象」が起きます。


あわせて読みたい