1. 問題の概要:JupyterLab環境でGPUが利用できない
Dockerを使用してJupyterLabのAI開発環境を構築した際、GPUを認識せず、PyTorchやTensorFlowで以下のようなエラーメッセージが表示されることがあります。
# PyTorchの場合
>>> import torch
>>> torch.cuda.is_available()
False
# TensorFlowの場合
>>> import tensorflow as tf
>>> tf.config.list_physical_devices('GPU')
[]
この問題は、DockerコンテナがホストマシンのGPUリソースにアクセスできない状態で起動しているために発生します。特に、NVIDIA GPUを活用した深層学習モデルの訓練や推論を行う場合、この問題は開発の大きな障壁となります。
2. 原因の解説
DockerコンテナがGPUを認識しない主な原因は以下の3つです。
2.1 NVIDIA Container Toolkitの未インストール
DockerコンテナからNVIDIA GPUを利用するには、ホストOSに「NVIDIA Container Toolkit」(旧称:nvidia-docker2)がインストールされている必要があります。これがないと、DockerデーモンはGPUデバイスをコンテナにマウントできません。
2.2 適切なベースイメージの未使用
CUDAやcuDNNなどのNVIDIAライブラリがプリインストールされていないベースイメージ(例:`python:3.9-slim`)を使用している場合、コンテナ内にGPUドライバやライブラリが存在せず、GPUを利用できません。
2.3 Docker実行コマンドのオプション不足
GPUサポートを有効にする`–gpus`オプションを指定せずにコンテナを起動している場合、たとえホストにNVIDIA Container Toolkitがインストールされていても、コンテナはGPUリソースにアクセスできません。
3. 解決方法:ステップバイステップでの環境構築
ステップ1: ホストマシンの環境確認とNVIDIA Container Toolkitのインストール
まず、ホストマシンにNVIDIA GPUドライバが正しくインストールされていることを確認します。
# NVIDIA GPUドライバの確認
nvidia-smi
# 出力例(GPU情報が表示されればOK)
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.17 Driver Version: 525.105.17 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| 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 ... On | 00000000:01:00.0 Off | N/A |
| N/A 45C P8 N/A / N/A | 0MiB / 6144MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
次に、DockerとNVIDIA Container Toolkitをインストールします。Ubuntuを例に説明します。
# Dockerのインストール(既にある場合はスキップ可)
sudo apt-get update
sudo apt-get install docker.io
# NVIDIA Container Toolkitのリポジトリ追加とインストール
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-container-toolkit
# Dockerデーモンの再起動
sudo systemctl restart docker
# インストール確認
docker run --rm --gpus all nvidia/cuda:12.0.0-base nvidia-smi
ステップ2: Dockerfileの作成
CUDAとJupyterLabがプリインストールされた公式イメージをベースに、必要なライブラリを追加するDockerfileを作成します。
# Dockerfile
# NVIDIAが提供するCUDA + Jupyterのベースイメージを使用
FROM nvidia/cuda:12.0.0-runtime-ubuntu22.04
# 必要なシステムパッケージのインストール
RUN apt-get update && apt-get install -y
python3
python3-pip
curl
&& rm -rf /var/lib/apt/lists/*
# Pythonのエイリアス設定
RUN ln -s /usr/bin/python3 /usr/bin/python
# JupyterLabと主要AIライブラリのインストール
RUN pip3 install --no-cache-dir --upgrade pip
RUN pip3 install --no-cache-dir
jupyterlab
notebook
ipywidgets
torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
tensorflow[and-cuda]
pandas
numpy
matplotlib
scikit-learn
seaborn
# 作業ディレクトリの設定
WORKDIR /workspace
# JupyterLabの起動ポートを公開
EXPOSE 8888
# JupyterLabの起動コマンド
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''", "--NotebookApp.password=''"]
ステップ3: Dockerイメージのビルドとコンテナ起動
Dockerfileがあるディレクトリで以下のコマンドを実行します。
# Dockerイメージのビルド(タグ名は任意)
docker build -t jupyterlab-gpu:latest .
# GPUサポートを有効にしてコンテナを起動
docker run -d
--gpus all
-p 8888:8888
-v $(pwd)/workspace:/workspace
--name jupyter-gpu-container
jupyterlab-gpu:latest
# 起動ログの確認(トークン情報など)
docker logs jupyter-gpu-container
ステップ4: 動作確認
ブラウザで`http://localhost:8888`にアクセスし、JupyterLabが起動していることを確認します。新しいノートブックを作成し、以下のコードを実行してGPUが認識されているかテストします。
# ノートブック内での確認コード
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}")
import tensorflow as tf
print(f"nTensorFlow version: {tf.__version__}")
print(f"GPU devices: {tf.config.list_physical_devices('GPU')}")
4. よくあるエラーとトラブルシューティング
エラー1: “docker: Error response from daemon: could not select device driver…”
原因: NVIDIA Container Toolkitが正しくインストールされていない、またはDockerデーモンの再起動が行われていない。
解決策:
# NVIDIA Container Toolkitの再インストールと確認
sudo apt-get update
sudo apt-get install --reinstall nvidia-container-toolkit
# Dockerデーモンの再起動
sudo systemctl restart docker
# nvidia-container-toolkitのサービス状態確認
sudo systemctl status nvidia-container-toolkit
エラー2: “RuntimeError: CUDA error: no kernel image is available for execution on the device”
原因: コンテナ内のCUDAバージョンと、インストールされたPyTorch/TensorFlowのCUDAバージョンが互換性がない。または、GPUのCompute Capabilityがライブラリのビルドバージョンに対応していない。
解決策: Dockerfile内で、ホストのCUDAバージョンに合ったPyTorch/TensorFlowをインストールする。
# Dockerfile内の修正例(CUDA 11.8用のPyTorchを明示的に指定)
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# または、より互換性の高いCPU/GPU両用バージョンを指定
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
# 注:この場合、コンテナ起動時にGPUが利用可能なら自動的にGPU版が使用される
エラー3: コンテナ起動後、JupyterLabに接続できない
原因: ポートの競合、またはコンテナが正常に起動していない。
解決策:
# 既存のコンテナを停止・削除
docker stop jupyter-gpu-container
docker rm jupyter-gpu-container
# ポートを変更して起動(例: 8899ポートを使用)
docker run -d
--gpus all
-p 8899:8888
-v $(pwd)/workspace:/workspace
--name jupyter-gpu-container
jupyterlab-gpu:latest
# コンテナのログを詳細に確認
docker logs -f jupyter-gpu-container
5. まとめ・補足情報
JupyterLabでGPU対応のAI開発環境をDockerで構築するには、1) ホストにNVIDIA Container Toolkitをインストール、2) 適切なCUDAベースイメージを使用、3) `–gpus`オプションを付けてコンテナを起動、という3つのステップが確実に行われていることが重要です。
本手順で構築した環境は、PyTorchとTensorFlowの両方に対応した、再現性の高い開発環境となります。`-v`オプションでホストのディレクトリをマウントしているため、コンテナを削除しても作業内容は失われません。
補足: プロダクション環境やチーム開発では、さらに以下の点を考慮すると良いでしょう。
- Docker Composeを使用してサービス定義をコード化する
- 特定のGPUデバイスのみを割り当てる(`–gpus ‘”device=0,1″‘`)
- JupyterLabにセキュリティトークンやパスワードを設定する
- 必要なPythonパッケージを`requirements.txt`で管理する
この環境構築により、ローカルマシンの環境を汚すことなく、最新のAIライブラリとGPUを活用した効率的な開発が可能になります。