【Docker/環境】JupyterLabでGPU対応AI開発環境を構築する手順とよくあるエラー解決法

問題の概要: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関連エラーの最も一般的な根本原因です。

その他の原因としては:

  1. NVIDIAドライバの不備: ホストマシン自体に適切なNVIDIAドライバがインストールされていない。
  2. Dockerイメージの選択ミス: PyTorchやTensorFlowのベースイメージには、GPUサポート版とCPUのみ版が存在します。誤ってCPU版を選択すると、CUDAライブラリが含まれていません。
  3. ランタイムの指定漏れ: docker runコマンドで--gpusオプションまたは--runtime=nvidiaを指定し忘れている。
  4. 権限問題: 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開発環境を整えることができるでしょう。

この記事は役に立ちましたか?