問題の概要:JupyterLab環境でGPUが認識されない・利用できない
Dockerを使用してJupyterLabのAI開発環境を構築する際、特に深層学習モデルの学習や推論を行う場合、GPUを活用できなければ処理速度が大幅に低下します。よく遭遇する問題として、Dockerコンテナ内からホストマシンのGPUが認識されない、またはPyTorch/TensorFlowがGPUを利用できないというエラーがあります。具体的には、以下のようなエラーメッセージが表示されます。
# よくあるエラーメッセージ例
RuntimeError: No CUDA GPUs are available
torch.cuda.is_available() # False を返す
Could not load dynamic library 'libcudart.so.11.0'
この問題は、Dockerの基本的なセットアップだけではNVIDIA GPUをコンテナ内で利用できるようにするための特別な設定が必要であるために発生します。本記事では、NVIDIA Docker Toolkitを使用した正しい構築手順と、構築途中で発生しがちなエラーの解決方法をステップバイステップで解説します。
原因の解説:なぜDockerコンテナはデフォルトでGPUを認識しないのか
通常のDocker環境は、ホストマシンのCPUやメモリ、ネットワークなどのリソースを抽象化してコンテナに提供しますが、GPUのような特殊なハードウェアリソースはデフォルトでは隔離されたコンテナ内からアクセスできません。GPU(特にNVIDIA GPU)を利用するには、以下の要素が必要です。
- NVIDIAドライバ: ホストOSにインストールされ、GPUを制御するソフトウェア。
- CUDA Toolkit: NVIDIAが提供するGPU向け並列計算プラットフォーム。多くのAIフレームワークが依存しています。
- NVIDIA Container Toolkit (旧nvidia-docker2): DockerコンテナがホストのGPUドライバやCUDAライブラリに安全にアクセスするためのブリッジ役となるソフトウェア。
「GPUが認識されない」エラーのほとんどは、上記3番目のNVIDIA Container Toolkitが正しくインストール・設定されていない、またはDocker runコマンドでGPUを有効化するオプション(--gpus all)が指定されていないことが原因です。
解決方法:ステップバイステップでのGPU対応JupyterLab環境構築
ここからは、Ubuntu 20.04/22.04 LTSをホストOSとする環境を想定して、具体的な構築手順を説明します。他のディストリビューションでも基本手順は同様です。
ステップ1: 前提条件の確認
まず、ホストマシンにNVIDIA GPUドライバとDockerが正しくインストールされていることを確認します。
# NVIDIAドライバの確認
nvidia-smi
# 期待される出力例(ドライババージョンとGPU情報が表示される)
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 525.125.06 Driver Version: 525.125.06 CUDA Version: 12.0 |
# |-------------------------------+----------------------+----------------------+
# Dockerの確認
docker --version
sudo systemctl status docker
nvidia-smiコマンドでエラーが出力される場合は、ホストOSへのNVIDIAドライバのインストールから行う必要があります。
ステップ2: NVIDIA Container Toolkitのインストールと設定
これが最も重要なステップです。以下のコマンドを順に実行して、NVIDIA Container Toolkitをセットアップします。
# パッケージリストの更新と必要なパッケージのインストール
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# NVIDIAのGPGキーとリポジトリの追加
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
echo "deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://nvidia.github.io/libnvidia-container/stable/ubuntu22.04/$(arch) /" | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# リポジトリの更新とToolkitのインストール
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# Dockerデーモンを再起動して設定を反映
sudo systemctl restart docker
# インストールの確認(nvidia-ctkコマンドが使えるか)
nvidia-ctk --version
ステップ3: Dockerコンテナの起動(GPU有効化)
NVIDIAが提供するCUDA付きのJupyterLabイメージを使用するのが簡単です。以下のdocker runコマンドで、GPUを有効化した状態でコンテナを起動します。
# 基本的な起動コマンド
sudo docker run -d
--gpus all
-p 8888:8888
-v /path/to/your/workspace:/home/jovyan/work
--name jupyterlab-gpu
nvcr.io/nvidia/pytorch:23.10-py3
# より詳細な設定例(環境変数やメモリ制限を追加)
sudo docker run -d
--gpus all
-p 8888:8888
-e JUPYTER_ENABLE_LAB=yes
-v /home/user/ai_projects:/workspace
--shm-size=8g
--name my-jupyter-gpu
nvcr.io/nvidia/pytorch:23.10-py3
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token=''
ポイント: --gpus allオプションがGPUアクセスを許可するキーです。-vオプションでホストのディレクトリをコンテナ内にマウントすることで、データやコードを永続化できます。--shm-sizeはPyTorchのDataLoaderなどでメモリ不足が発生する場合に有効です。
ステップ4: コンテナ内でのGPU認識確認
コンテナが起動したら、ブラウザでhttp://localhost:8888にアクセスし、JupyterLabを開きます。新しいノートブックを作成し、以下のPythonコードを実行してGPUが正しく認識されているか確認します。
# PyTorchでの確認
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}")
# TensorFlowでの確認(イメージに含まれている場合)
try:
import tensorflow as tf
print(f"nTensorFlow version: {tf.__version__}")
print(f"GPU List: {tf.config.list_physical_devices('GPU')}")
except ImportError:
print("TensorFlow is not installed in this image.")
すべてのチェックが通れば、GPU対応環境の構築は成功です。
よくあるエラーとその解決策
エラー1: “docker: Error response from daemon: could not select device driver”
原因: NVIDIA Container Toolkitが正しくインストールされていない、またはDockerデーモンの再起動が行われていない。
解決策: ステップ2のインストール手順を再度確認し、sudo systemctl restart dockerを実行します。その後、docker info | grep -i runtimeを実行し、nvidiaが含まれていることを確認します。
エラー2: “Could not load dynamic library ‘libcudart.so.11.0′”
原因: コンテナ内のAIフレームワークが要求するCUDAバージョンと、ホストのドライバがサポートするCUDAバージョン、またはコンテナイメージに含まれるCUDAバージョンが一致していない。
解決策: 使用するDockerイメージのタグを、ホストのCUDAバージョンと互換性があるものに変更します。nvidia-smiで表示されるCUDA Versionはホストドライバがサポートする最大バージョンです。例えば、ホストのCUDA Versionが12.0と表示される場合、nvcr.io/nvidia/pytorch:23.10-py3(CUDA 12.2ベース)は動作しますが、古すぎるイメージは選択しないようにします。
# 互換性のあるイメージタグの例
# CUDA 11.8 ベース: nvcr.io/nvidia/pytorch:22.12-py3
# CUDA 12.2 ベース: nvcr.io/nvidia/pytorch:23.10-py3
エラー3: JupyterLabのトークンがわからない・接続できない
原因: コンテナ起動時のログに出力されるトークンを確認していない。
解決策: コンテナのログを確認するか、起動コマンドにトークンを無効化または固定するオプションを追加します。
# コンテナログの確認(トークンを探す)
sudo docker logs jupyterlab-gpu | grep token
# トークンを無効化して起動(開発環境のみ推奨)
# 上記の起動コマンド例のように `--NotebookApp.token=''` を追加
まとめ・補足情報
Dockerを用いたGPU対応JupyterLab環境の構築は、NVIDIA Container Toolkitの正しいインストールと、docker runコマンドにおける--gpusオプションの指定が成功のカギです。これにより、再現性が高く、クリーンなAI開発環境を手軽に構築できます。
さらに環境をカスタマイズしたい場合は、以下のようなDockerfileを作成して、必要なライブラリを追加インストールする方法があります。
# カスタムDockerfileの例
FROM nvcr.io/nvidia/pytorch:23.10-py3
USER root
# 追加システムパッケージのインストール
RUN apt-get update && apt-get install -y git wget
# 追加Pythonパッケージのインストール
RUN pip install --no-cache-dir
scikit-learn
pandas
matplotlib
seaborn
jupyterlab-git
# 作業ディレクトリの設定
WORKDIR /workspace
USER $NB_UID
このDockerfileをビルドし、同様に--gpus allオプション付きで実行すれば、プロジェクト固有のカスタム環境を構築できます。GPUを活用した効率的なAI開発の第一歩として、本手順をぜひお試しください。