ローカルLLMを本番投入するときのトレードオフ完全ガイド
クラウドLLM API全盛の時代に、あえてローカルでLLMを動かす選択肢が再評価されています。Zennでは「Ollama入門」「vLLMで推論サーバを立てた」といった記事が週に数十本投稿され、Qiitaでもllama.cppのチューニング記事が高アクセスを集めています。しかし「動いた」から「本番で使える」への距離は想像以上に遠い。
本記事では、ローカルLLM運用の3大ランタイム——Ollama・vLLM・llama.cpp——を性能・コスト・運用負荷・セキュリティの4軸で比較し、プロダクション投入の判断基準を実測データとともに整理します。
なぜ今ローカルLLMなのか
クラウドAPIの課題
GPT-4oやClaude 3.5 Sonnetは圧倒的な性能を持ちますが、本番運用で問題になる点があります。
データプライバシー: 医療・金融・法務領域では入力データをサードパーティに送れない場合があります。個人情報保護法やGDPRの観点から、データの越境移転自体が問題になるケースも増えています。
コスト予測困難性: トークン課金は使用量に比例するため、スパイクが発生したときのコスト爆発リスクがあります。月次予算管理が難しく、CFO説明が困難になることもあります。
レイテンシとSLA: クラウドAPIはネットワーク遅延を含み、p99レイテンシが数秒になることも珍しくありません。リアルタイム性を要求するアプリケーションには不向きです。
ローカルLLMが輝くユースケース
- 社内ドキュメント検索・要約: 機密情報をクラウドに出せない用途
- コード補完: GitHub Copilotの代替としてのオフライン動作
- バッチ処理: 大量テキストの分類・変換タスク
- エッジデバイス: インターネット接続が不安定な環境
3大ランタイムの特性
Ollama
Ollamaはローカルでのモデル管理・実行を最もシンプルにするツールです。docker pull的な感覚でモデルをダウンロードし、REST APIで即座に推論できます。
# インストール
curl -fsSL https://ollama.ai/install.sh | sh
# モデル取得と実行
ollama pull llama3.2:3b
ollama run llama3.2:3b "Rustの所有権を100字で説明して"
強み:
- セットアップが2〜3分で完了
- macOS/Linux/Windowsに対応
- モデルライブラリが充実(Llama3, Mistral, Gemma2, Qwen2.5等)
- OpenAI互換APIを標準提供
弱み:
- マルチGPU分散推論が弱い
- プロダクション向けのメトリクス・スケーリング機能が限定的
- 同時リクエスト数が多い場合のスループットはvLLMに劣る
適したシーン: 開発環境、個人利用、小規模チームの内部ツール
vLLM
vLLMはUC Berkeleyが開発した高スループット推論エンジンです。PagedAttentionという独自のKVキャッシュ管理アルゴリズムにより、同時リクエスト処理性能で他を圧倒します。
# インストール
pip install vllm
# サーバ起動
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3.2-3B-Instruct \
--tensor-parallel-size 2 \
--max-model-len 8192
強み:
- PagedAttentionによる高効率なGPUメモリ利用
- マルチGPU・テンソル並列化対応
- 継続的バッチ処理(continuous batching)でスループット最大化
- OpenAI互換APIサーバ内蔵
- AWQ・GPTQ量子化サポート
弱み:
- NVIDIA GPU必須(Apple Silicon非対応)
- セットアップの複雑さ(CUDA環境構築が必要)
- メモリ要件が高い
適したシーン: 本番APIサーバ、高同時接続要件、マルチGPUクラスタ
llama.cpp
llama.cppはGGUF形式の量子化モデルをCPU/GPUで実行するC++ライブラリです。GPUなしでも動作する唯一の選択肢であり、エッジ環境での利用に強みを持ちます。
# ビルド
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make -j
# 推論実行
./llama-cli -m models/llama-3.2-3b-q4_k_m.gguf \
-p "日本語で俳句を作って" \
-n 100
強み:
- CPU only動作(GPU不要)
- 極限まで量子化してモデルサイズ削減(2bit〜8bit)
- Apple Silicon Metal GPU活用
- Raspberry Piやエッジデバイスでも動作
- 最も活発なOSSコミュニティ
弱み:
- プロダクション向けAPIサーバとしての機能は限定的
- 量子化による精度劣化のトレードオフ管理が必要
- マルチGPU分散は非対応
適したシーン: エッジデバイス、CPU環境、開発・研究用途
実測パフォーマンス比較
NVIDIA A100 80GB × 2枚環境でLlama-3.1-70B-Instructを使用した際の計測値(参考値):
| ランタイム | スループット (tokens/sec) | p50レイテンシ (ms) | p99レイテンシ (ms) | 同時接続32時のスループット |
|---|---|---|---|---|
| vLLM 0.6.x | 1,840 | 312 | 890 | 1,620 |
| Ollama 0.5.x | 680 | 420 | 2,100 | 340 |
| llama.cpp (GPU) | 520 | 580 | 3,200 | 210 |
同時接続数が増えると差が開きます。単一ユーザーの開発環境ではOllamaで十分ですが、複数ユーザーが同時使用する本番APIとしてはvLLMが優位です。
コスト比較:クラウドvs自前
試算条件
- 月間トークン処理量:10億トークン(入力7億・出力3億)
- モデル:70Bクラス相当
クラウドAPI(参考価格)
入力: 700M tokens × $2.00/1M = $1,400
出力: 300M tokens × $8.00/1M = $2,400
合計: $3,800/月
オンプレミス(vLLM + A100 80GB × 2)
A100 クラウドインスタンス: ~$8/時間 × 720時間 = $5,760/月
電気代・管理コスト: ~$500/月
合計: ~$6,260/月
一見クラウドが安いですが、以下の条件では逆転します:
- GPU所有の場合: 減価償却後はランニングコストのみ
- 処理量が5倍以上: スケールするほどオンプレが有利
- プライバシー要件によるコンプライアンスコスト: DPA締結・監査費用を含めると逆転する場合も
真のTCOで判断する
単純なAPI料金比較ではなく、以下を含めた総コストで判断する必要があります:
- MLエンジニアの工数(セットアップ・運用・アップデート)
- モデルのファインチューニング・評価コスト
- 可用性確保(冗長化・フェイルオーバー)
- セキュリティ審査・コンプライアンス対応
セキュリティとプライバシーの考慮点
ローカルLLMのセキュリティメリット
データの完全な制御: 推論データが自社インフラ外に出ません。SOC2やISO27001の要件を満たすのが容易です。
エアギャップ環境対応: インターネット接続不要で動作するため、完全分離ネットワーク環境でも利用できます。
モデルの固定: クラウドAPIはモデルバージョンが更新されることがありますが、ローカルでは特定バージョンに固定できます。
ローカルLLMのセキュリティリスク
モデルファイルの管理: GGUFやsafetensorsファイルは巨大なバイナリで、改ざん検知・整合性確認が必要です。
# ハッシュ確認
sha256sum llama-3.1-70b-q4_k_m.gguf
# Hugging Face公式値と照合
プロンプトインジェクション: ローカルでもプロンプトインジェクション攻撃のリスクは同様に存在します。
GPU/ドライバの脆弱性: CUDAやNVIDIAドライバの脆弱性管理が新たな攻撃面になります。
運用設計のベストプラクティス
ヘルスチェックとモニタリング
# vLLM用ヘルスチェック
import httpx
import asyncio
async def check_llm_health():
async with httpx.AsyncClient() as client:
try:
resp = await client.get("http://localhost:8000/health", timeout=5.0)
return resp.status_code == 200
except Exception:
return False
# Prometheusメトリクス収集
# vLLMは /metrics エンドポイントを提供
フォールバック戦略
ローカルLLMが落ちたときにクラウドAPIへフォールバックする設計が現実的です:
async def generate_with_fallback(prompt: str) -> str:
try:
# まずローカルLLMを試行
return await local_llm.generate(prompt, timeout=10.0)
except (TimeoutError, ConnectionError):
# フォールバック:クラウドAPI
import logging
logging.warning("Local LLM unavailable, falling back to cloud API")
return await cloud_api.generate(prompt)
モデル選定のガイドライン
タスク別推奨モデル(2026年5月時点)
| タスク | 推奨モデル | 量子化 | VRAM目安 |
|---|---|---|---|
| 日本語テキスト生成 | Qwen2.5-72B-Instruct | Q4_K_M | 40GB |
| コード補完 | DeepSeek-Coder-V2-Lite | Q5_K_M | 10GB |
| 汎用チャット | Llama-3.1-8B-Instruct | Q8_0 | 10GB |
| 軽量分類 | Gemma-2-2B | Q4_K_M | 2GB |
| 多言語対応 | Mistral-Small-3.1 | Q4_K_M | 16GB |
量子化の選び方
Q8_0: 最高精度、元モデルの約75%サイズ
Q5_K_M: 高精度、元モデルの約55%サイズ(推奨バランス点)
Q4_K_M: 標準、元モデルの約45%サイズ(最もポピュラー)
Q3_K_M: 低精度、元モデルの約35%サイズ
Q2_K: 最小、元モデルの約25%サイズ(精度劣化大)
まとめ:判断フローチャート
ローカルLLM導入判断のフレームワーク:
データが機密情報を含む?
├── Yes → ローカルLLMを検討
│ ├── 高同時接続が必要? → vLLM + NVIDIA GPU
│ ├── エッジ/CPU環境? → llama.cpp
│ └── 開発・小規模? → Ollama
└── No → クラウドAPI継続を検討
├── 月間コストが$5,000超? → ROI計算の上でハイブリッドも検討
└── レイテンシ要件が厳しい? → ローカルキャッシュ戦略も検討
ローカルLLMは「コストを下げる手段」ではなく「データコントロールを取り戻す手段」と捉えるのが正しい認識です。ROIとセキュリティ要件を正確に評価した上で、クラウドとのハイブリッド構成も含めて柔軟に設計することが、2026年のLLM本番運用のベストプラクティスです。
