問題の概要:JupyterLab環境でGPUが認識されない・使えない
AI開発、特に深層学習モデルのトレーニングや推論を行う際、GPUの活用は必須です。Dockerを使用してJupyterLab環境を構築する際、ホストマシンにGPUが搭載されていても、コンテナ内からGPUが認識されず、以下のような問題が発生することがあります。
- JupyterLabのノートブック上で
torch.cuda.is_available()がFalseを返す。 - TensorFlowでGPUデバイスが見つからないという警告やエラーが表示される。
- NVIDIA関連のコマンド(
nvidia-smi)をコンテナ内で実行できない。 - トレーニング速度がCPU並みで、GPUの性能が全く活かせていない。
これらの問題は、DockerコンテナがデフォルトではホストのGPUリソースにアクセスできないことに起因しています。本記事では、NVIDIA GPUを搭載したLinuxホストマシン上で、Dockerを用いてGPU対応のJupyterLab環境を正しく構築する手順と、発生しやすいエラーへの対処法を解説します。
原因の解説:なぜDockerコンテナからGPUが見えないのか
Dockerの標準的な実行環境では、コンテナはホストのハードウェア(GPUを含む)を直接認識しません。GPUをコンテナ内で使用するには、ホストのGPUドライバとコンテナ内のCUDAライブラリを接続するための特別な仕組みが必要です。
これを実現するのが、NVIDIA Container Toolkit(旧称:nvidia-docker2)です。このツールキットは、DockerランタイムにNVIDIA GPUをサポートする機能を追加し、--gpusオプションなどのコマンドを通じて、コンテナにGPUリソースを安全に割り当てられるようにします。
したがって、単にdocker runでJupyterLabイメージを起動してもGPUは使えず、以下の準備が必須となります。
- ホストマシンに適切なNVIDIA GPUドライバがインストールされている。
- NVIDIA Container Toolkitがホストにインストールされている。
- GPU対応のDockerイメージ(例:
pytorch/pytorch,tensorflow/tensorflow:latest-gpu-jupyter)を使用している。 - コンテナ起動時にGPUを割り当てる正しいコマンドオプションを指定している。
解決方法:ステップバイステップでの環境構築手順
ステップ1: ホスト環境の前提条件確認
まず、ホストマシン(Ubuntu等のLinuxを想定)で以下のコマンドを実行し、GPUが認識され、ドライバが正しくインストールされていることを確認します。
# NVIDIA GPUドライバとCUDAの状態確認
nvidia-smi
正常にインストールされていれば、GPUの型番、ドライババージョン、CUDAバージョンなどが表示されます。何も表示されない、またはコマンドが見つからない場合は、先にホストマシンへのNVIDIAドライバのインストールが必要です。
ステップ2: NVIDIA Container Toolkitのインストール
DockerがGPUを認識できるようにするツールキットをインストールします。以下のコマンドはUbuntu/Debian系ディストリビューション向けです。
# リポジトリと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
ホストで実行した時と同じnvidia-smiの出力がコンテナ内から得られれば成功です。
ステップ3: GPU対応JupyterLabコンテナの起動
ここでは、PyTorchの公式GPUイメージを使用する例を示します。TensorFlowイメージなども同様のオプションで起動可能です。
# 基本的な起動コマンド
docker run -d
--gpus all
-p 8888:8888
-v $(pwd)/workspace:/workspace
--name jupyterlab-gpu
pytorch/pytorch:latest
しかし、このままではJupyterLabが起動しません。JupyterLabを起動し、トークンなしでアクセスできるようにするためのコマンドを追加する必要があります。また、コンテナ内のユーザー権限問題を避けるため、rootユーザーで実行するオプションを追加します(本番環境ではユーザー設定を推奨)。
# JupyterLabを起動する完全なコマンド例
docker run -d
--gpus all
-p 8888:8888
-v $(pwd)/workspace:/workspace
-e JUPYTER_ENABLE_LAB=yes
--name jupyterlab-gpu
--user root
pytorch/pytorch:latest
jupyter lab --ip=0.0.0.0 --port=8888 --allow-root --no-browser --NotebookApp.token=''
ブラウザで http://localhost:8888 にアクセスすると、JupyterLabのインターフェースが表示されます。
ステップ4: コンテナ内でのGPU動作確認
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"GPU device name: {torch.cuda.get_device_name(0)}")
print(f"CUDA version: {torch.version.cuda}")
期待される出力例:
PyTorch version: 2.2.0
CUDA available: True
GPU device name: NVIDIA GeForce RTX 4090
CUDA version: 12.1
CUDA available: Falseと表示される場合は、構築手順に問題があります。
よくあるエラーメッセージと対処法
エラー1: “docker: Error response from daemon: could not select device driver …”
エラーメッセージ例:
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
原因と解決策: NVIDIA Container Toolkitが正しくインストールされていない、またはDockerデーモンの再起動が行われていない可能性が高いです。ステップ2のインストール手順を再度確認し、sudo systemctl restart dockerを実行してください。
エラー2: “RuntimeError: No CUDA GPUs are available” (PyTorch内でのエラー)
原因と解決策: コンテナ起動時に--gpusオプションが指定されていません。起動中のコンテナを停止(docker stop jupyterlab-gpu)して削除(docker rm jupyterlab-gpu)し、正しい--gpus allオプションを含むコマンドで再起動してください。
エラー3: CUDAバージョンの不一致
エラーメッセージ例:
CUDA error: no kernel image is available for execution on the device
原因と解決策: ホストのCUDAドライババージョンと、コンテナイメージが要求するCUDAランタイムバージョンに互換性がない場合に発生します。nvidia-smiの上部で表示される「CUDA Version」はドライバがサポートする最大のCUDAランタイムバージョンです。使用するDockerイメージのタグ(例:pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime)を、ホストのドライバがサポートするバージョンと合致するように明示的に指定することで解決できます。
コード例・コマンド例:実践的な環境構築スクリプト
以下は、一連のセットアップを自動化するシェルスクリプトの例です。setup_jupyter_gpu.shというファイルに保存して実行権限を与えれば、環境構築を簡略化できます。
#!/bin/bash
# setup_jupyter_gpu.sh
# コンテナ名とポート、ボリュームの設定
CONTAINER_NAME="jupyterlab-gpu"
PORT="8888"
WORKSPACE_DIR="$HOME/jupyter_workspace"
# ワークスペースディレクトリがなければ作成
mkdir -p $WORKSPACE_DIR
# 既存の同名コンテナがあれば停止・削除
docker stop $CONTAINER_NAME 2>/dev/null
docker rm $CONTAINER_NAME 2>/dev/null
# GPU対応JupyterLabコンテナの起動
echo "Starting GPU-enabled JupyterLab container..."
docker run -d
--gpus all
-p $PORT:8888
-v $WORKSPACE_DIR:/workspace
-e JUPYTER_ENABLE_LAB=yes
--name $CONTAINER_NAME
--user root
--restart unless-stopped
pytorch/pytorch:latest
jupyter lab --ip=0.0.0.0 --port=8888 --allow-root --no-browser --NotebookApp.token=''
# 起動ログの確認
sleep 3
echo "Container started. Checking logs..."
docker logs --tail 10 $CONTAINER_NAME
echo -e "nJupyterLab should be accessible at: http://localhost:$PORT"
echo "Workspace directory is mounted at: $WORKSPACE_DIR"
まとめ・補足情報
Dockerを用いたGPU対応JupyterLab環境の構築は、NVIDIA Container Toolkitの導入が最大のポイントです。これにより、環境の再現性と移植性を保ちつつ、強力なGPUリソースを活用したAI開発が可能になります。
補足情報:
- セキュリティ: 本記事の例では簡便さのため
--user rootと--NotebookApp.token=''を使用していますが、本番環境や外部に公開する場合は、非rootユーザーの作成と強力なパスワード/トークンの設定が必須です。 - イメージの選択:
pytorch/pytorch:latestは常に最新版を指します。プロジェクトの再現性を重視する場合は、pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtimeのように、バージョンを明示したタグを使用することを強く推奨します。 - リソース制限: 特定のGPUのみを割り当てたい場合は、
--gpus allの代わりに--gpus '"device=0,1"'(0番と1番のGPUを割り当て)のように指定できます。 - Docker Composeの利用: より複雑な環境(複数コンテナ、環境変数ファイル等)を管理する場合は、
docker-compose.ymlファイルを記述してdocker-compose upで起動する方法も一般的です。その場合も、runtime: nvidiaなどの設定が必要になります。
このガイドに従うことで、誰でも短時間で高性能なAI開発環境を整え、機械学習モデルの実験と開発に集中できる基盤を手に入れることができるでしょう。