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開発環境が手に入ります。モデル開発と実験の効率化に大きく貢献するでしょう。