問題の概要:JupyterLab環境でのGPU利用に関する課題
AI開発、特に深層学習モデルのトレーニングや推論を行う際、GPUの活用は必須です。しかし、Dockerコンテナ内で構築したJupyterLab環境からGPUを認識・利用しようとすると、以下のようなエラーに直面することが頻繁にあります。
RuntimeError: No CUDA GPUs are available
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
ImportError: libcuda.so.1: cannot open shared object file: No such file or directory
これらのエラーは、ホストマシンに物理的なGPUとNVIDIAドライバがインストールされていても、Dockerコンテナ側の設定が不十分であるために発生します。本記事では、NVIDIA Docker Toolkitを用いて、JupyterLabを含む完全なGPU対応AI開発環境をDockerで構築する手順を、具体的なエラーとその解決策とともに解説します。
原因の解説:なぜDockerコンテナはGPUを認識しないのか
従来のDockerは、コンテナがホストマシンのハードウェアを直接利用することを想定していませんでした。GPUのような特殊なデバイスをコンテナ内から利用するためには、以下の3つの要素が適切に連携する必要があります。
- ホスト側のNVIDIAドライバ: 物理GPUを制御するための基盤ソフトウェア。
- NVIDIA Container Toolkit (旧nvidia-docker2): DockerランタイムとGPUドライバを橋渡しするミドルウェア。コンテナ起動時に必要なライブラリやデバイスファイルをマウントします。
- コンテナ内のCUDAライブラリ: PyTorchやTensorFlowなどのフレームワークがGPUを操作するために必要なユーザー空間ライブラリ。
上記のエラーメッセージは、この連携のどこかが切れていることを示しています。例えば、「could not select device driver」はNVIDIA Container Toolkitがインストールされていない場合に、「libcuda.so.1: cannot open shared object file」はコンテナ内のCUDAライブラリのバージョンがホストのドライバと互換性がない場合に発生します。
解決方法:ステップバイステップ構築手順
ステップ1: 前提条件の確認(ホストマシン)
まず、ホストマシン(Ubuntu等)に以下の要素がインストールされていることを確認します。
# 1. NVIDIAドライバの確認
nvidia-smi
# 出力例:
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 525.105.17 Driver Version: 525.105.17 CUDA Version: 12.0 |
# ドライババージョンとCUDAバージョン(コンパイラドライババージョン)をメモします。
# 2. Docker Engineの確認
docker --version
# Docker version 20.10.23 などと表示されればOKです。
nvidia-smiコマンドが実行できない、または「Command not found」と表示される場合は、NVIDIA公式サイトからドライバをインストールする必要があります。
ステップ2: NVIDIA Container Toolkitのインストール
これは、DockerがGPUリソースを管理できるようにするための最も重要なステップです。
# パッケージリポジトリと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.1.1-base-ubuntu22.04 nvidia-smi
最後の確認コマンドで、ホストで実行した時と同じGPU情報が表示されれば成功です。ここでエラーが発生した場合は、Dockerの再起動や、--runtime=nvidiaの代わりに--gpus allのみを指定してみてください(Docker 19.03以降)。
ステップ3: GPU対応JupyterLab Dockerfileの作成
次に、必要なAIライブラリとJupyterLabを備えたDockerイメージを構築します。ホストのドライババージョンに合ったCUDAベースイメージを選択することがポイントです。
# Dockerfile
FROM nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04
# 環境変数の設定(コンテナ内のPythonパスなど)
ENV PYTHONUNBUFFERED=1
PYTHONDONTWRITEBYTECODE=1
# システムパッケージのインストールとPythonのセットアップ
RUN apt-get update && apt-get install -y
python3-pip
python3-dev
git
curl
&& rm -rf /var/lib/apt/lists/*
# Pythonのパッケージインストール
# ホストのCUDAバージョンに合わせたPyTorch/TensorFlowをインストール
COPY requirements.txt .
RUN pip3 install --no-cache-dir --upgrade pip &&
pip3 install --no-cache-dir -r requirements.txt
# JupyterLabの設定
RUN pip3 install jupyterlab
EXPOSE 8888
# 作業ディレクトリと起動コマンド
WORKDIR /workspace
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''"]
# requirements.txt (例)
torch==2.0.1+cu121 --index-url https://download.pytorch.org/whl/cu121
torchvision==0.15.2+cu121 --index-url https://download.pytorch.org/whl/cu121
tensorflow==2.12.0
jupyterlab
pandas
scikit-learn
matplotlib
seaborn
重要な注意点: nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04のタグは、ステップ1で確認したホストの「CUDA Version」(ここでは12.0)と互換性のあるものを選択します。通常、コンテナ内のCUDAランタイムのメジャーバージョン(ここでは12)がホストのドライバがサポートするバージョン以下であれば動作します。詳細はNVIDIAのCUDA互換性表を参照してください。
ステップ4: イメージのビルドとコンテナの起動
# Dockerイメージのビルド
docker build -t gpu-jupyterlab:latest .
# GPUを有効にしてコンテナを起動
docker run -d
--name my-gpu-jupyter
--gpus all
-p 8888:8888
-v $(pwd)/workspace:/workspace
gpu-jupyterlab:latest
# ログを確認してJupyterLabの起動を確認
docker logs my-gpu-jupyter
# 出力に「http://127.0.0.1:8888/lab?token=...」のような行があれば成功
ブラウザで http://localhost:8888 にアクセスし、JupyterLabのインターフェースが表示されることを確認します。
ステップ5: コンテナ内でのGPU動作確認
JupyterLab内で新しいノートブック(Python3)を開き、以下のコードを実行してGPUが正しく認識・利用できるかテストします。
# セル1: 基本確認
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}")
# セル2: 簡単なTensor計算で確認
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x = torch.randn(10000, 10000).to(device)
y = torch.randn(10000, 10000).to(device)
# GPU上で行列計算を実行
z = torch.matmul(x, y)
print(f"Computed matrix of size: {z.size()}")
print("GPU computation successful!")
最初のセルでCUDA available: Trueと表示され、GPU名が表示されれば、環境構築は完了です。もしFalseと表示される場合は、コンテナの起動コマンドに--gpus allが抜けている、またはNVIDIA Container Toolkitの設定に問題がある可能性があります。
よくあるエラーとその解決策
エラー1: 「CUDA driver version is insufficient for CUDA runtime version」
原因: コンテナ内のCUDAランタイムバージョンが、ホストのNVIDIAドライバのサポート範囲を超えている。
解決策: Dockerfileのベースイメージを、ホストドライバがサポートする古いCUDAバージョンのものに変更します(例: nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04)。
エラー2: JupyterLabから「Kernel died」または「No connection」
原因: コンテナ内のメモリ不足、またはカーネルプロセスの異常終了。GPUメモリ不足も原因になり得ます。
解決策: コンテナ起動時にリソース制限を設定します。
docker run -d
--name my-gpu-jupyter
--gpus all
--shm-size=8g # 共有メモリを増やす(デフォルトは64MBと小さい)
-p 8888:8888
-v $(pwd)/workspace:/workspace
gpu-jupyterlab:latest
また、ノートブック内で使用するバッチサイズを減らす、不要な変数をdelする、torch.cuda.empty_cache()を呼び出すなどの対策も有効です。
まとめ・補足情報
Dockerを用いたGPU対応JupyterLab環境の構築は、開発環境の再現性と移植性を大幅に向上させます。成功の鍵は、ホストのNVIDIAドライバ、NVIDIA Container Toolkit、適切なCUDAベースイメージの3点を正しく連携させることです。
本番環境やチーム開発では、さらに以下の点を考慮すると良いでしょう。
- Docker Composeの利用:
docker-compose.ymlファイルに設定を記述することで、起動コマンドの管理が容易になります。 - セキュリティ: 本番公開時は、
--NotebookApp.token=''を削除し、強固なパスワードやトークンを設定してください。 - 拡張性: JupyterLabの拡張機能(
jupyterlab-git,jupyterlab-lsp等)をDockerfile内でインストールすることで、より強力な開発環境を構築できます。
この環境構築により、複雑なドライバやライブラリの依存関係に悩まされることなく、クリーンで高性能なAI開発環境をすぐに立ち上げることが可能になります。