【Docker/環境】JupyterLabでGPU対応AI開発環境をDockerで構築する手順とトラブルシューティング

問題の概要:JupyterLab環境でGPUが認識されない・利用できない

Dockerを使用してJupyterLabのAI開発環境を構築した際、TensorFlowやPyTorchなどのフレームワークからGPUが認識されず、以下のようなエラーメッセージが表示されることがあります。

# TensorFlowの場合
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 0 MB memory: -> device: 0, name: NVIDIA GeForce RTX 4090, pci bus id: 0000:01:00.0, compute capability: 8.9
W tensorflow/core/common_runtime/gpu/gpu_device.cc:1663] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.

# PyTorchの場合
>>> torch.cuda.is_available()
False
>>> print(torch.cuda.get_device_name(0))
AssertionError: Torch not compiled with CUDA enabled

この問題は、Dockerコンテナ内に適切なCUDAドライバやcuDNNライブラリがインストールされていない、またはホストマシンのGPUをコンテナに正しくマウントできていない場合に発生します。結果として、深層学習のトレーニングがCPUで実行され、処理速度が大幅に低下します。

原因の解説

Dockerコンテナ内でGPUを利用するには、以下の3つの条件を満たす必要があります。

1. ホストマシンのNVIDIAドライバのインストール

DockerコンテナはホストマシンのGPUドライバを直接利用します。ホストに適切なNVIDIAドライバがインストールされていない場合、コンテナ内からGPUを認識できません。

2. NVIDIA Container Toolkitのセットアップ

DockerとNVIDIA GPUを連携させるためのランタイム(`nvidia-container-runtime`)が必要です。これがインストール・設定されていないと、`–gpus`オプションが機能しません。

3. 適切なベースイメージの選択

CUDAとcuDNNがプリインストールされたDockerイメージを使用しない場合、コンテナ内で手動でこれらをインストールする必要があります。ベースイメージとホストのCUDAドライバーバージョンの互換性も重要です。

解決方法:ステップバイステップでの環境構築

ステップ1: ホストマシンの環境確認

まず、ホストマシンにNVIDIAドライバが正しくインストールされているか確認します。

# NVIDIAドライバのバージョン確認
nvidia-smi

# 出力例
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.29.06              Driver Version: 545.29.06    CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090        Off | 00000000:01:00.0  On |                  Off |
|  0%   39C    P8              20W / 450W |    682MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

nvidia-smiコマンドが実行できない場合は、NVIDIAドライバをインストールする必要があります。

ステップ2: NVIDIA Container Toolkitのインストール

DockerがNVIDIA GPUを認識できるように、NVIDIA Container Toolkitをインストールします。

# パッケージリポジトリの追加とGPGキーの設定
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | 
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | 
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# ツールキットのインストール
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

# Dockerの設定
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# インストール確認
docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi

ステップ3: GPU対応JupyterLab Dockerfileの作成

CUDAとJupyterLabがプリインストールされた公式イメージをベースに、必要なパッケージを追加します。

# Dockerfile
FROM nvidia/cuda:12.3.0-runtime-ubuntu22.04

# 環境変数の設定
ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1

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

# Pythonパッケージのインストール
RUN pip3 install --upgrade pip
RUN pip3 install 
    jupyterlab 
    notebook 
    ipykernel 
    numpy 
    pandas 
    matplotlib 
    seaborn 
    scikit-learn 
    tensorflow[and-cuda]==2.15.0 
    torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 
    xgboost 
    jupyter_contrib_nbextensions

# JupyterLabの設定
RUN jupyter labextension install @jupyter-widgets/jupyterlab-manager

# 作業ディレクトリの作成
WORKDIR /workspace

# ポートの公開
EXPOSE 8888

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

ステップ4: Dockerイメージのビルドとコンテナ起動

# Dockerイメージのビルド
docker build -t jupyterlab-gpu:latest .

# コンテナの起動(GPUを有効化)
docker run -d 
  --name jupyterlab-gpu-container 
  --gpus all 
  -p 8888:8888 
  -v $(pwd)/workspace:/workspace 
  -v $(pwd)/data:/data 
  jupyterlab-gpu:latest

# 起動ログの確認
docker logs jupyterlab-gpu-container

ステップ5: GPU認識の確認

ブラウザでhttp://localhost:8888にアクセスし、新しいノートブックを作成して以下のコードを実行します。

# TensorFlowでのGPU確認
import tensorflow as tf
print("TensorFlow version:", tf.__version__)
print("GPU Available:", tf.config.list_physical_devices('GPU'))
print("GPU Device Name:", tf.test.gpu_device_name() if tf.config.list_physical_devices('GPU') else "No GPU")

# PyTorchでのGPU確認
import torch
print("nPyTorch version:", torch.__version__)
print("CUDA Available:", torch.cuda.is_available())
if torch.cuda.is_available():
    print("GPU Device Name:", torch.cuda.get_device_name(0))
    print("CUDA Version:", torch.version.cuda)

正常に設定されていれば、以下のような出力が得られます。

TensorFlow version: 2.15.0
GPU Available: [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
GPU Device Name: /device:GPU:0

PyTorch version: 2.2.0+cu121
CUDA Available: True
GPU Device Name: NVIDIA GeForce RTX 4090
CUDA Version: 12.1

よくあるエラーとトラブルシューティング

エラー1: “Could not load dynamic library ‘libcudart.so.12′”

このエラーは、コンテナ内のCUDAバージョンとホストのドライバーバージョンに互換性がない場合に発生します。

解決策: ホストのCUDAバージョンに合ったDockerイメージタグを指定します。nvidia-smiで表示されるCUDA Versionを確認し、それに合ったベースイメージを使用します。

# CUDA 11.8が必要な場合
FROM nvidia/cuda:11.8.0-runtime-ubuntu22.04

# 対応するPyTorchのインストール
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

エラー2: “docker: Error response from daemon: could not select device driver”

NVIDIA Container Toolkitが正しくインストールされていない、またはDockerサービスが再起動されていない場合に発生します。

解決策: NVIDIA Container Toolkitのインストールを確認し、Dockerサービスを再起動します。

# インストール状態の確認
dpkg -l | grep nvidia-container-toolkit

# Dockerサービスの再起動
sudo systemctl restart docker

# テスト実行
docker run --rm --gpus all nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi

エラー3: JupyterLabからGPUメモリを全て占有してしまう

デフォルトでは、プロセスが利用可能なGPUメモリを全て確保しようとします。複数のコンテナやプロセスでGPUを共有する場合は制限が必要です。

解決策: コンテナ起動時にGPUメモリを制限します。

# 特定のGPUのみ使用、メモリ制限を4GBに設定
docker run -d 
  --name jupyterlab-gpu-limited 
  --gpus '"device=0,1"'   # GPU 0と1のみ使用
  --gpus 'all,capabilities=utility,memory=4096'   # メモリ制限
  -p 8889:8888 
  jupyterlab-gpu:latest

まとめ・補足情報

Dockerを使用したGPU対応JupyterLab環境の構築は、開発環境の再現性と移植性を高める優れた方法です。成功の鍵は以下の3点にあります。

  1. ホスト環境の適切な準備: NVIDIAドライバとContainer Toolkitの確実なインストール
  2. 互換性の考慮: ホストのCUDAドライバーバージョンとコンテナイメージのCUDAバージョンの整合性
  3. 効率的なイメージ設計: 必要最小限のパッケージを含め、ビルド時間とイメージサイズを最適化

さらに本番環境では、以下の点にも注意してください。

  • セキュリティのため、JupyterLabのトークン認証を有効にする
  • データ永続化のため、ボリュームマウントを適切に設定する
  • リソース使用量を監視し、必要に応じてCPU/メモリ/GPUの制限を設定する
  • Docker Composeを使用してマルチコンテナ環境を管理する

この環境構築手順に従うことで、再現性が高く、GPUをフル活用できるAI開発環境を迅速に構築できます。環境構築に費やす時間を最小限に抑え、本来のAIモデル開発や実験に集中することが可能になります。

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