問題の概要: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点にあります。
- ホスト環境の適切な準備: NVIDIAドライバとContainer Toolkitの確実なインストール
- 互換性の考慮: ホストのCUDAドライバーバージョンとコンテナイメージのCUDAバージョンの整合性
- 効率的なイメージ設計: 必要最小限のパッケージを含め、ビルド時間とイメージサイズを最適化
さらに本番環境では、以下の点にも注意してください。
- セキュリティのため、JupyterLabのトークン認証を有効にする
- データ永続化のため、ボリュームマウントを適切に設定する
- リソース使用量を監視し、必要に応じてCPU/メモリ/GPUの制限を設定する
- Docker Composeを使用してマルチコンテナ環境を管理する
この環境構築手順に従うことで、再現性が高く、GPUをフル活用できるAI開発環境を迅速に構築できます。環境構築に費やす時間を最小限に抑え、本来のAIモデル開発や実験に集中することが可能になります。