問題の概要:JupyterLabでGPUが使えない、Docker環境構築時の典型的な課題
AI開発、特に深層学習モデルのトレーニングや推論を行う際、GPUの活用は必須です。Dockerを用いてポータブルで再現性の高いJupyterLab環境を構築しようとした際、以下のような問題に直面することがあります。
- Dockerコンテナ内からGPUが認識されず、
torch.cuda.is_available()がFalseを返す。 docker runコマンド実行時にError response from daemon: could not select device driver "" with capabilities: [[gpu]]といったエラーが発生する。- JupyterLabは起動するが、カーネルがクラッシュする、またはライブラリのインポートに失敗する。
- ホストマシンとコンテナ間のポートやディレクトリのマウントがうまくいかない。
本記事では、NVIDIA GPUを搭載したLinuxホストマシン(Ubuntu 22.04 LTSを想定)で、Dockerを用いて完全なGPUサポートを持つJupyterLab開発環境を構築する手順と、発生しがちなエラーの解決方法をステップバイステップで解説します。
原因の解説:なぜGPUがコンテナ内から見えないのか?
標準的なDockerエンジンは、ホストマシンのGPUデバイスを直接コンテナ内に公開する機能を持っていません。そのため、特別なツールキットが必要になります。これがNVIDIA Container Toolkitです。このツールキットがインストール・設定されていないことが、GPU関連エラーの最も一般的な根本原因です。
その他の原因としては:
- NVIDIAドライバの不備: ホストマシン自体に適切なNVIDIAドライバがインストールされていない。
- Dockerイメージの選択ミス: PyTorchやTensorFlowのベースイメージには、GPUサポート版とCPUのみ版が存在します。誤ってCPU版を選択すると、CUDAライブラリが含まれていません。
- ランタイムの指定漏れ:
docker runコマンドで--gpusオプションまたは--runtime=nvidiaを指定し忘れている。 - 権限問題: Dockerデーモンやコンテナを実行するユーザーに必要な権限がない。
解決方法:ステップバイステップ構築手順
ステップ1: ホストマシンの前提条件確認
まず、ホストマシンが以下の条件を満たしていることを確認します。
# 1. NVIDIAドライバがインストールされているか確認
nvidia-smi
このコマンドでGPU情報が表示されればOKです。表示されない場合は、NVIDIA公式サイトからドライバをインストールしてください。
# 2. Dockerエンジンがインストールされているか確認
docker --version
ステップ2: 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 systemctl restart docker
インストール後、以下のコマンドで設定をテストできます。
sudo docker run --rm --gpus all nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi
ホストと同じGPU情報がコンテナ内から表示されれば成功です。もしdocker: Error response from daemon: unknown or invalid runtime name: nvidia のようなエラーが出る場合は、以下のコマンドでDockerデーモンの設定を追加する必要があります。
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
ステップ3: GPU対応JupyterLab Dockerイメージの準備と実行
ここでは、PyTorchの公式GPUイメージをベースにしたDockerfileを作成します。プロジェクトディレクトリを作成し、その中にDockerfileを以下の内容で作成します。
# Dockerfile
FROM pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime
# システムパッケージの更新と必要なツールのインストール
RUN apt-get update && apt-get install -y
curl
git
wget
vim
&& rm -rf /var/lib/apt/lists/*
# JupyterLabのインストールと拡張機能(オプション)
RUN pip install --no-cache-dir
jupyterlab
ipywidgets
jupyterlab_widgets
matplotlib
seaborn
pandas
scikit-learn
# 作業ディレクトリの設定
WORKDIR /workspace
# JupyterLabの起動ポートを公開
EXPOSE 8888
# デフォルトコマンド:JupyterLabの起動
# --ip=0.0.0.0 はコンテナ外からの接続を許可
# --allow-root はroot実行時の警告を抑制(本番環境では非推奨)
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''", "--NotebookApp.password=''"]
次に、このDockerfileからイメージをビルドします。
docker build -t my-gpu-jupyterlab:latest .
ビルドが完了したら、コンテナを起動します。ホストのポート8888をコンテナの8888にマッピングし、カレントディレクトリをコンテナ内の/workspaceにマウントします。
docker run -d --gpus all
-p 8888:8888
-v $(pwd):/workspace
--name gpu-jupyter-container
my-gpu-jupyterlab:latest
--gpus allオプションがGPUアクセスを可能にするキーです。特定のGPUのみを割り当たい場合は、--gpus '"device=0,1"'のように指定します。
ステップ4: 動作確認
ブラウザで http://localhost:8888 にアクセスし、JupyterLabが起動していることを確認します。新しいノートブックを作成し、以下のPythonコードを実行してGPUが認識されているかテストします。
import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
if torch.cuda.is_available():
print(f"CUDA device count: {torch.cuda.device_count()}")
print(f"Current device: {torch.cuda.current_device()}")
print(f"Device name: {torch.cuda.get_device_name(0)}")
期待される出力例:
PyTorch version: 2.2.0+cu121
CUDA available: True
CUDA device count: 1
Current device: 0
Device name: NVIDIA GeForce RTX 4090
よくあるエラーとその解決策
エラー1: 「Could not load dynamic library ‘libcudart.so.11.0’」
エラーメッセージ例:
Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
原因と解決策: 使用しているPyTorchやTensorFlowのバージョンが要求するCUDAランタイムのバージョンと、イメージにインストールされているCUDAバージョンが一致していません。DockerfileのFROM行で、使用するフレームワークのバージョンに合ったCUDAバージョンのタグを指定してください(例: pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime)。
エラー2: 「Unable to find image ‘pytorch/pytorch:latest’ locally」後のビルド失敗
原因と解決策: latestタグはCPU版を指すことがあります。明示的にGPUサポートを含むタグ(-cudaXX.Xが含まれるもの)を使用してください。Docker HubのPyTorch公式リポジトリで利用可能なタグを確認しましょう。
エラー3: パーミッションエラーによるマウント失敗
エラーメッセージ例: ノートブックでファイル作成ができない、Permission denied。
原因と解決策: ホストとコンテナ間のユーザーID(UID)不一致。Dockerfile内で作業ユーザーを作成し、適切な権限を付与するか、docker run時に-u $(id -u):$(id -g)オプションを追加してホストのUID/GIDで実行します。
docker run -d --gpus all
-p 8888:8888
-v $(pwd):/workspace
-u $(id -u):$(id -g)
--name gpu-jupyter-container
my-gpu-jupyterlab:latest
まとめ・補足情報
Dockerを用いたGPU対応JupyterLab環境の構築は、NVIDIA Container Toolkitの正しいインストールと、--gpusオプションの指定が成功のカギです。これにより、再現性が高く、依存関係に悩まされないAI開発環境を手軽に構築できます。
補足情報:
- docker-composeの利用: 複数のサービスを連携させる場合は、
docker-compose.ymlファイルを作成すると管理が楽になります。その場合も、runtime: nvidiaまたはdeploy.reservations.devicesセクションでGPUを指定する必要があります。 - イメージの軽量化: 本番環境では、
-runtimeタグの代わりに-develタグを使用するとコンパイラ等も含まれるためイメージが大きくなります。必要最小限のパッケージのみをインストールすることを心がけましょう。 - セキュリティ: 記事内の例では簡便さのためトークンとパスワードを無効化していますが、インターネットに公開する環境では必ず強固なトークンやパスワードを設定し、SSL/TLS化を検討してください。
この環境構築手順をマスターすれば、新しいマシンやクラウドインスタンスでも、迅速に最高のAI開発環境を整えることができるでしょう。