Skills MCP Model 博客 提交 Skills

DeepSeek 推論高速化徹底チュートリアル

DeepSeekモデルの推論高速化技術を完全に習得。vLLM、SGLang、TensorRT-LLM、llama.cppの4大エンジンを徹底比較、デプロイからチューニング、シングルGPUから分散まで、完全な推論高速化ソリューション。

学習を始める

なぜ推論高速化が必要か?

DeepSeek-V3は671Bのパラメータを持ち、DeepSeek-R1は強化学習によって推論能力を強化しています。このような巨大なモデルをネイティブのPyTorchで推論すると効率が極めて低くなります。専用の推論エンジンは、KV Cache最適化、Continuous Batching、量子化圧縮、オペレータ融合などの技術により、推論スループットを10〜50倍に向上させ、レイテンシを80%以上削減できます。

推論エンジン概要

推論エンジンは、学習済みモデルの重みと本番環境の推論リクエストを結びつける中間層です。メモリ管理、バッチスケジューリング、計算最適化を担当し、推論性能とコストを決定する中核コンポーネントです。

推論性能の主要指標

スループット 単位時間あたりに処理されるトークン数(tokens/s)。システム全体の処理能力を示し、高いほど良い。
最初のトークンまでの時間 (TTFT) リクエスト送信から最初のトークンを受信するまでの時間。ユーザーエクスペリエンスに影響する重要な指標。
トークンあたりの出力時間 (TPOT) 各トークンの生成にかかる平均時間。ストリーミング出力の滑らかさに影響します。
VRAM使用量 モデルのロードと推論中に使用されるGPUメモリ(GB)。デプロイ可能なモデルサイズとバッチサイズに直接影響します。

主要な推論エンジンのエコシステム

エンジン 開発元 主な利点 適用シナリオ
vLLM UC Berkeley PagedAttentionによるメモリ管理、非常に高いスループット 本番環境のAPIサービス
SGLang Stanford/LMSYS RadixAttentionによるプレフィックスキャッシュ、構造化生成 マルチターン対話、エージェントシナリオ
TensorRT-LLM NVIDIA 極限のGPU最適化、FP8/INT4量子化 NVIDIA GPUでの最高性能
llama.cpp ggerganov CPU/GPUハイブリッド推論、GGUF量子化 パソコン、エッジデバイス

推論高速化の中核技術スタック

  • KVキャッシュ管理:計算済みのKey-Value行列をキャッシュし、重複計算を回避。PagedAttentionはKVキャッシュをページ単位で管理し、メモリ使用効率を2〜4倍向上させます。
  • Continuous Batching:動的バッチ処理。リクエスト完了後すぐに新しいリクエストに置き換え、GPU使用率を高い状態に保ちます。
  • 量子化:FP16重みをINT8/INT4/FP8に圧縮し、メモリ使用量を50%〜75%削減、精度低下は最小限。
  • カーネル融合:複数のCUDAカーネルを1つに統合し、メモリ読み書きを削減、計算効率を向上。
  • テンソル並列:単一レイヤーの重みを複数のGPUに分割し、単一GPUのメモリ制限を突破。
  • 投機的デコーディング:小さいモデルで候補トークンを高速生成し、大きいモデルで検証、2〜3倍高速化。

選定のアドバイス

本番環境のAPIサービスにはvLLMが最適です。マルチターン対話やエージェントシナリオにはSGLangを推奨。極限のGPU性能を求めるならTensorRT-LLM。パソコンやエッジデバイスにはllama.cppを使用してください。モデルの詳細はDeepSeekモデルアーキテクチャ詳細をご覧ください。

vLLM で DeepSeek をデプロイ

vLLM は、UC Berkeley が開発した現在最も人気のあるオープンソース推論エンジンです。その中核となる革新である PagedAttention は、KV Cache をオペレーティングシステムのページングのように管理し、GPU メモリ使用効率を 2〜4 倍、スループットを 10〜30 倍向上させます。

PagedAttention の原理

従来の推論エンジンは、各リクエストに対して連続した GPU メモリを事前割り当てして KV Cache を格納するため、深刻なメモリ断片化と無駄が発生します(使用率はわずか 20%〜40%)。PagedAttention は KV Cache を固定サイズのブロックに分割し、オンデマンドで割り当て、動的にマッピングすることで、メモリ使用率を 96% 以上に達します。

  • KV Cache のブロック化: 各ブロックは固定数のトークンの Key と Value ベクトルを格納
  • オンデマンド割り当て: リクエスト到着時にのみブロックを割り当て、連続空間を事前割り当てしない
  • メモリ共有: 並列サンプリングやビームサーチのシナリオでは、同じプロンプトの KV Cache を共有可能
  • コピーオンライト: 書き込み時にのみブロックをコピーし、共有を最大化

vLLM のインストールと設定

# vLLM のインストール(pip 推奨) pip install vllm # ソースからインストール(最新機能を取得) git clone https://github.com/vllm-project/vllm.git cd vllm pip install -e . # インストールの確認 python -c "import vllm; print(vllm.__version__)"

DeepSeek-V3/R1 デプロイコマンド

DeepSeek-V3 と R1 は 671B パラメータの MoE モデルであり、複数 GPU でのデプロイが必要です。以下は vLLM を使用した完全なデプロイコマンドです:

# DeepSeek-V3/R1 671B 複数 GPU デプロイ(8x A100/H100 80GB) vllm serve deepseek-ai/DeepSeek-V3 \ --tensor-parallel-size 8 \ --max-model-len 8192 \ --gpu-memory-utilization 0.95 \ --max-num-seqs 256 \ --enable-prefix-caching \ --trust-remote-code # DeepSeek-R1 蒸留版デプロイ(単一 A100 80GB) vllm serve deepseek-ai/DeepSeek-R1-Distill-Llama-70B \ --tensor-parallel-size 1 \ --max-model-len 4096 \ --gpu-memory-utilization 0.90 \ --dtype bfloat16 \ --trust-remote-code # DeepSeek-R1-Distill-Qwen-32B(単一 RTX 4090 24GB) vllm serve deepseek-ai/DeepSeek-R1-Distill-Qwen-32B \ --max-model-len 4096 \ --gpu-memory-utilization 0.85 \ --dtype float16 \ --trust-remote-code

vLLM パフォーマンスチューニングパラメータ

パラメータ 説明 推奨値
--max-num-seqs 最大同時リクエスト数 128-256
--max-num-batched-tokens 1 回のバッチ処理あたりの最大トークン数 8192-16384
--gpu-memory-utilization GPU メモリ使用率の上限 0.90-0.95
--enable-prefix-caching プレフィックスキャッシュを有効化(共有プロンプトは KV Cache を自動再利用) 有効
--enable-chunked-prefill チャンク化プリフィル、長いプロンプトが他のリクエストをブロックしない 有効

Python API 呼び出し例

from openai import OpenAI # vLLM はデフォルトで OpenAI 互換 API を提供 client = OpenAI( base_url="http://localhost:8000/v1", api_key="not-needed", ) response = client.chat.completions.create( model="deepseek-ai/DeepSeek-V3", messages=[ {"role": "system", "content": "あなたはプロのプログラミングアシスタントです。"}, {"role": "user", "content": "Python でクイックソートアルゴリズムを実装してください。"}, ], temperature=0.7, max_tokens=2048, stream=True, ) for chunk in response: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="")

ヒント

vLLM の OpenAI 互換 API は、コードロジックを変更することなく、OpenAI SDK を使用する任意のアプリケーションを直接置き換えることができます。本番環境では、Nginx を使用したロードバランシングとレート制限を推奨します。

SGLang で DeepSeek をデプロイ

SGLang は、スタンフォード大学と LMSYS 組織が共同開発した、LLM サービスのための次世代推論エンジンです。その中核となるイノベーションである RadixAttention と構造化生成言語は、複雑なプロンプトシナリオにおいて vLLM を大幅に上回る性能を発揮します。

RadixAttention の原理

RadixAttention は、プレフィックスツリー(基数木)に基づく KV キャッシュの自動再利用技術です。従来の KV キャッシュはリクエスト単位でのみ再利用可能でしたが、RadixAttention は異なるリクエスト間の共通プレフィックスを自動的に識別してキャッシュを再利用するため、Few-shot 学習、マルチターン対話、エージェントなどのシナリオで大幅な性能向上を実現します。

  • プレフィックスツリーストレージ: すべてのリクエストの KV キャッシュはプレフィックスごとにツリー構造で編成されます
  • 自動マッチング: 新しいリクエストが到着すると、最長の共通プレフィックスを自動的にマッチングし、KV キャッシュを再利用します
  • LRU 退避: LRU 戦略を使用してキャッシュを管理し、メモリ制限下でキャッシュヒット率を最大化します
  • 設定不要: RadixAttention は完全に自動で動作し、手動でのプレフィックス設定は不要です

SGLang のインストールと設定

# SGLang のインストール(pip 推奨) pip install sglang[all] # またはソースからインストール git clone https://github.com/sgl-project/sglang.git cd sglang pip install -e "python[all]" # インストールの確認 python -c "import sglang; print(sglang.__version__)"

DeepSeek デプロイコマンド

# DeepSeek-V3 マルチ GPU デプロイ(8x H100 80GB) python -m sglang.launch_server \ --model deepseek-ai/DeepSeek-V3 \ --tp 8 \ --context-length 8192 \ --mem-fraction-static 0.85 \ --enable-radix-cache # DeepSeek-R1 蒸留版(2x A100 80GB) python -m sglang.launch_server \ --model deepseek-ai/DeepSeek-R1-Distill-Llama-70B \ --tp 2 \ --context-length 4096 \ --mem-fraction-static 0.90 # DeepSeek-Coder-V2 コード推論(シングル H100) python -m sglang.launch_server \ --model deepseek-ai/DeepSeek-Coder-V2-Instruct \ --tp 1 \ --context-length 16384 \ --dtype bfloat16 \ --enable-radix-cache

SGLang フロントエンドプログラミング言語

SGLang は DSL(ドメイン固有言語)を提供し、Python で複雑な LLM 対話ロジックを宣言的に記述でき、プレフィックスキャッシュや並列呼び出しなどの最適化を自動的に実装します:

import sglang as sgl @sgl.function def multi_turn_chat(s, system_prompt, user_question): # システムプロンプトは自動的にキャッシュされ、マルチターン対話で再利用されます s += sgl.system(system_prompt) s += sgl.user(user_question) s += sgl.assistant(sgl.gen("answer", max_tokens=1024)) # 複数ブランチの並列呼び出し @sgl.function def parallel_eval(s, question): s += sgl.system("以下のプランを評価してください。") s += sgl.user(question) # 3 つの次元で評価を並列生成 s += sgl.fork(3) s += sgl.gen("score", max_tokens=10, regex=r"\d+\.\d+") s += sgl.gen("reason", max_tokens=200) s += sgl.gen("suggestion", max_tokens=200) s += sgl.join() # ランタイムバックエンドの設定 runtime = sgl.Runtime(model_path="deepseek-ai/DeepSeek-V3") sgl.set_default_backend(runtime) # 実行 state = multi_turn_chat.run( system_prompt="あなたはプロのプログラミングアシスタントです。", user_question="PagedAttention の原理を説明してください。", ) print(state["answer"])

プレフィックスキャッシュ最適化の効果

シナリオ キャッシュなし TTFT キャッシュあり TTFT 高速化
マルチターン対話(5 ターン) 450ms 120ms 3.75x
Few-shot プロンプト(10-shot) 820ms 150ms 5.46x
エージェントツール呼び出し 380ms 90ms 4.22x

TensorRT-LLM による DeepSeek のデプロイ

TensorRT-LLM は NVIDIA 公式の推論エンジンで、CUDA および TensorRT エコシステムと深く統合されています。グラフ最適化、カーネルの自動チューニング、量子化技術により、NVIDIA GPU 上で最高の推論パフォーマンスを実現します。

TensorRT-LLM の主要機能

  • グラフ最適化: レイヤー融合、定数畳み込み、デッドコード除去などの計算グラフ最適化を自動実行
  • カーネルの自動チューニング: 特定の GPU アーキテクチャ(H100/A100/L40S)に最適な CUDA カーネルを自動選択
  • FP8 ネイティブサポート: H100 の FP8 Tensor Core アクセラレーションにより、スループットが 2 倍に
  • INT4/INT8 量子化: Weight-Only および SmoothQuant 量子化スキームをサポート
  • インフライトバッチ処理: NVIDIA による Continuous Batching の実装で、レイテンシが低減

TensorRT-LLM のインストール

# Docker から始める(環境問題を避けるため推奨) docker pull nvcr.io/nvidia/tritonserver:24.06-trtllm-python-py3 # コンテナを実行 docker run --gpus all -it --rm \ -v /path/to/models:/models \ nvcr.io/nvidia/tritonserver:24.06-trtllm-python-py3 # またはコンテナ内で pip インストール pip install tensorrt_llm -U --extra-index-url https://pypi.nvidia.com

モデルのコンパイルと変換

TensorRT-LLM では、まず Hugging Face モデルを TensorRT Engine 形式に変換する必要があります:

# ステップ 1: TensorRT-LLM チェックポイント形式に変換 python convert_checkpoint.py \ --model_dir deepseek-ai/DeepSeek-R1-Distill-Llama-70B \ --output_dir ./trt_checkpoints \ --dtype bfloat16 \ --tp_size 2 # ステップ 2: TensorRT Engine をビルド trtllm-build \ --checkpoint_dir ./trt_checkpoints \ --output_dir ./trt_engines \ --gemm_plugin bfloat16 \ --max_batch_size 64 \ --max_input_len 4096 \ --max_output_len 2048 \ --max_num_tokens 8192 \ --use_fp8_context_fmha enable # ステップ 3: 推論サービスを実行 python run.py \ --engine_dir ./trt_engines \ --tokenizer_dir deepseek-ai/DeepSeek-R1-Distill-Llama-70B \ --max_output_len 2048 \ --enable_triton_backend

DeepSeek FP8 量子化推論

H100 GPU はネイティブ FP8 計算をサポートしており、TensorRT-LLM と組み合わせることで、ほぼロスレスな量子化推論を実現できます:

# FP8 量子化変換(キャリブレーションデータが必要) python quantize.py \ --model_dir deepseek-ai/DeepSeek-R1-Distill-Llama-70B \ --dtype bfloat16 \ --qformat fp8 \ --kv_cache_dtype fp8 \ --output_dir ./trt_checkpoints_fp8 \ --calib_size 512 \ --tp_size 2 # FP8 Engine をビルド trtllm-build \ --checkpoint_dir ./trt_checkpoints_fp8 \ --output_dir ./trt_engines_fp8 \ --gemm_plugin fp8 \ --max_batch_size 128 \ --max_input_len 4096 \ --max_output_len 2048 \ --use_fp8_context_fmha enable # FP8 推論: メモリ半分、スループット 2 倍 python run.py \ --engine_dir ./trt_engines_fp8 \ --tokenizer_dir deepseek-ai/DeepSeek-R1-Distill-Llama-70B \ --max_output_len 2048

INT4 Weight-Only 量子化

メモリが制約されたシナリオでは、INT4 量子化によりモデルサイズを 75% 削減できます:

# INT4 Weight-Only 量子化 python quantize.py \ --model_dir deepseek-ai/DeepSeek-R1-Distill-Qwen-32B \ --dtype float16 \ --qformat int4_awq \ --group_size 128 \ --output_dir ./trt_checkpoints_int4 \ --calib_size 128 # INT4 Engine をビルド trtllm-build \ --checkpoint_dir ./trt_checkpoints_int4 \ --output_dir ./trt_engines_int4 \ --gemm_plugin int4 \ --max_batch_size 64 \ --max_input_len 4096 \ --max_output_len 2048 # INT4 推論: 32B モデルは約 16GB の VRAM のみで、RTX 4090 で実行可能

TensorRT-LLM の適用シナリオ

TensorRT-LLM は、純粋な NVIDIA GPU 環境で最高の推論パフォーマンスを追求する本番シナリオに最適です。欠点は、デプロイプロセスが複雑でモデルコンパイルのステップが必要なこと、vLLM や SGLang よりも柔軟性が低いことです。推論プラットフォームとして Triton Inference Server を使用する場合、TensorRT-LLM が推奨バックエンドです。

llama.cpp ローカル推論

llama.cpp は、純粋な C/C++ で実装された推論エンジンで、CPU とエッジデバイス向けに最適化されています。GGUF 量子化フォーマットにより、ハイエンド GPU を必要とせず、通常のノートパソコンで DeepSeek 蒸留モデルを実行できます。

GGUF 量子化フォーマット

GGUF(GGML Unified Format)は、llama.cpp で使用されるモデルファイル形式で、複数の量子化レベルをサポートしています:

量子化タイプ ビット幅 ファイルサイズ比 品質 推奨シナリオ
Q4_K_M ~4.5 bit ~25% 優秀 コストパフォーマンス最良、最初の選択として推奨
Q5_K_M ~5.5 bit ~30% 非常に良い より高品質を求める場合
Q8_0 8 bit ~50% ほぼ無損失 VRAM が十分にある場合
IQ3_M ~3.5 bit ~20% 良好 VRAM が極端に限られている場合

llama.cpp のインストール

# macOS(Homebrew を使用) brew install llama.cpp # Linux / Windows(ソースからコンパイル) git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make -j # CUDA アクセラレーションを有効化 make -j GGML_CUDA=1 # Apple Metal アクセラレーションを有効化(macOS) make -j GGML_METAL=1 # Python バインディングをインストール pip install llama-cpp-python # CUDA 対応の Python バインディング CMAKE_ARGS="-DGGML_CUDA=on" pip install llama-cpp-python

DeepSeek モデル GGUF のダウンロードとデプロイ

# GGUF 形式の DeepSeek 蒸留モデルをダウンロード(Qwen-32B を例に) # Hugging Face から Q4_K_M 量子化バージョンをダウンロード wget https://huggingface.co/unsloth/DeepSeek-R1-Distill-Qwen-32B-GGUF/resolve/main/DeepSeek-R1-Distill-Qwen-32B-Q4_K_M.gguf # コマンドライン推論 ./llama-cli \ -m DeepSeek-R1-Distill-Qwen-32B-Q4_K_M.gguf \ -p "MoE(Mixture of Experts)アーキテクチャの原理を説明してください。" \ -n 512 \ -t 8 \ --temp 0.7 \ --top-p 0.9 # OpenAI 互換 API サーバーを起動 ./llama-server \ -m DeepSeek-R1-Distill-Qwen-32B-Q4_K_M.gguf \ --host 0.0.0.0 \ --port 8080 \ -ngl 99 \ -c 4096 \ -t 8

Python バインディング呼び出し

from llama_cpp import Llama # モデルのロード llm = Llama( model_path="./DeepSeek-R1-Distill-Qwen-32B-Q4_K_M.gguf", n_ctx=4096, # コンテキスト長 n_threads=8, # CPU スレッド数 n_gpu_layers=99, # GPU アクセラレーション層数(-1 = すべて) verbose=False, ) # 推論 response = llm.create_chat_completion( messages=[ {"role": "user", "content": "Python で二分探索アルゴリズムを書いてください。"}, ], temperature=0.7, max_tokens=512, stream=True, ) for chunk in response: if "choices" in chunk: delta = chunk["choices"][0].get("delta", {}) print(delta.get("content", ""), end="")

Apple Silicon (Metal) 最適化

llama.cpp は Apple Silicon チップ(M1/M2/M3/M4)向けに特別な Metal 最適化を備えており、ユニファイドメモリアーキテクチャを活用して GPU アクセラレーションを実現します:

# macOS でコンパイル時に Metal を有効化 make -j GGML_METAL=1 # 実行時に GPU 層数を指定 ./llama-cli \ -m DeepSeek-R1-Distill-Qwen-14B-Q4_K_M.gguf \ -p "Transformer の Self-Attention メカニズムを説明してください。" \ -ngl 99 \ -c 4096 \ -n 512 # M3 Max (36GB) は Qwen-32B Q4_K_M を実行可能 # M2 Ultra (64GB) は Qwen-72B Q4_K_M を実行可能

パソコンへのデプロイガイド

ハードウェア構成 推奨モデル 量子化 期待速度
16GB RAM + RTX 4060 DeepSeek-R1-Distill-Qwen-7B Q4_K_M 30-50 tok/s
32GB RAM + RTX 4090 DeepSeek-R1-Distill-Qwen-32B Q4_K_M 20-35 tok/s
M3 Max 36GB DeepSeek-R1-Distill-Qwen-32B Q4_K_M 15-25 tok/s
M2 Ultra 64GB DeepSeek-R1-Distill-Llama-70B Q4_K_M 8-15 tok/s

推論エンジンの性能比較

4つの推論エンジンは、さまざまなシナリオで性能に大きな差があります。以下のベンチマークデータは、DeepSeek-R1-Distill-Llama-70Bモデルを2x A100 80GBでバッチサイズ64でテストしたものです。

スループット比較(tokens/s)

エンジン 入力128トークン 入力512トークン 入力2048トークン 出力256トークン
vLLM (FP16) 3,420 2,890 2,150 2,680
SGLang (FP16) 3,510 3,120 2,380 2,920
TensorRT-LLM (FP8) 5,820 4,950 3,680 4,580
llama.cpp (Q4) 580 420 280 380

レイテンシ比較(TTFT、ms)

エンジン アイドルTTFT 16並列TTFT 64並列TTFT TPOT
vLLM (FP16) 85ms 210ms 580ms 32ms
SGLang (FP16) 72ms 185ms 510ms 28ms
TensorRT-LLM (FP8) 80ms 195ms 530ms 30ms
llama.cpp (Q4) 1,250ms 2,800ms 8,500ms 180ms

GPUメモリ使用量比較(GB)

エンジン モデル重み KVキャッシュ その他オーバーヘッド 合計
vLLM (FP16) 140GB 12GB 4GB 156GB
SGLang (FP16) 140GB 10GB 4GB 154GB
TensorRT-LLM (FP8) 70GB 6GB 3GB 79GB
llama.cpp (Q4) 38GB 4GB 2GB 44GB

ベンチマーク結論

  • TensorRT-LLM FP8はNVIDIA GPU上でスループットが最も高く、メモリ使用量が最も少ない。
  • SGLangは長いコンテキストやマルチターン会話シナリオで最も低いレイテンシを実現(RadixAttentionの利点)。
  • vLLMはエコシステムが最も成熟し、コミュニティが最も活発で、デプロイが最も簡単です。
  • llama.cppはGPU環境では前述の3つよりも性能が大幅に劣りますが、CPUやエッジデバイスでは最良の体験を提供します。

量子化推論の詳細

量子化は推論高速化において最も重要な技術の一つです。モデルの重みの数値精度を下げることで、メモリ使用量を50%〜75%削減でき、精度損失は通常1%以内に抑えられます。

量子化手法の比較

量子化手法 ビット幅 圧縮率 精度損失 対応エンジン
AWQ INT4 4倍 < 0.5% vLLM, TensorRT-LLM, SGLang
GPTQ INT4 4倍 < 1% vLLM, TensorRT-LLM
GGUF 2-8ビット 2-8倍 < 1% (Q4+) llama.cpp
FP8 8ビット 2倍 ほぼ無損失 TensorRT-LLM (H100)
SmoothQuant INT8 2倍 < 0.5% TensorRT-LLM

AWQ量子化の原理と使用方法

AWQ(Activation-aware Weight Quantization)は、アクティベーションの分布を分析し、重要な重みチャネルを特定して保護することで、キャリブレーションなしで高精度なINT4量子化を実現します:

# AutoAWQのインストール pip install autoawq # AWQ量子化(DeepSeek-R1-Distill-Qwen-32Bの例) from awq import AutoAWQForCausalLM from transformers import AutoTokenizer model_path = "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B" quant_path = "DeepSeek-R1-Distill-Qwen-32B-AWQ" # モデルの読み込み model = AutoAWQForCausalLM.from_pretrained(model_path) tokenizer = AutoTokenizer.from_pretrained(model_path) # 量子化設定 quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM", } # 量子化の実行 model.quantize(tokenizer, quant_config=quant_config) # 量子化モデルの保存 model.save_quantized(quant_path) tokenizer.save_pretrained(quant_path) # vLLMでAWQ量子化モデルを使用 # vllm serve ./DeepSeek-R1-Distill-Qwen-32B-AWQ --quantization awq

メモリ節約の計算

モデル FP16メモリ FP8メモリ INT4メモリ 削減率
DeepSeek-V3 (671B) 1,342 GB 671 GB 336 GB 75%
R1-Distill-Llama-70B 140 GB 70 GB 35 GB 75%
R1-Distill-Qwen-32B 64 GB 32 GB 16 GB 75%
R1-Distill-Qwen-7B 14 GB 7 GB 3.5 GB 75%

量子化の精度損失分析

  • FP8: 精度損失はほぼゼロ(< 0.1%)です。FP8は浮動小数点表現を使用し、ダイナミックレンジが大きいためです。ただし、H100/H200などFP8対応ハードウェアが必要です。
  • INT8 (SmoothQuant): 精度損失は< 0.5%で、アクティベーションの外れ値を平滑化することで実現します。汎用性が高く、A100/H100の両方で使用できます。
  • INT4 (AWQ):精度損失 < 0.5%、アクティベーション値の分布を分析して重要なチャネルを保護します。現在最も推奨されるINT4ソリューション
  • INT4 (GPTQ):精度損失 < 1%、キャリブレーションデータが必要ですが、量子化プロセスはより安定しています
  • Q4_K_M (GGUF):精度損失 < 1%、llama.cppエコシステムで広く使用され、コストパフォーマンスが最も高い

量子化選定の推奨事項

H100をお持ちの場合はFP8を優先(スループットが最も高い);A100環境ではAWQ INT4を推奨(VRAM節約効果が顕著で精度も高い);個人PCではGGUF Q4_K_M(ファイルサイズが小さく、互換性が良い)。VRAMを75%削減することで、同じモデルをはるかに少ないGPUでデプロイできるか、同じハードウェアでより多くの同時ユーザーにサービスを提供できます。

バッチ処理と並行性の最適化

バッチ処理は推論エンジンのスループットを決定する中核要素です。静的バッチ処理からContinuous Batching、そしてChunked Prefillへと、バッチ処理技術の進化は毎回顕著な性能向上をもたらしました。

3つのバッチ処理方式の比較

バッチ処理方式 原理 GPU使用率 適用エンジン
Static Batching 固定数のリクエストを待ってからまとめて処理し、最も遅いリクエストが完了するまで解放しない 低(30-50%) HuggingFace TGI(旧版)
Dynamic Batching リクエストが到着次第バッチに追加されるが、すべてのリクエストが完了するまで解放しない 中(50-70%) ONNX Runtime
Continuous Batching 各トークン生成後に即座にチェックし、完了したリクエストは即座にバッチから削除され、新しいリクエストは即座に追加される 高(80-95%) vLLM, SGLang, TensorRT-LLM

Continuous Batchingのワークフロー

  • イテレーションレベルのスケジューリング:シーケンス全体の完了を待つのではなく、各トークン生成後にバッチキューを再評価する
  • 即時置換:リクエストが完了したら即座にバッチから削除し、GPUリソースを待機中の新しいリクエストに即座に割り当てる
  • プリエンプティブスケジューリング:優先度キューをサポートし、高優先度のリクエストが低優先度のリクエストの計算リソースを横取りできる
  • 公平なスケジューリング:長いシーケンスのリクエストが短いシーケンスのリクエストを枯渇させないように、ラウンドロビンや重み付けスケジューリングで公平性を保証する

Chunked Prefillの最適化

ユーザーが長いプロンプト(例:100Kトークンの文書分析)を送信すると、Prefillフェーズが大量の計算リソースを消費し、他のリクエストを待たせます。Chunked Prefillは長いプロンプトのPrefillを複数の小さなチャンクに分割し、Decodeリクエストと交互に実行します:

# vLLMでChunked Prefillを有効化 vllm serve deepseek-ai/DeepSeek-V3 \ --enable-chunked-prefill \ --max-num-batched-tokens 8192 \ --tensor-parallel-size 8 # SGLangでChunked Prefillを有効化 python -m sglang.launch_server \ --model deepseek-ai/DeepSeek-V3 \ --chunked-prefill-size 4096 \ --tp 8

同時ユーザー数最適化戦略

戦略 説明 効果
max-num-seqs 最大同時シーケンス数を設定。VRAM容量に応じて調整 128-256が最適
キューイングポリシー FIFO(先入れ先出し)vs Priority(優先度)vs Shortest-Job-First SJFが平均遅延最小
リクエストレート制限 APIゲートウェイで同時リクエスト数を制限し、過負荷を防止 安定性向上
タイムアウトとリトライ 適切なタイムアウト(30-60秒)を設定し、指数バックオフリトライを併用 ユーザー体験の改善

リクエストスケジューリングエンジンの設定

# vLLMスケジューラ設定例 vllm serve deepseek-ai/DeepSeek-V3 \ --scheduler-policy priority \ # 優先度スケジューリング --max-num-seqs 256 \ # 最大同時シーケンス数 --max-num-batched-tokens 16384 \ # 1バッチあたりの最大トークン数 --max-paddings 256 \ # 最大パディング比率 --enable-prefix-caching \ # プレフィックスキャッシュ --enable-chunked-prefill \ # チャンク化プリフィル --max-num-on-the-fly 16 # 同時プリフィルリクエスト数

分散推論

DeepSeek-V3は671Bのパラメータを持ち、INT4量子化でも336GBのVRAMが必要で、単一GPUの容量をはるかに超えます。分散推論は、複数のGPUとノードを協調させることで、超大規模モデルの推論を可能にします。

テンソル並列

テンソル並列は、単一のTransformer層の重み行列を列方向または行方向に複数のGPUに分割します。各GPUは一部を計算し、AllReduce通信で結果を集約します:

  • 列分割:重み行列Wを列方向に[W1, W2, ..., Wn]に分割。各GPUはW_iを保持し、それぞれ計算後、AllReduceで集約
  • 行分割:重み行列を行方向に分割。各GPUは部分出力を計算し、AllGatherで結合
  • 通信オーバーヘッド:各Transformer層で2回のAllReduceが必要で、NVLink帯域幅への要求が高い。NVLinkで相互接続されたGPUグループを推奨
  • 最適なGPU数:通常2〜8枚。8枚を超えると通信オーバーヘッドが計算利得を上回り始める

パイプライン並列

パイプライン並列は、モデルを層単位で複数のGPUに分割し、パイプラインを形成します。GPU0は最初のN層、GPU1は中間のN層、GPU2は最後のN層を処理します:

  • 層単位分割:通信はパイプラインステージの境界でのみ発生し、通信量はテンソル並列よりはるかに少ない
  • マイクロバッチ:大きなバッチを複数のマイクロバッチに分割。パイプラインの各ステージは異なるマイクロバッチを同時に処理
  • パイプラインバブル:パイプラインの起動と排出時にGPUアイドル時間が発生。マイクロバッチ数を増やすことでバブル比率を削減
  • 適用シナリオ:ノード間推論(ノード間帯域幅が限られている)、テンソル並列と組み合わせ可能

DeepSeek-V3 671B分散デプロイメントオプション

オプション GPU構成 並列戦略 期待スループット
8x H100 80GB (FP8) シングルノード8GPU TP=8 3,500 tok/s
16x A100 80GB (FP8) 2ノード x 8GPU TP=8, PP=2 4,800 tok/s
16x A100 80GB (INT4) 2ノード x 8GPU TP=4, PP=4 5,200 tok/s
32x H100 80GB (FP8) 4ノード x 8GPU TP=8, PP=4 8,500 tok/s

vLLM マルチノードデプロイコマンド

# メインノード(Node 0) vllm serve deepseek-ai/DeepSeek-V3 \ --tensor-parallel-size 8 \ --pipeline-parallel-size 2 \ --max-model-len 8192 \ --gpu-memory-utilization 0.95 \ --distributed-executor-backend ray \ --host 0.0.0.0 \ --port 8000 # ワーカーノード(Node 1) # Node 1 で Ray ワーカーを起動し、クラスターに参加 ray start --address='NODE0_IP:6379' # Ray を使用してマルチノード GPU リソースを自動管理 # vLLM は Ray を介してマルチノードスケジューリングを実現し、GPU 割り当ての手動指定は不要

MoE モデルの特別な考慮事項

DeepSeek-V3 は MoE(混合エキスパート)アーキテクチャを採用しており、各トークンは一部のエキスパート(約 37B パラメータ)のみをアクティブ化します。これにより、推論最適化の独自の機会が提供されます:

  • エキスパート並列処理:異なるエキスパートを異なる GPU に分散し、各トークンは一部の GPU のみにアクセスするため、通信量が削減されます。
  • エキスパート負荷分散:補助損失(Auxiliary Loss)や動的ルーティングにより、各エキスパートの負荷を均等化し、アイドル状態の GPU を回避します。
  • エキスパートキャッシュ:人気のあるエキスパートの重みをすべての GPU の VRAM にキャッシュし、GPU 間アクセスを削減します。
  • スパースアクティベーション:各推論で 8 個のエキスパート(全 256 個中)のみをアクティブ化するため、同等パラメータの Dense モデルよりも計算量が大幅に少なくなります。

コスト最適化の実践

GPU 推論コストは AI アプリケーションの最大の費用の一つです。適切な GPU 選定、インスタンス戦略、アーキテクチャ設計により、推論コストを 50%〜80% 削減できます。

クラウド GPU 選定比較

GPU VRAM FP8 サポート オンデマンド価格/時間 適したモデル
H100 80GB 80 GB 対応 $2.50-$3.50 V3 671B (8x), 70B (2x)
A100 80GB 80 GB 非対応 $1.80-$2.50 V3 671B (16x INT4), 70B (2x)
A100 40GB 40 GB 非対応 $1.20-$1.80 32B モデル (単一 GPU), 70B (2x)
L40S 48GB 48 GB 対応 $0.80-$1.20 32B モデル (単一 GPU FP8)
RTX 4090 24GB 24 GB 非対応 自前: ~$0.30 7B/14B モデル

オンデマンド vs リザーブドインスタンス比較

インスタンスタイプ 割引 契約期間 柔軟性 推奨シナリオ
オンデマンド 定価 なし 極めて高い 開発テスト、不確実な負荷
確保済み(Reserved) 40-60% 1〜3年 低い 安定した本番環境
スポット(Spot/Preemptible) 60-90% なし いつでも回収される オフラインバッチ処理、フォールトトレラントなタスク
ハイブリッド戦略 50-70% 柔軟 中程度 確保済みベース + スポットの弾力性

推論コスト計算

# 推論コスト計算式 # 月額コスト = GPU時間単価 x 1時間あたりのGPU数 x 24 x 30 x 稼働率 # 例1: DeepSeek-R1-Distill-Llama-70B をデプロイ # 2x A100 80GB オンデマンドインスタンス、1日18時間使用 # 月額コスト = $2.00 x 2 x 24 x 30 x 0.75 = $2,160/月 # 例2: DeepSeek-V3 671B (FP8) をデプロイ # 8x H100 80GB リザーブドインスタンス、24時間365日稼働 # 月額コスト = $3.00 x 0.5 (リザーブド割引) x 8 x 24 x 30 x 0.90 = $7,776/月 # 例3: DeepSeek-R1-Distill-Qwen-32B (INT4) をデプロイ # 1x A100 40GB スポットインスタンス、24時間365日稼働 # 月額コスト = $1.50 x 0.2 (スポット割引) x 1 x 24 x 30 x 0.85 = $183/月 # DeepSeek 公式APIコストとの比較 # DeepSeek API: $0.27/百万入力トークン + $1.10/百万出力トークン # 1日100万出力トークン: 30 x $1.10 = $33/月 # 中低負荷のシナリオでは、APIを使用する方が自前推論サービスよりはるかに安い

自前 vs クラウドサービス比較

比較項目 自前推論サービス DeepSeek 公式API クラウド推論サービス
初期コスト 高い(GPU購入/レンタル) ゼロ 中程度
運用コスト 高い(専任のメンテナンスが必要) ゼロ 中程度
データプライバシー 完全に制御可能 データは第三者を経由 設定による
高負荷コスト 限界コストが低い 線形に増加 中程度
弾力性スケーリング 限定的 無制限 良好

コスト最適化のベストプラクティス

  • 負荷の階層化:簡単な質問には7B/14B蒸留モデルを使用し、複雑な質問は70B/671B大モデルにルーティングして、コストを60%削減
  • キャッシュ戦略:人気のある質問に回答をキャッシュ(セマンティックキャッシュ)、ヒット率は30〜50%に達し、推論コストを直接削減
  • 量子化によるコスト削減:FP8量子化でメモリを50%削減、INT4で75%削減、同じハードウェアでより多くのユーザーにサービス提供
  • スポットインスタンス:オフラインバッチ処理と非同期タスクにはすべてスポットインスタンスを使用し、コストを60〜90%削減
  • 自動スケーリング:QPSに基づいてGPUインスタンス数を自動調整、オフピーク時には0にスケールダウンし、コストを40〜60%削減
  • チェックポイント:スポットインスタンスが回収されたときにKVキャッシュ状態を保存し、復元後に推論を再開して無駄を回避

コスト最適化の推奨事項

1日あたりのトークン数が100万未満の場合、DeepSeek公式APIを直接使用するのが最も経済的です。1日あたり100万〜1000万トークンの場合、32B/70B蒸留モデルの推論サービスを自前で構築するのがコストパフォーマンスに優れています。1日あたり1000万トークンを超える場合は、量子化とスポットインスタンスを組み合わせた671Bフルモデルのデプロイを検討してください。詳細なデプロイオプションはDeepSeekデプロイチュートリアルをご覧ください。

DeepSeek 推論高速化に関するよくある質問

vLLM と SGLang のどちらを選ぶべきですか? +
一般的な API サービス用途には vLLM(エコシステムが成熟、コミュニティが大きく、ドキュメントが充実)を選びましょう。マルチターン対話や Agent 用途には SGLang(RadixAttention によるプレフィックスキャッシュの利点が顕著で、TTFT が 3〜5 倍短縮)を選びましょう。長いシステムプロンプトとマルチターン対話が中心のビジネスシナリオでは、SGLang がより良い選択です。どちらも OpenAI 互換 API を提供しており、移行コストは非常に低いです。
DeepSeek-V3 671B を実行するには最低何枚の GPU が必要ですか? +
FP16 精度では、少なくとも A100 80GB を 16 枚(TP=8, PP=2)または H100 80GB を 8 枚(TP=8)が必要です。FP8 量子化(H100 のみ対応)は H100 8 枚で実行できます。INT4 量子化は A100 80GB 8 枚(TP=8)で実行できます。AWQ INT4 量子化と Tensor Parallelism を組み合わせると、A100 80GB 4 枚で実行できますが、スループットは大幅に低下します。
量子化後、モデルの品質はどの程度低下しますか? +
FP8 量子化は浮動小数点表現でダイナミックレンジが大きいため、精度損失はほぼゼロ(< 0.1%)です。INT8 量子化(SmoothQuant)の精度損失は < 0.5% です。INT4 量子化(AWQ)の精度損失は < 0.5% で、ほとんどのタスクで差異をほとんど感じません。Q4_K_M(GGUF)の精度損失は < 1% です。DeepSeek 蒸留モデルでは、AWQ INT4 は非常に安全な選択であり、本番環境での使用を推奨します。
RTX 4090 で DeepSeek を実行できますか? +
RTX 4090 24GB は DeepSeek-R1 蒸留モデルを実行できます:7B(Q4 量子化、わずか 4GB)、14B(Q4 量子化、約 9GB)、32B(Q4 量子化、約 16GB + 残りは KV Cache 用)。llama.cpp または Ollama を使用し、GGUF Q4_K_M 量子化形式でデプロイすることを推奨します。70B および 671B モデルは実行できません。RTX 4090 の推論速度は 7B〜32B モデルで優れており、30〜80 tok/s に達します。
Continuous Batching でスループットはどの程度向上しますか? +
静的バッチ処理と比較して、Continuous Batching は GPU 使用率を 30〜50% から 80〜95% に引き上げ、スループットを 2〜5 倍向上させます。リクエスト長の差が大きいシナリオ(短い Q&A と長文生成が混在する場合など)では、その効果は特に顕著です。vLLM、SGLang、TensorRT-LLM はすべてデフォルトで Continuous Batching を使用しており、追加設定は不要です。
推論サービスを自前で構築すべきですか、それとも DeepSeek API を使うべきですか? +
1 日あたりのトークン数が 100 万未満の場合、API の月額費用は約 $33 で、自前 GPU のコスト(最低でも月額 $1,500)をはるかに下回ります。1 日あたり 100 万〜1000 万トークンの場合、自前で 32B/70B 蒸留モデル(スポットインスタンスを併用)を構築する方がコスト面で優れています。1 日あたり 1000 万トークンを超える場合、自前で 671B フルモデルを構築する限界費用が最も低くなります。また、データプライバシー要件が厳しいシナリオでは、必ず自前で構築する必要があります。戦略としては、まず API で製品を検証し、安定したら徐々に自前サービスに移行することをお勧めします。

DeepSeek 関連チュートリアル

DeepSeek モデルの使用方法、デプロイ、エコシステムツールを詳しく学びます。

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

完全免费,取消任意时间。我们不会发送垃圾邮件。