【Docker】Docker + NVIDIA GPUでAI開発環境を構築する方法

導入

Dockerコンテナ内でGPUを活用したAIモデルの学習や推論を実行しようとすると、「CUDA driver version is insufficient for CUDA runtime version」や「Could not load dynamic library ‘libcudart.so’」といったエラーに遭遇することがあります。これにより、せっかく構築した環境でTensorFlowやPyTorchがGPUを認識せず、CPUでしか動作しないという問題が発生します。本記事では、Dockerコンテナ内でNVIDIA GPUを正しく認識・利用できる開発環境を構築するための具体的な手順とトラブルシューティング方法を詳しく解説します。

原因の説明

この問題の根本的な原因は、ホストマシン(物理サーバーやPC)のGPUドライバやCUDAツールキットと、Dockerコンテナ内で実行されるAIフレームワーク(TensorFlow/PyTorchなど)が要求するCUDAライブラリのバージョン間に互換性がないことです。DockerコンテナはデフォルトではホストのGPUリソースを認識しません。コンテナ内に適切なNVIDIAのライブラリ(CUDA, cuDNN)をインストールし、かつホストのGPUデバイスをコンテナにマウントするための特別なランタイム(nvidia-container-runtime)が必要となります。これらの要素が正しく設定されていない場合、コンテナ内のアプリケーションはGPUを利用できません。

解決方法

以下に、Docker環境でNVIDIA GPUを利用するための3つの主要な方法を紹介します。ホストOSの環境や利用するDockerのバージョンに応じて最適な方法を選択してください。

方法1: NVIDIA Container Toolkitを利用する(最も一般的な解決法)

NVIDIAが公式に提供する「NVIDIA Container Toolkit」をインストールすることで、Dockerコマンドに--gpusオプションが追加され、簡単にGPUをコンテナに割り当てられるようになります。現在の標準的な方法です。

手順1: ホストマシンの前提条件確認

  • NVIDIA GPUドライバがインストール済みであること。
  • Docker Engineがインストール済みであること。

以下のコマンドでドライバの状態を確認します。

nvidia-smi

手順2: NVIDIA Container Toolkitのインストール

公式の手順に従ってパッケージリポジトリを追加し、ツールキットをインストールします。

# パッケージリポジトリとGPGキーの設定
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

手順3: GPU付きコンテナの実行

インストール後、docker runコマンドに--gpus allオプションを追加することで、すべてのGPUをコンテナで利用できます。NVIDIAの公式CUDAコンテナでテストしてみましょう。

# すべてのGPUを割り当て
docker run --rm --gpus all nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi

# 特定のGPU(例えばGPU 0のみ)を割り当て
docker run --rm --gpus '"device=0"' nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi

手順4: カスタムDockerfileの例

PyTorch環境を構築するDockerfileの例です。nvidia/cudaベースイメージを使うことで、コンテナ内にCUDA環境が構築されます。

# Dockerfile
FROM nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04

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

# PyTorchのインストール (CUDA 12.1対応版)
RUN pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# 確認用スクリプトのコピー
COPY test_gpu.py /app/test_gpu.py

WORKDIR /app
CMD ["python3", "test_gpu.py"]
# test_gpu.py
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}")

このイメージをビルドし、実行します。

docker build -t my-pytorch-gpu .
docker run --rm --gpus all my-pytorch-gpu

方法2: Docker ComposeでGPU環境を定義する

複数のサービスを連携させる開発環境では、Docker Composeを使用すると便利です。docker-compose.ymlファイル内でGPUリソースを指定できます。

docker-compose.ymlの例

version: '3.8'
services:
  ai-training:
    build: .
    runtime: nvidia # ここがキーポイント
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    volumes:
      - ./data:/app/data
      - ./models:/app/models
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    command: python train.py

上記の設定では、runtime: nvidiadeploy.resources.reservations.devicesの設定により、サービスがGPUにアクセスできるようになります。以下のコマンドで起動します。

docker-compose up

方法3: レガシーな環境や制約がある場合の対応(nvidia-docker2)

古い環境や、何らかの理由でNVIDIA Container Toolkitが利用できない場合、以前広く使われていたnvidia-docker2パッケージを使用する方法もあります。ただし、この方法はレガシーとされており、新しい環境では方法1を強く推奨します。

# 古いリポジトリからのインストール(例)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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-docker2
sudo systemctl restart docker

# 実行コマンドは `docker run` の代わりに `nvidia-docker run` を使用
nvidia-docker run --rm nvidia/cuda:11.8.0-base nvidia-smi

この方法では、dockerコマンドの代わりにnvidia-dockerというラッパーコマンドを使用します。

まとめ

Dockerコンテナ内でNVIDIA GPUを利用するには、以下の手順が基本となります。

  1. ホスト環境の確認: nvidia-smiでGPUドライバが正常に動作していることを確認する。
  2. NVIDIA Container Toolkitのインストール: ホストOSに公式ツールキットをインストールし、Dockerデーモンを再起動する。
  3. 適切なベースイメージの選択: Dockerfileでは、必要なCUDA/cuDNNバージョンが含まれるnvidia/cudaの公式イメージをFROM句で指定する。
  4. GPUの割り当て: コンテナ実行時に--gpus allオプションを付与する。Docker Composeを使用する場合はruntimedeployセクションで指定する。

追加のTips:

  • ホストのCUDAドライババージョンは、コンテナ内でインストールするCUDAツールキットのバージョンより新しいか同等である必要があります。互換性テーブルを必ず確認しましょう。
  • PyTorchやTensorFlowの各バージョンは、特定のCUDAバージョンに依存しています。ベースイメージのCUDAバージョンと、インストールするAIフレームワークのバージョンの組み合わせに注意してください。
  • ディスクスペースを節約するために、ビルド時にのみ必要な開発用パッケージ(cuda-compiler-12-1など)を含める場合は、マルチステージビルドを活用し、最終的なランタイムイメージにはcuda-runtime-12-1などの最小限のパッケージのみを含めることを検討してください。

💡 GPU環境のセットアップを簡単に

ローカルGPU環境の構築が難しい場合、クラウドGPUサービスなら数分で開発環境が整います:

  • RunPod — RTX 4090が$0.44/h、Jupyter/SSH対応でセットアップ不要
  • Vast.ai — 最安値GPUマーケットプレイス、コスパ重視ならこちら

⚡ GPU環境をすぐに使いたいなら

ハードウェアの購入・セットアップなしで、すぐにGPU環境を使えるクラウドサービスがおすすめです。

  • RunPod — RTX 4090/A100/H100を即座に利用可能
  • Vast.ai — 最安のGPUクラウド、オークション方式で低コスト
  • RTX 5090をAmazonで見る — 自宅GPU環境を構築するなら
この記事は役に立ちましたか?