【Docker/環境】JupyterLabでGPU対応AI開発環境を構築する手順とトラブルシューティング

1. 問題の概要:JupyterLab環境でGPUが利用できない

Dockerを使用してJupyterLabのAI開発環境を構築した際、GPUを認識せず、PyTorchやTensorFlowで以下のようなエラーメッセージが表示されることがあります。

# PyTorchの場合
>>> import torch
>>> torch.cuda.is_available()
False

# TensorFlowの場合
>>> import tensorflow as tf
>>> tf.config.list_physical_devices('GPU')
[]

この問題は、DockerコンテナがホストマシンのGPUリソースにアクセスできない状態で起動しているために発生します。特に、NVIDIA GPUを活用した深層学習モデルの訓練や推論を行う場合、この問題は開発の大きな障壁となります。

2. 原因の解説

DockerコンテナがGPUを認識しない主な原因は以下の3つです。

2.1 NVIDIA Container Toolkitの未インストール

DockerコンテナからNVIDIA GPUを利用するには、ホストOSに「NVIDIA Container Toolkit」(旧称:nvidia-docker2)がインストールされている必要があります。これがないと、DockerデーモンはGPUデバイスをコンテナにマウントできません。

2.2 適切なベースイメージの未使用

CUDAやcuDNNなどのNVIDIAライブラリがプリインストールされていないベースイメージ(例:`python:3.9-slim`)を使用している場合、コンテナ内にGPUドライバやライブラリが存在せず、GPUを利用できません。

2.3 Docker実行コマンドのオプション不足

GPUサポートを有効にする`–gpus`オプションを指定せずにコンテナを起動している場合、たとえホストにNVIDIA Container Toolkitがインストールされていても、コンテナはGPUリソースにアクセスできません。

3. 解決方法:ステップバイステップでの環境構築

ステップ1: ホストマシンの環境確認とNVIDIA Container Toolkitのインストール

まず、ホストマシンにNVIDIA GPUドライバが正しくインストールされていることを確認します。

# NVIDIA GPUドライバの確認
nvidia-smi

# 出力例(GPU情報が表示されればOK)
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.17   Driver Version: 525.105.17   CUDA Version: 12.0    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0 Off |                  N/A |
| N/A   45C    P8    N/A /  N/A |      0MiB /  6144MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

次に、DockerとNVIDIA Container Toolkitをインストールします。Ubuntuを例に説明します。

# Dockerのインストール(既にある場合はスキップ可)
sudo apt-get update
sudo apt-get install docker.io

# NVIDIA Container Toolkitのリポジトリ追加とインストール
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

# Dockerデーモンの再起動
sudo systemctl restart docker

# インストール確認
docker run --rm --gpus all nvidia/cuda:12.0.0-base nvidia-smi

ステップ2: Dockerfileの作成

CUDAとJupyterLabがプリインストールされた公式イメージをベースに、必要なライブラリを追加するDockerfileを作成します。

# Dockerfile
# NVIDIAが提供するCUDA + Jupyterのベースイメージを使用
FROM nvidia/cuda:12.0.0-runtime-ubuntu22.04

# 必要なシステムパッケージのインストール
RUN apt-get update && apt-get install -y 
    python3 
    python3-pip 
    curl 
    && rm -rf /var/lib/apt/lists/*

# Pythonのエイリアス設定
RUN ln -s /usr/bin/python3 /usr/bin/python

# JupyterLabと主要AIライブラリのインストール
RUN pip3 install --no-cache-dir --upgrade pip
RUN pip3 install --no-cache-dir 
    jupyterlab 
    notebook 
    ipywidgets 
    torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 
    tensorflow[and-cuda] 
    pandas 
    numpy 
    matplotlib 
    scikit-learn 
    seaborn

# 作業ディレクトリの設定
WORKDIR /workspace

# JupyterLabの起動ポートを公開
EXPOSE 8888

# JupyterLabの起動コマンド
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''", "--NotebookApp.password=''"]

ステップ3: Dockerイメージのビルドとコンテナ起動

Dockerfileがあるディレクトリで以下のコマンドを実行します。

# Dockerイメージのビルド(タグ名は任意)
docker build -t jupyterlab-gpu:latest .

# GPUサポートを有効にしてコンテナを起動
docker run -d 
  --gpus all 
  -p 8888:8888 
  -v $(pwd)/workspace:/workspace 
  --name jupyter-gpu-container 
  jupyterlab-gpu:latest

# 起動ログの確認(トークン情報など)
docker logs jupyter-gpu-container

ステップ4: 動作確認

ブラウザで`http://localhost:8888`にアクセスし、JupyterLabが起動していることを確認します。新しいノートブックを作成し、以下のコードを実行して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}")

import tensorflow as tf
print(f"nTensorFlow version: {tf.__version__}")
print(f"GPU devices: {tf.config.list_physical_devices('GPU')}")

4. よくあるエラーとトラブルシューティング

エラー1: “docker: Error response from daemon: could not select device driver…”

原因: NVIDIA Container Toolkitが正しくインストールされていない、またはDockerデーモンの再起動が行われていない。

解決策:

# NVIDIA Container Toolkitの再インストールと確認
sudo apt-get update
sudo apt-get install --reinstall nvidia-container-toolkit

# Dockerデーモンの再起動
sudo systemctl restart docker

# nvidia-container-toolkitのサービス状態確認
sudo systemctl status nvidia-container-toolkit

エラー2: “RuntimeError: CUDA error: no kernel image is available for execution on the device”

原因: コンテナ内のCUDAバージョンと、インストールされたPyTorch/TensorFlowのCUDAバージョンが互換性がない。または、GPUのCompute Capabilityがライブラリのビルドバージョンに対応していない。

解決策: Dockerfile内で、ホストのCUDAバージョンに合ったPyTorch/TensorFlowをインストールする。

# Dockerfile内の修正例(CUDA 11.8用のPyTorchを明示的に指定)
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# または、より互換性の高いCPU/GPU両用バージョンを指定
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
# 注:この場合、コンテナ起動時にGPUが利用可能なら自動的にGPU版が使用される

エラー3: コンテナ起動後、JupyterLabに接続できない

原因: ポートの競合、またはコンテナが正常に起動していない。

解決策:

# 既存のコンテナを停止・削除
docker stop jupyter-gpu-container
docker rm jupyter-gpu-container

# ポートを変更して起動(例: 8899ポートを使用)
docker run -d 
  --gpus all 
  -p 8899:8888 
  -v $(pwd)/workspace:/workspace 
  --name jupyter-gpu-container 
  jupyterlab-gpu:latest

# コンテナのログを詳細に確認
docker logs -f jupyter-gpu-container

5. まとめ・補足情報

JupyterLabでGPU対応のAI開発環境をDockerで構築するには、1) ホストにNVIDIA Container Toolkitをインストール、2) 適切なCUDAベースイメージを使用、3) `–gpus`オプションを付けてコンテナを起動、という3つのステップが確実に行われていることが重要です。

本手順で構築した環境は、PyTorchとTensorFlowの両方に対応した、再現性の高い開発環境となります。`-v`オプションでホストのディレクトリをマウントしているため、コンテナを削除しても作業内容は失われません。

補足: プロダクション環境やチーム開発では、さらに以下の点を考慮すると良いでしょう。

  • Docker Composeを使用してサービス定義をコード化する
  • 特定のGPUデバイスのみを割り当てる(`–gpus ‘”device=0,1″‘`)
  • JupyterLabにセキュリティトークンやパスワードを設定する
  • 必要なPythonパッケージを`requirements.txt`で管理する

この環境構築により、ローカルマシンの環境を汚すことなく、最新のAIライブラリとGPUを活用した効率的な開発が可能になります。

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