問題の概要:JupyterLab環境でGPUが利用できない
Dockerを使用してJupyterLabのAI開発環境を構築した際、GPUが認識されず、PyTorchやTensorFlowでtorch.cuda.is_available()がFalseを返すという問題が頻発します。具体的には、以下のようなエラーメッセージや状況に遭遇します。
- PyTorch実行時:
RuntimeError: No CUDA GPUs are available - TensorFlow実行時:
Could not load dynamic library 'libcudart.so.11.0' - nvidia-smiコマンドがコンテナ内で実行できない
- 深層学習のトレーニングが異常に遅い(CPUで実行されている)
この問題は、Dockerの基本的なセットアップだけではNVIDIA GPUをコンテナ内から利用できるようにならないために発生します。
原因の解説:DockerとGPU連携の仕組み
この問題の根本原因は、ホストマシンに物理的に搭載されているNVIDIA GPUを、Dockerコンテナ内のプロセスが直接利用できないことにあります。通常のDocker環境は、CPUやメモリなどのリソースを抽象化・隔離しますが、GPUのような特殊なハードウェアデバイスはデフォルトではコンテナに公開されません。
GPUをコンテナ内で利用するためには、以下の3つの要素が正しくセットアップされている必要があります。
1. NVIDIAドライバ(ホスト側)
ホストOS(Ubuntu等)に適切なNVIDIA GPUドライバがインストールされている必要があります。これがなければ、そもそもシステムがGPUを認識しません。
2. NVIDIA Container Toolkit(旧NVIDIA-Docker)
DockerデーモンがNVIDIA GPUを認識し、コンテナに安全に受け渡すためのランタイムを提供するソフトウェア層です。これがインストールされていないと、DockerはGPUリソースを管理できません。
3. CUDA対応のコンテナイメージ
コンテナ内で動作するJupyterLabやPython環境に、CUDAライブラリ(cuDNN, CUDA Toolkit等)が含まれている必要があります。CUDA非対応のベースイメージ(例: python:3.9-slim)を使うと、GPUを認識するソフトウェアスタックが欠如します。
解決方法:ステップバイステップでの環境構築
以下に、Ubuntu 20.04/22.04 LTSをホストOSとする環境を想定した、完全な構築手順を示します。
ステップ1: ホスト側のNVIDIAドライバ確認とインストール
まず、ホストマシンでGPUが正しく認識されているかを確認します。
# NVIDIAドライバの状態とGPU情報を確認
nvidia-smi
コマンドが実行でき、GPUの型番やドライババージョンが表示されればOKです。エラーが出る場合は、ドライバをインストールする必要があります。
# Ubuntuでのドライバインストール例(推奨ドライバを自動選択)
sudo ubuntu-drivers autoinstall
sudo reboot
ステップ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デーモンにNVIDIAランタイムを設定
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# インストール確認
docker info | grep -i runtime
出力にnvidiaが含まれていれば成功です。
ステップ3: GPU対応JupyterLabコンテナの起動
CUDAがプリインストールされた公式イメージを使用するのが確実です。ここでは、PyTorchの公式イメージを例にします。
# 最新のPyTorch + CUDA + JupyterLab環境を起動
docker run -d
--gpus all
--name jupyter-gpu
-p 8888:8888
-v $(pwd)/workspace:/home/jovyan/work
-e JUPYTER_ENABLE_LAB=yes
pytorch/pytorch:latest
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token=''
重要なオプション解説:
--gpus all: すべてのGPUをコンテナに割り当てます。特定のGPUのみ割り当てる場合は--gpus '"device=0,1"'のように指定します。-v $(pwd)/workspace:/home/jovyan/work: ホストのカレントディレクトリにあるworkspaceフォルダを、コンテナ内の作業ディレクトリにマウントします。コードやデータの永続化が可能になります。
ステップ4: 動作確認
ブラウザでhttp://localhost:8888にアクセスし、JupyterLabが起動していることを確認します。新しいノートブックを作成し、以下のコードを実行してGPUが認識されているかテストします。
# PyTorchでの確認
import torch
print(f"PyTorchバージョン: {torch.__version__}")
print(f"CUDA利用可能: {torch.cuda.is_available()}")
if torch.cuda.is_available():
print(f"GPUデバイス名: {torch.cuda.get_device_name(0)}")
print(f"CUDAバージョン: {torch.version.cuda}")
# TensorFlowでの確認 (イメージに含まれる場合)
# import tensorflow as tf
# print(f"TensorFlowバージョン: {tf.__version__}")
# print(f"GPUリスト: {tf.config.list_physical_devices('GPU')}")
期待される出力例:
PyTorchバージョン: 2.1.0
CUDA利用可能: True
GPUデバイス名: NVIDIA GeForce RTX 4090
CUDAバージョン: 11.8
よくあるエラーとトラブルシューティング
エラー1: “docker: Error response from daemon: could not select device driver…”
原因: NVIDIA Container Toolkitが正しくインストールされていない、またはDockerデーモンの再起動が行われていない。
解決策:
# ランタイム設定を確認
cat /etc/docker/daemon.json
# nvidiaランタイムが設定されていることを確認後、Dockerを再起動
sudo systemctl restart docker
エラー2: “Could not load dynamic library ‘libcudart.so.11.0′”
原因:</strong コンテナイメージ内のCUDAバージョンと、ホストのNVIDIAドライバがサポートするCUDAバージョンが互換性がない。
解決策: ホストのドライバがサポートするCUDAバージョンを確認し、それに合ったコンテナイメージのタグを指定します。
# ホストのドライバがサポートする最大CUDAバージョンを確認
nvidia-smi
# 出力上部の「CUDA Version: 12.4」などを確認
# 互換性のあるイメージタグを指定して起動(例: CUDA 11.8対応イメージ)
docker run --gpus all pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime nvidia-smi
エラー3: コンテナ内でnvidia-smiが実行できない
原因: --gpusオプションが指定されていない。
解決策: コンテナ起動コマンドに必ず--gpusオプションを追加します。既存のコンテナがある場合は、一旦削除して再作成します。
# 誤ったコマンド(GPUが使えない)
docker run -d --name jupyter-cpu -p 8888:8888 pytorch/pytorch jupyter lab
# 正しいコマンド
docker run -d --gpus all --name jupyter-gpu -p 8888:8888 pytorch/pytorch jupyter lab
コード例・コマンド例:実用的なDocker Compose設定
環境を再現可能にするため、docker-compose.ymlを使用することを強くお勧めします。
# docker-compose.yml
version: '3.8'
services:
jupyter-gpu:
image: pytorch/pytorch:latest
container_name: jupyter-lab-gpu
runtime: nvidia # NVIDIA Container Toolkitを使用
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
ports:
- "8888:8888"
volumes:
- ./workspace:/home/jovyan/work
- ./config:/home/jovyan/.jupyter
environment:
- JUPYTER_ENABLE_LAB=yes
- GRANT_SUDO=yes
command: jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''
restart: unless-stopped
この設定ファイルを使用して環境を起動・管理します。
# 環境の起動
docker-compose up -d
# ログの確認
docker-compose logs -f
# 環境の停止
docker-compose down
まとめ・補足情報
JupyterLabでGPU対応のAI開発環境をDockerで構築するには、ホスト側のNVIDIAドライバ、NVIDIA Container Toolkit、そして適切なCUDA対応コンテナイメージの3点セットが必須です。--gpusオプションの付け忘れはよくあるミスなので注意しましょう。
また、イメージのタグは慎重に選択してください。latestタグは便利ですが、CUDAバージョンやPyTorch/TensorFlowのバージョンが急に変わると互換性問題が発生する可能性があります。プロダクション環境では、pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtimeのように、具体的なバージョンを含むタグを指定することをお勧めします。
本記事の手順に従うことで、再現性が高く、GPUの力を最大限に活用できる隔離されたAI開発環境を手に入れることができます。Docker Composeを活用すれば、チームメンバー全員が全く同じ環境で開発を進めることも可能になり、開発効率が大幅に向上するでしょう。