【Docker/環境】JupyterLabでGPU対応AI開発環境を構築する手順とよくあるエラー解決法

1. 問題の概要:JupyterLab環境でのGPU認識エラー

Dockerを使用してJupyterLabのAI開発環境を構築する際、特に深層学習モデルの学習や推論を行う場合、コンテナ内からGPUが認識されず、以下のようなエラーメッセージに遭遇することがあります。

RuntimeError: No CUDA GPUs are available
torch.cuda.is_available()  # False を返す
nvidia-smi: command not found
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

この問題は、ホストマシンにNVIDIA GPUとドライバが正しくインストールされているにもかかわらず、DockerコンテナがGPUリソースにアクセスできない状態で発生します。結果として、PyTorchやTensorFlowなどのフレームワークがCPUモードで動作し、大規模なモデル訓練が非現実的な時間を要する事態に陥ります。

2. 原因の解説

DockerコンテナがホストのGPUを利用するには、以下の3つの要素が適切に設定されている必要があります。

2.1 NVIDIA Container Toolkitの未インストール

従来の`nvidia-docker2`に代わり、現在はNVIDIA Container Toolkitが標準的なソリューションです。これがインストールされていないと、DockerデーモンはNVIDIA GPUを管理するランタイムを認識できません。

2.2 Dockerランタイムの設定不備

Dockerの設定ファイル(`/etc/docker/daemon.json`)にNVIDIAをデフォルトランタイムとして指定する必要があります。この設定がない場合、Dockerは標準の`runc`ランタイムを使用し、GPUデバイスをコンテナに渡しません。

2.3 ベースイメージの不適切な選択

CUDAとcuDNNがプリインストールされていないベースイメージ(例: 標準の`python:3.9-slim`)を使用すると、コンテナ内にCUDA環境を一から構築する必要があり、バージョン不一致などの問題が発生しやすくなります。

2.4 Dockerコマンドのオプション不足

`docker run`コマンドに`–gpus all`オプションを指定しない限り、コンテナはGPUリソースを要求しません。これは最も見落とされがちなポイントです。

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

ステップ1: 前提条件の確認

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

# ホストでNVIDIAドライバとCUDAのバージョンを確認
nvidia-smi
# 出力例:
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 525.105.17   Driver Version: 525.105.17   CUDA Version: 12.0    |
# |-------------------------------+----------------------+----------------------+
# また、Dockerがインストールされていることも確認します。
docker --version

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

Ubuntu/Debian系OSを例に、インストール手順を示します。

# パッケージリストの更新と依存関係のインストール
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# NVIDIAのGPGキーとリポジトリの追加
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
echo "deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://nvidia.github.io/libnvidia-container/stable/ubuntu20.04/$(arch) /" | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# リポジトリの更新とツールキットのインストール
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

ステップ3: Dockerの設定

NVIDIAランタイムをDockerに登録します。

# NVIDIAランタイムの設定
sudo nvidia-ctk runtime configure --runtime=docker

# Dockerデーモンの再起動
sudo systemctl restart docker

# 設定の確認
sudo docker info | grep -i runtime
# 出力に `nvidia` が含まれていることを確認

ステップ4: Dockerfileの作成

適切なベースイメージを選択し、JupyterLab環境を構築するDockerfileを作成します。NVIDIAが提供するCUDA付きのPythonイメージを使用するのが確実です。

# Dockerfile
FROM nvidia/cuda:12.1.1-cudnn8-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/*

# pipのアップグレードとPythonパッケージのインストール
RUN pip3 install --upgrade pip
RUN pip3 install 
    torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 
    tensorflow[and-cuda]==2.13.0 
    jupyterlab 
    ipywidgets 
    pandas 
    numpy 
    matplotlib 
    scikit-learn 
    seaborn

# JupyterLabの設定
RUN jupyter lab --generate-config
RUN echo "c.ServerApp.ip = '0.0.0.0'" >> /root/.jupyter/jupyter_server_config.py
RUN echo "c.ServerApp.port = 8888" >> /root/.jupyter/jupyter_server_config.py
RUN echo "c.ServerApp.open_browser = False" >> /root/.jupyter/jupyter_server_config.py
RUN echo "c.ServerApp.token = ''" >> /root/.jupyter/jupyter_server_config.py
RUN echo "c.ServerApp.password = ''" >> /root/.jupyter/jupyter_server_config.py
RUN echo "c.ServerApp.allow_root = True" >> /root/.jupyter/jupyter_server_config.py

# 作業ディレクトリの設定とポート公開
WORKDIR /workspace
EXPOSE 8888

# コンテナ起動時にJupyterLabを実行
CMD ["jupyter", "lab", "--allow-root"]

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

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

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

# コンテナのログを確認(起動確認とトークン確認)
docker logs jupyter-gpu-container

ステップ6: 動作確認

ブラウザで `http://localhost:8888` にアクセスし、新しいノートブックを作成して以下のコードを実行し、GPUが認識されていることを確認します。

# PyTorchでの確認
import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
if torch.cuda.is_available():
    print(f"GPU device name: {torch.cuda.get_device_name(0)}")
    print(f"CUDA version: {torch.version.cuda}")

# TensorFlowでの確認
import tensorflow as tf
print(f"nTensorFlow version: {tf.__version__}")
print(f"GPU available: {len(tf.config.list_physical_devices('GPU')) > 0}")
if tf.config.list_physical_devices('GPU'):
    print(f"GPU devices: {tf.config.list_physical_devices('GPU')}")

4. よくあるエラーとその解決策

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

このエラーは、コンテナ内のCUDAランタイムバージョンと、ホストのドライバがサポートするCUDAバージョンが一致しない場合に発生します。

# 解決策: ホストの`nvidia-smi`で表示されるCUDAバージョンと互換性のあるベースイメージを選択
# 例: ホストのCUDA Versionが12.0の場合
FROM nvidia/cuda:12.0.1-cudnn8-runtime-ubuntu22.04

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

NVIDIA Container Toolkitが正しくインストールされていない、またはDockerデーモンの再起動が行われていない可能性があります。

# 解決策: インストール手順の再確認とデーモンの再起動
sudo systemctl daemon-reload
sudo systemctl restart docker

エラー3: コンテナ内で`nvidia-smi`が実行できない

`docker run`コマンドに`–gpus`オプションが指定されていないか、NVIDIAランタイムが設定されていません。

# 解決策: 必ず`--gpus`オプションを付与。特定のGPUのみ使いたい場合:
docker run --gpus '"device=0,1"' ...  # GPU 0と1のみを使用

5. まとめ・補足情報

JupyterLabでGPU対応のAI開発環境をDockerで構築するには、ホスト側のNVIDIAドライバ、NVIDIA Container Toolkit、適切なDocker設定、そしてCUDA対応ベースイメージの選択が鍵となります。本ガイドで紹介した手順に従うことで、再現性の高い環境を迅速に構築できるはずです。

補足情報:

  • ディスク容量の節約: イメージのビルド時に`–no-cache`オプションを使用せず、レイヤーキャッシュを活用することで、開発中のビルド時間を短縮できます。
  • セキュリティ: 本番環境では、JupyterLabのトークン認証やパスワード設定を有効にし、`–allow-root`は使用しないことを推奨します。非rootユーザーを作成して実行しましょう。
  • バージョン固定: `Dockerfile`内のパッケージバージョンは明示的に固定し、再現性を確保することが重要です(例: `tensorflow==2.13.0`)。
  • Docker Composeの利用: 複雑な環境設定には、`docker-compose.yml`ファイルの使用を検討してください。これにより、コマンドライン引数の管理が簡素化されます。

この環境構築により、ホストマシンを汚すことなく、クリーンで分離された、かつGPUのパワーを最大限に活用できるAI開発環境が手に入ります。モデル開発と実験の効率化に大きく貢献するでしょう。

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