所要時間: 約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 409024GB VRAMはローカルLLM運用の最低ラインであり、複数枚挿しで真価を発揮します
※アフィリエイトリンクを含みます
なぜこの方法を選ぶのか
クラウドの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 failure | GPU間のNVLinkまたはPCIe P2Pが未対応 | NCCL_P2P_DISABLE=1 を環境変数に設定する |
| Model not found | マウントパスの不一致 | docker-compose.yml の volumes 設定を絶対パスで書き直す |
次のステップ
ここまでで、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を増やしても逆に遅くなる「逆転現象」が起きます。






