問題の概要:JupyterLab環境でのGPU利用に関する課題
AI開発、特に深層学習モデルのトレーニングや推論を行う際、GPUの活用は必須です。しかし、Dockerコンテナ内で構築したJupyterLab環境からGPUを認識・利用しようとすると、以下のようなエラーに遭遇することが頻繁にあります。
RuntimeError: No CUDA GPUs are availabletorch.cuda.is_available()がFalseを返す- Docker実行時に
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].が表示される - JupyterLabのカーネルは起動するが、GPUメモリが0MBと表示される
これらの問題は、ホストマシンに物理的にGPUが搭載されていても、Dockerコンテナが適切にGPUリソースにアクセスできない設定になっているために発生します。本記事では、NVIDIA GPUを搭載したLinuxホストマシン(Ubuntu 22.04 LTSを想定)上で、Dockerを用いて完全にGPU対応したJupyterLab開発環境を構築する手順を、具体的なエラーとその解決策とともに解説します。
原因の解説:なぜDockerコンテナはGPUを認識できないのか
従来のDocker環境は、コンテナがホストのハードウェアを直接利用することを想定していません。GPUを利用するためには、ホストのGPUドライバやCUDAツールキットをコンテナ内から参照できるようにする特別な仕組みが必要です。この橋渡し役を果たすのがNVIDIA Container Toolkit(旧称:nvidia-docker2)です。このツールキットがインストール・設定されていない、またはDocker実行時に適切なランタイム(--gpusオプションまたはnvidiaランタイム)が指定されていないことが、問題の根本的な原因です。
また、使用するベースDockerイメージにCUDAライブラリやcuDNNが含まれていない場合も、PyTorchやTensorFlowがGPUを認識できなくなります。
解決方法:ステップバイステップ構築ガイド
ステップ1: ホストマシンの前提条件確認
まず、ホストマシンにNVIDIA GPUドライバが正しくインストールされていることを確認します。
# NVIDIAドライバとCUDAバージョンの確認
nvidia-smi
このコマンドでGPU情報が表示されればOKです。表示されない場合は、まずホストOSに適切なドライバをインストールしてください。
ステップ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 nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
よくあるエラー: E: リポジトリ ... を更新できませんでした というエラーが出る場合は、上記の$distribution変数が正しく設定されていない可能性があります。手動でubuntu2204などを指定してみてください。
ステップ3: GPU対応JupyterLab Dockerイメージの準備
ここでは、PyTorchの公式GPUイメージをベースに、JupyterLabを追加したDockerfileを作成します。docker-compose.ymlを使う方法も後述します。
# Dockerfile
FROM pytorch/pytorch:2.2.2-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
jupyter-archive
# 作業ディレクトリの設定
WORKDIR /workspace
# JupyterLabの起動ポートを公開
EXPOSE 8888
# 起動コマンド
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''", "--NotebookApp.password=''"]
ステップ4: イメージのビルドとコンテナ起動
Dockerfileがあるディレクトリでイメージをビルドし、--gpus allオプションを付けてコンテナを起動します。
# イメージのビルド
docker build -t jupyterlab-gpu:latest .
# GPUを全て割り当ててコンテナを起動
docker run --gpus all -d -p 8888:8888 -v $(pwd):/workspace --name my-jupyterlab jupyterlab-gpu:latest
# ログの確認(起動時にトークンが表示される)
docker logs my-jupyterlab
エラー例と解決: docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. このエラーは、ステップ2のNVIDIA Container ToolkitのインストールまたはDockerの再起動が完了していない場合に発生します。sudo systemctl restart dockerを実行し、ホストマシンのドライバ状態をnvidia-smiで再度確認してください。
ステップ5: 動作確認
ブラウザで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"GPU device name: {torch.cuda.get_device_name(0)}")
print(f"GPU memory allocated: {torch.cuda.memory_allocated(0)}")
print(f"GPU memory reserved: {torch.cuda.memory_reserved(0)}")
期待される出力は、CUDA available: Trueとなり、GPUの名前やメモリ情報が表示されることです。
コード例・コマンド例:docker-composeを使った高度な設定
環境変数の管理や複数サービスの連携を容易にするため、docker-compose.ymlを使用する方法をお勧めします。
# docker-compose.yml
version: '3.8'
services:
jupyterlab:
build: .
container_name: jupyterlab-gpu-container
runtime: nvidia # NVIDIA Container Toolkitを使用するランタイムを指定
environment:
- NVIDIA_VISIBLE_DEVICES=all # 全てのGPUを可視化
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
ports:
- "8888:8888"
volumes:
- ./workspace:/workspace
- ./data:/data
stdin_open: true
tty: true
command: jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''
この設定ファイルを使用して起動・停止するコマンドは以下の通りです。
# ビルドしてバックグラウンドで起動
docker-compose up -d --build
# ログの確認
docker-compose logs -f
# 停止
docker-compose down
まとめ・補足情報
Dockerを用いたGPU対応JupyterLab環境の構築は、NVIDIA Container Toolkitの正しいインストールと、Docker実行時の--gpusオプションまたはnvidiaランタイムの指定が成功の鍵です。本記事の手順に従うことで、再現性が高く、ホストマシンを汚さないクリーンなAI開発環境を手に入れることができます。
補足情報:
- 特定のGPUのみを割り当てる:
docker run --gpus '"device=0,1"' ...とすると、GPU ID 0と1のみを割り当てられます。 - CUDAバージョンの互換性: ベースイメージのCUDAバージョン(例: 12.1)と、ホストにインストールされているドライバのバージョンには互換性が必要です。NVIDIAの公式互換性テーブルを参照してください。
- メモリ制限: DockerコンテナにGPUメモリの制限をかけたい場合は、
docker run --gpus all --memory=16g --memory-swap=16g ...のようにメモリオプションを追加します。 - トラブルシューティングの最終手段: どうしてもGPUが認識されない場合、最もシンプルなテストとして、
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smiを実行してください。これでGPU情報が表示されれば、DockerのGPU環境そのものは正常です。表示されなければ、ホストのドライバやNVIDIA Container Toolkitのインストールに問題があります。
この環境を土台に、必要なPythonライブラリ(Transformers, TensorFlow, XGBoostなど)を追加インストールすることで、あらゆるAI開発タスクに対応できる強力な環境が完成します。