【Docker/環境】Docker ComposeでAI開発環境を一括構築!JupyterLab、PyTorch、TensorFlowを即時起動するテンプレートとトラブルシューティング

問題の概要:AI開発環境構築の複雑さと依存関係のエラー

AI・機械学習プロジェクトを始める際、開発環境の構築は最初の大きなハードルです。PyTorch、TensorFlow、JupyterLab、必要なPythonライブラリ、CUDAツールキットなど、数多くのソフトウェアを手動でインストールし、互換性のあるバージョンを揃える作業は時間がかかり、エラーも頻発します。特に、以下のようなエラーメッセージに遭遇した経験はないでしょうか。

ERROR: Could not find a version that satisfies the requirement torch==1.9.0 (from versions: 1.10.0, 1.10.1, 1.10.2...)
ERROR: No matching distribution found for torch==1.9.0
ImportError: libcudart.so.11.0: cannot open shared object file: No such file or directory

これらのエラーは、ホストOSの環境に強く依存し、解決に多くの時間を奪います。また、「自分のマシンでは動いたが、同僚のマシンでは動かない」という環境差異の問題も頻繁に発生します。本記事では、Docker Composeを用いて、再現性が高く、一貫したAI開発環境を一括で構築するテンプレートを紹介し、構築時に発生しがちなトラブルとその解決法を詳しく解説します。

原因の解説:環境差異と依存関係の複雑さ

上記のようなエラーが発生する根本的な原因は主に3つあります。

1. Pythonパッケージのバージョン競合

プロジェクトAでは`tensorflow==2.8.0`が必要だが、プロジェクトBでは`tensorflow==2.4.0`が必要な場合、グローバルなPython環境では両立が困難です。`pip`で片方をインストールすると、もう片方が上書きされ、互換性エラーが発生します。

2. CUDA、cuDNN、GPUドライバのバージョン不一致

PyTorchやTensorFlowのGPU版は、特定のバージョンのCUDAツールキットとcuDNNに強く依存しています。ホストマシンのNVIDIAドライバのバージョンが古すぎると、必要なCUDAバージョンをサポートできず、実行時エラーが発生します。

3. ホストOSのライブラリ環境の違い

開発環境がUbuntu、チームメンバーがmacOSやWindowsという状況では、システムライブラリのパスや利用可能なパッケージが異なり、同じ`requirements.txt`でも動作が保証されません。

DockerとDocker Composeは、これらの問題を「コンテナ」という隔離された環境に必要な全ての依存関係をパッケージ化することで解決します。環境そのものをコード(Dockerfile, docker-compose.yml)として定義するため、誰がどこで実行しても全く同じ環境を再現できるのです。

解決方法:Docker Composeテンプレートによる一括環境構築

ここでは、JupyterLabを中心としたAI開発環境を構築するための、実用的なDocker Composeテンプレートを紹介します。このテンプレートは、GPUサポート(NVIDIA Docker)、ポート公開、作業ディレクトリのマウントを標準で備えています。

ステップ1: 必須ファイルの作成

プロジェクトのルートディレクトリに、以下の2つのファイルを作成します。

docker-compose.yml

version: '3.8'

services:
  ai-lab:
    build: .
    container_name: ai-development-lab
    ports:
      - "8888:8888" # JupyterLab用ポート
    volumes:
      - ./work:/home/jovyan/work # ホストのworkディレクトリをコンテナ内にマウント
      - ./data:/home/jovyan/data # データ用ディレクトリ
    environment:
      - JUPYTER_ENABLE_LAB=yes
      - GRANT_SUDO=yes
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    stdin_open: true # コンテナをインタラクティブモードで保持
    tty: true

Dockerfile

# ベースイメージの選択 (PyTorch + CUDA + Jupyterを含む)
FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime

# 必要なシステムパッケージのインストール
RUN apt-get update && apt-get install -y 
    curl 
    wget 
    git 
    vim 
    htop 
    && rm -rf /var/lib/apt/lists/*

# JupyterLabのインストールと追加ライブラリ
RUN pip install --no-cache-dir 
    jupyterlab 
    matplotlib 
    seaborn 
    pandas 
    scikit-learn 
    scipy 
    tensorflow 
    ipywidgets

# 作業ディレクトリの設定
WORKDIR /home/jovyan/work

# JupyterLab起動
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''", "--NotebookApp.password=''"]

ステップ2: 環境のビルドと起動

ターミナルで、`docker-compose.yml`と`Dockerfile`があるディレクトリに移動し、以下のコマンドを実行します。

# イメージをビルドし、コンテナを起動(バックグラウンドで実行)
docker-compose up -d --build

# 起動ログを確認
docker-compose logs -f ai-lab

ログ中に`http://127.0.0.1:8888/lab?`のようなURLが表示されれば成功です。ブラウザでそのURLにアクセスすると、JupyterLabが利用できます。

ステップ3: 動作確認

JupyterLab内で新しいノートブックを作成し、以下のコードを実行して環境を確認します。

import torch
import tensorflow as tf
import jupyterlab

print(f"PyTorch version: {torch.__version__}")
print(f"PyTorch CUDA available: {torch.cuda.is_available()}")
if torch.cuda.is_available():
    print(f"PyTorch CUDA device: {torch.cuda.get_device_name(0)}")

print(f"TensorFlow version: {tf.__version__}")
print(f"TensorFlow GPU available: {len(tf.config.list_physical_devices('GPU')) > 0}")

よくあるトラブルと解決策

エラー1: GPUが認識されない

エラーメッセージ例: torch.cuda.is_available()が`False`を返す。

原因と解決:

  1. NVIDIA Docker Toolkitの未インストール: DockerがGPUを利用するには別途ツールキットが必要です。
    # インストール手順(Ubuntu例)
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    sudo apt-get update && sudo apt-get install -y nvidia-docker2
    sudo systemctl restart docker
  2. docker-compose.ymlの設定漏れ: `deploy.resources.reservations.devices`セクションが正しく記述されているか確認してください。

エラー2: ポートが既に使用中

エラーメッセージ例: Error starting userland proxy: listen tcp4 0.0.0.0:8888: bind: address already in use

解決: ホストマシンの8888ポートを他のアプリケーション(以前のJupyterセッションなど)が使用しています。以下のいずれかで対応します。

# 方法1: docker-compose.ymlのポート番号を変更(例: 8889)
ports:
  - "8889:8888"

# 方法2: 既存のコンテナを停止
docker-compose down
# または、特定のプロセスを探して終了(Linux/Mac)
lsof -ti:8888 | xargs kill -9

エラー3: ビルド時のネットワークエラー

エラーメッセージ例: ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device または ERROR: Failed to download ... Network is unreachable

解決: Dockerのディスク容量不足やネットワーク設定の問題です。

# Dockerのディスク使用量を確認
docker system df

# 未使用のイメージ、コンテナ、キャッシュを削除
docker system prune -a

# ビルドキャッシュを使わずに再試行(ネットワークが不安定な場合)
docker-compose build --no-cache

まとめ・補足情報

Docker Composeを用いたAI開発環境のテンプレート化は、環境構築の負担を劇的に軽減し、プロジェクトの再現性とチーム間の協力を飛躍的に向上させます。本記事で紹介したテンプレートは、PyTorchをベースとしていますが、Dockerfileのベースイメージをtensorflow/tensorflow:latest-gpu-jupyterに変更するなど、簡単にカスタマイズ可能です。

さらなる活用のヒント:

  • 複数サービス構成: `docker-compose.yml`にPostgreSQL(実験結果管理用)やMLflow(実験トラッキング用)のサービスを追加することで、より本格的なMLOps環境を構築できます。
  • 環境変数ファイル: `.env`ファイルを作成し、パスワードやAPIキーなどの秘匿情報を管理することで、設定の安全性と柔軟性を高められます。
  • ボリュームの永続化: インストールした追加パッケージを永続化したい場合は、Dockerの「名前付きボリューム」を使用することを検討してください。

このテンプレートを出発点として、プロジェクト固有のライブラリを`Dockerfile`の`pip install`行に追加するなど、自由にカスタマイズし、ストレスのないAI開発を実現してください。環境構築でつまずく時間は、すべてアルゴリズムの改善や実験に充てられるようになるでしょう。

この記事は役に立ちましたか?