ローカルLLMをDockerで構築する完全手引き
対象読者: ローカル環境で大規模言語モデル(LLM)を安全に運用したいエンジニア、情報システム担当者。クラウド依存を避けつつ高速な試作を回したい方に向けた実践ガイドです。
1. ローカルLLM運用の全体像
クラウドAPIを使ったLLM利用は容易ですが、「コストの予測が難しい」「秘匿データを外部に出したくない」という課題があります。Dockerを使ってローカル環境に推論基盤を整えれば、以下のメリットを享受できます。
- データ主権の確保: 機密文書をクラウドに送信せずに処理できる。
- 高速な実験サイクル: モデルとプロンプトを自由に差し替えて比較検証できる。
- カスタマイズ性: GPU/CPUの構成に合わせてモデルの量子化や最適化を調整できる。
2. 必要な前提知識とハードウェア要件
| 項目 | 推奨スペック | 解説 |
|---|---|---|
| OS | Ubuntu 22.04 / macOS Sonoma / Windows WSL2 | Linux互換環境ならほぼ同じ手順で構築可能 |
| GPU | NVIDIA RTX 3060以上 (VRAM 12GB〜) | llama3-8B をFP16で動かすなら12GB前後、4bit量子化なら8GBでも可 |
| RAM | 32GB以上 | モデル展開時に一時的にメモリ消費が膨らむため余裕を持たせる |
| ストレージ | NVMe SSD 1TB以上 | Hugging Faceのモデルダウンロードで数十GB消費 |
| ネットワーク | 初回セットアップに高速回線 | モデル取得後はオフライン運用も可能 |
3. Docker Composeによるベース環境
以下は ollama を利用したベース構成です。CPUのみで動かす場合も同じ定義でOKです。
version: '3.9'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
environment:
- OLLAMA_KEEP_ALIVE=24h
volumes:
- ./ollama:/root/.ollama
ports:
- "11434:11434"
deploy:
resources:
reservations:
devices:
- capabilities: [gpu]
mkdir -p ~/llm-stack/ollama
cd ~/llm-stack
docker compose up -d
起動後は curl http://localhost:11434/api/tags でモデル一覧を確認できます。もしGPUを使わない構成なら deploy セクションを削除して構いません。
4. モデルのダウンロードと起動
# llama3-8b-instruct を取得
ollama pull llama3
# モデルを常駐サーバーとして起動
ollama serve
生成テストは ollama run llama3 "社内向けヘルプデスクに使えるFAQを3つ教えて" のように実行します。初回はモデルのコンパイルが走るため時間がかかりますが、2回目以降はキャッシュされ高速になります。
推奨モデル一覧
| 利用目的 | モデル | 特徴 |
|---|---|---|
| 日本語対応チャット | ELYZA-japanese-Llama-2-7b | 日本語QAに最適化。8bitでも自然な応答。 |
| 高速プロトタイピング | Phi-3-mini-4k | 軽量ながら推論品質が高い。CPUマシンでも実用的。 |
| コード補完 | CodeGemma-7b | コード生成とレビューに強い。GPU推論推奨。 |
| 推論コスト最小化 | Mistral-7B-Instruct | 4bit量子化でVRAM 6GB程度でも動作。 |
5. ローカルUIの構築
CLIだけでは不便なので、以下のUIフレームワークを組み合わせると快適です。
- Open WebUI を Ollama と同じネットワークに配置すると、ChatGPT風のUIで対話できます。
- Continue (VS Code拡張) でエディタ内からローカルLLMにプロンプトできるようにする。
- n8n/Dify などのオーケストレーションツールにHTTPエンドポイントを公開し、社内botへ連携する。
open-webui:
image: ghcr.io/open-webui/open-webui:latest
container_name: open-webui
restart: unless-stopped
environment:
- OLLAMA_BASE_URL=http://ollama:11434
volumes:
- ./open-webui:/app/backend/data
ports:
- "3000:8080"
depends_on:
- ollama
アクセスすると、モデル選択やプロンプトテンプレート管理がブラウザ上で完結します。
6. 運用時の注意点
- モデル更新の追跡: Ollamaのタグはイミュータブルではないため、定期的に
ollama pull <model>@<digest>形式で固定化する。 - リソース監視:
docker statsでGPU/メモリ使用量を観測し、閾値を越える前にアラート設定する。 - セキュリティ: 社内ネットワークに限定公開し、リバースプロキシ(Nginx)で Basic 認証を付与する。
- バックアップ:
./ollamaボリュームをresticやborgなどで差分バックアップする。 - コンプライアンス: モデルライセンスを確認し、商用利用する際の条件を明示する。
7. よくあるトラブルと解決策
| 症状 | 原因 | 解決策 |
|---|---|---|
| 推論が極端に遅い | GPUが認識されていない | docker run --gpus all nvidia/cuda:12.4.1-base nvidia-smi で動作確認 |
failed to load model エラー | モデルファイル破損 | ollama pull --force <model> で再取得 |
| 応答が途中で途切れる | コンテナの ulimit が不足 | docker run 時に --ulimit memlock=-1:-1 を付与 |
| 日本語が不自然 | トークナイザが英語寄り | ELYZA 系モデルに切り替える or 日本語用LoRAを適用 |
8. ローカルLLMを活用したアプリ例
- 社内FAQボット: ConfluenceやNotionのドキュメントをベクタ化し、RAGで回答精度を高める。
- コードレビュー支援: Gitリポジトリを入力にし、
Continueで差分のレビューコメントを生成。 - データクレンジング: CSVファイルを段階的に読み込み、LLMに整形指示を出して整備する。
9. メンテナンスのベストプラクティス
- 月次でモデルのハッシュを点検し、意図せず更新されていないか確認する。
- ディスク容量を監視し、不要になったモデルを
ollama rmで削除する。 - GPUドライバの更新は慎重に実施し、検証用マシンで互換性を確認してから本番へ展開する。
- プロンプトのベンチマークシートを作成し、品質低下があればモデル・量子化設定を見直す。
✅ まとめ: Dockerを使ったローカルLLM環境は、秘密データを安全に扱いながら迅速なAI活用を試す最適解です。ハードウェア要件とコンテナ構成を理解し、UIや監視ツールを組み合わせれば、クラウドに依存しない堅牢な推論基盤を構築できます。
