問題の概要:JupyterLab環境でGPUが認識されない
Dockerを使用してJupyterLabのAI開発環境を構築した際、TensorFlowやPyTorchなどのフレームワークからGPUが認識されず、以下のようなエラーメッセージが表示されることがあります。
# TensorFlowの場合
W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'
...
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
# PyTorchの場合
>>> import torch
>>> torch.cuda.is_available()
False
この問題は、Dockerコンテナ内に適切なGPUドライバやCUDAライブラリがマウントされていない、またはDocker自体のGPUサポートが有効になっていないことが原因で発生します。本記事では、NVIDIA GPUを搭載したLinuxホストマシン(Ubuntu 22.04 LTSを想定)で、Dockerを用いて完全なGPUサポートを持つJupyterLab環境を構築する手順と、発生しがちなエラーの解決方法を詳しく解説します。
原因の解説
Dockerコンテナ内でホストマシンのGPUを利用するには、以下の3つの条件を満たす必要があります。
1. ホスト側のNVIDIAドライバとNVIDIA Container Toolkitのインストール
DockerコンテナがGPUにアクセスするためのブリッジとなる「NVIDIA Container Toolkit」(旧名:nvidia-docker2)がホストマシンにインストールされていないと、コンテナは物理GPUを認識できません。
2. 適切なベースイメージの選択
JupyterLabのイメージだけではCUDAやcuDNNなどのGPU計算に必須のライブラリが含まれていません。NVIDIAが提供するCUDAがプリインストールされたベースイメージ(例:nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04)を使用するか、Jupyterの公式イメージに後からCUDA関連パッケージをインストールする必要があります。
3. Docker runコマンドでの正しいランタイム指定
GPU対応コンテナを起動する際は、--gpus allオプションまたは--runtime=nvidiaオプションを指定しなければなりません。この指定を忘れると、コンテナはCPUモードで起動してしまいます。
解決方法:ステップバイステップ構築手順
ステップ1: ホストマシンの準備(NVIDIA Container Toolkitのインストール)
まず、ホストマシンにNVIDIAドライバとNVIDIA Container Toolkitが正しくインストールされていることを確認します。
# NVIDIAドライバの確認
nvidia-smi
# 出力例(ドライババージョンとGPU情報が表示されるはず)
# +---------------------------------------------------------------------------------------+
# | NVIDIA-SMI 535.161.07 Driver Version: 535.161.07 CUDA Version: 12.2 |
# |-----------------------------------------+----------------------+----------------------+
# ...
# NVIDIA Container Toolkitのインストール(Ubuntuの場合)
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
sudo systemctl restart docker
ステップ2: Dockerfileの作成
CUDA環境が整ったJupyterLabイメージを構築するためのDockerfileを作成します。ここでは、NVIDIAのCUDAベースイメージを利用し、その上にMinicondaとJupyterLabをインストールする方法を示します。
# Dockerfile
FROM nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV PATH="/opt/conda/bin:${PATH}"
# 基本パッケージのインストールとMinicondaのセットアップ
RUN apt-get update && apt-get install -y
wget
git
bzip2
ca-certificates
sudo
&& rm -rf /var/lib/apt/lists/*
# Minicondaのインストール
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh &&
bash ~/miniconda.sh -b -p /opt/conda &&
rm ~/miniconda.sh &&
/opt/conda/bin/conda clean -tipsy
# JupyterLabと主要AIライブラリのインストール
RUN conda install -y -c conda-forge
jupyterlab
numpy
pandas
matplotlib
scikit-learn
&& conda clean -afy
# PyTorch (CUDA 12.1対応版) とTensorFlowのインストール
RUN pip install --no-cache-dir
torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
tensorflow[and-cuda]
# 作業ディレクトリの設定とポート公開
WORKDIR /workspace
EXPOSE 8888
# JupyterLab起動スクリプト
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''", "--NotebookApp.password=''"]
ステップ3: Dockerイメージのビルドとコンテナ起動
Dockerfileがあるディレクトリでイメージをビルドし、GPUサポートを有効にしてコンテナを起動します。
# イメージのビルド(タグ付けは任意)
docker build -t jupyterlab-gpu:latest .
# GPUサポート付きでコンテナを起動
docker run -d
--gpus all
-p 8888:8888
-v $(pwd)/workspace:/workspace
--name jupyterlab-gpu-container
jupyterlab-gpu:latest
# 起動ログの確認(トークン情報など)
docker logs jupyterlab-gpu-container
ステップ4: GPU認識の確認
ブラウザで http://localhost:8888 にアクセスし、JupyterLabを開きます。新しいノートブックを作成し、以下のコードを実行して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 list: {tf.config.list_physical_devices('GPU')}")
正常に構築されていれば、以下のような出力が得られるはずです。
PyTorch version: 2.1.2+cu121
CUDA available: True
GPU device name: NVIDIA GeForce RTX 4090
CUDA version: 12.1
TensorFlow version: 2.13.0
GPU list: [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
よくあるエラーと解決策
エラー1: “Could not load dynamic library ‘libcudart.so.11.0′”
原因: コンテナ内のCUDAバージョンと、TensorFlow/PyTorchが要求するCUDAバージョンが一致していない。
解決策: DockerfileのベースイメージのCUDAバージョンと、インストールするフレームワークのCUDAバージョンを合わせます。例えば、PyTorchのインストールコマンドで--index-url https://download.pytorch.org/whl/cu121と指定している場合は、ベースイメージもCUDA 12.1系(nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04など)を選択します。
エラー2: “docker: Error response from daemon: could not select device driver …”
原因: NVIDIA Container Toolkitが正しくインストールされていない、またはDockerデーモンの再起動が行われていない。
解決策: ステップ1のインストール手順を再度実行し、sudo systemctl restart dockerでDockerデーモンを再起動します。その後、docker run --gpus all nvidia/cuda:12.2.2-base-ubuntu22.04 nvidia-smiを実行して、最小限のCUDAイメージでGPUが認識されるかテストします。
エラー3: コンテナ起動後、JupyterLabに接続できない
原因: ポートの競合またはコンテナの異常終了。
解決策: 別のポートを使用するか、競合している既存のコンテナを停止します。
# ポート8888が既に使用されている場合、別のポート(例: 8899)で起動
docker run -d --gpus all -p 8899:8888 --name jupyterlab-gpu-container jupyterlab-gpu:latest
# 既存のコンテナを確認・停止
docker ps -a
docker stop [コンテナ名またはID]
docker rm [コンテナ名またはID]
まとめ・補足情報
Dockerを用いたGPU対応JupyterLab環境の構築は、開発環境の再現性と移植性を高める強力な手法です。成功の鍵は、1) ホスト側のNVIDIA Container Toolkitの確実なインストール、2) CUDAバージョンの整合性が取れたベースイメージの選択、3) --gpus allオプションの付与の3点にあります。
本記事で紹介したDockerfileはあくまで一例です。実際のプロジェクトでは、必要な追加ライブラリ(OpenCV, XGBoost, Transformersなど)をpip installやconda installで追記したり、requirements.txtやenvironment.ymlファイルをコピーして環境を構築する方法も有効です。
また、ディスク容量が気になる場合は、イメージのレイヤーを最適化するために、複数のRUNコマンドを&&でつなぎ、最後にキャッシュクリーンアップを行うなどのベストプラクティスを取り入れることをお勧めします。この環境をベースに、安定したGPU加速AI開発を進めてください。