2024/11/12

ローカルLLMのDocker環境構築と運用ハンドブック

Takashi Inoue
ローカルLLMのDocker環境構築と運用ハンドブック のサムネイル画像
#llm#docker#infrastructure

Docker ComposeでローカルLLM環境を構築し、推論の運用ポイントまでを丁寧に解説。

この記事を共有する

ローカルLLMをDockerで構築する完全手引き

対象読者: ローカル環境で大規模言語モデル(LLM)を安全に運用したいエンジニア、情報システム担当者。クラウド依存を避けつつ高速な試作を回したい方に向けた実践ガイドです。

1. ローカルLLM運用の全体像

クラウドAPIを使ったLLM利用は容易ですが、「コストの予測が難しい」「秘匿データを外部に出したくない」という課題があります。Dockerを使ってローカル環境に推論基盤を整えれば、以下のメリットを享受できます。

  • データ主権の確保: 機密文書をクラウドに送信せずに処理できる。
  • 高速な実験サイクル: モデルとプロンプトを自由に差し替えて比較検証できる。
  • カスタマイズ性: GPU/CPUの構成に合わせてモデルの量子化や最適化を調整できる。

2. 必要な前提知識とハードウェア要件

項目推奨スペック解説
OSUbuntu 22.04 / macOS Sonoma / Windows WSL2Linux互換環境ならほぼ同じ手順で構築可能
GPUNVIDIA RTX 3060以上 (VRAM 12GB〜)llama3-8B をFP16で動かすなら12GB前後、4bit量子化なら8GBでも可
RAM32GB以上モデル展開時に一時的にメモリ消費が膨らむため余裕を持たせる
ストレージ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-Instruct4bit量子化でVRAM 6GB程度でも動作。

5. ローカルUIの構築

CLIだけでは不便なので、以下のUIフレームワークを組み合わせると快適です。

  1. Open WebUI を Ollama と同じネットワークに配置すると、ChatGPT風のUIで対話できます。
  2. Continue (VS Code拡張) でエディタ内からローカルLLMにプロンプトできるようにする。
  3. 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 ボリュームを resticborg などで差分バックアップする。
  • コンプライアンス: モデルライセンスを確認し、商用利用する際の条件を明示する。

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. メンテナンスのベストプラクティス

  1. 月次でモデルのハッシュを点検し、意図せず更新されていないか確認する。
  2. ディスク容量を監視し、不要になったモデルを ollama rm で削除する。
  3. GPUドライバの更新は慎重に実施し、検証用マシンで互換性を確認してから本番へ展開する。
  4. プロンプトのベンチマークシートを作成し、品質低下があればモデル・量子化設定を見直す。

まとめ: Dockerを使ったローカルLLM環境は、秘密データを安全に扱いながら迅速なAI活用を試す最適解です。ハードウェア要件とコンテナ構成を理解し、UIや監視ツールを組み合わせれば、クラウドに依存しない堅牢な推論基盤を構築できます。

技術のご相談はこちらから

プロジェクトの技術課題やPoCのご相談は専用フォームより承ります。お気軽にお問い合わせください。

技術相談フォームへ

お問い合わせ