【Docker/環境】NVIDIA Container ToolkitインストールとGPUパススルー設定の完全ガイド

問題の概要:Dockerコンテナ内でGPUが認識されない

AI開発や機械学習のプロジェクトで、Dockerコンテナ内からNVIDIA GPUを利用しようとすると、以下のような問題に直面することがあります。

  • コンテナ内でnvidia-smiコマンドを実行しても「Command not found」と表示される
  • PyTorchやTensorFlowがGPUを認識せず、CPUで動作してしまう
  • Docker実行時にdocker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].というエラーが発生する
  • RuntimeError: No CUDA GPUs are availableというエラーがPythonスクリプトで発生する

これらの問題は、ホストマシンにNVIDIAドライバがインストールされていても、DockerコンテナがGPUリソースにアクセスするための設定が不足しているために発生します。本記事では、NVIDIA Container Toolkitを用いてこの問題を解決する方法を詳しく解説します。

原因の解説:Dockerのデフォルト設定とGPUパススルーの必要性

デフォルトのDocker環境では、セキュリティと隔離の観点から、コンテナはホストマシンのハードウェアデバイス(GPUを含む)に直接アクセスできません。GPUを利用するためには、以下の2つの主要なコンポーネントを正しく設定する必要があります。

1. NVIDIA Container Toolkit (旧称: nvidia-docker2)

これは、DockerランタイムとNVIDIAドライバを連携させるための一連のツールとライブラリです。コンテナの起動時に、必要なGPUデバイスファイルやライブラリをコンテナ内にマウントし、適切な環境変数を設定する役割を果たします。

2. コンテナランタイムの設定

Dockerデーモン(dockerd)に、NVIDIA Container Toolkitが提供する特別なランタイム(nvidia-container-runtime)を使用するように指示する必要があります。これにより、docker runコマンドに--gpusオプションが使えるようになります。

設定が不完全な場合、コンテナは物理的に存在するGPUを「見る」ことができず、結果としてCUDA関連のエラーが発生します。

解決方法:ステップバイステップでのインストールと設定

ここでは、Ubuntu 20.04/22.04を例に、NVIDIA Container Toolkitのインストールから動作確認までの全手順を説明します。他のディストリビューションでも基本的な流れは同様です。

ステップ1: 前提条件の確認

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

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

# Dockerの確認
docker --version
sudo systemctl status docker

nvidia-smiコマンドでGPU情報が表示され、Dockerサービスがアクティブ(active (running))であることを確認してください。

ステップ2: NVIDIA Container Toolkitのインストール

パッケージリポジトリを設定し、必要なパッケージをインストールします。

# ディストリビューションを変数に設定(例: ubuntu2004, ubuntu2204等)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

# NVIDIAのGPGキーとリポジトリを追加
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

ステップ3: Dockerランタイムの設定

インストール後、DockerデーモンがNVIDIAランタイムを使用するように設定します。

# nvidia-container-runtimeをDockerの設定に登録
sudo nvidia-ctk runtime configure --runtime=docker

# Dockerデーモンを再起動して設定を反映
sudo systemctl restart docker

このコマンドは、/etc/docker/daemon.json ファイルを自動的に編集または作成し、"runtimes" セクションに "nvidia" を追加します。

ステップ4: 動作確認

最も簡単な方法は、公式のCUDAコンテナを実行してnvidia-smiが動作するか確認することです。

# すべてのGPUをコンテナにアタッチしてテスト
sudo docker run --rm --gpus all nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi

# 特定のGPUのみを指定する場合(例: GPU ID 0)
sudo docker run --rm --gpus '"device=0"' nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi

コンテナ内でホストと同じGPU情報が表示されれば成功です。以下のような出力が得られるはずです。

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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 RTX 4090        Off | 00000000:01:00.0 Off |                  Off |
|  0%   39C    P8              22W / 450W |      0MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

コード例・コマンド例:実際のAI開発ワークフロー

設定が完了したら、実際のAI開発でどのように使用するかを示します。

例1: PyTorchコンテナの実行

# 公式PyTorchイメージでインタラクティブなコンテナを起動
docker run -it --rm --gpus all 
  -v $(pwd):/workspace 
  -p 8888:8888 
  pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime

# コンテナ内でPythonを起動し、GPUを確認
python3 -c "import torch; print(f'CUDA available: {torch.cuda.is_available()}'); print(f'Device count: {torch.cuda.device_count()}')"

例2: Docker ComposeでのGPU指定

docker-compose.ymlファイルでGPUリソースを指定する方法です。

version: '3.8'
services:
  jupyter:
    image: jupyter/tensorflow-notebook:latest
    runtime: nvidia # ここが重要
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    ports:
      - "8888:8888"
    volumes:
      - ./notebooks:/home/jovyan/work
    environment:
      - JUPYTER_TOKEN=mytoken

その後、docker compose upでサービスを起動します。

例3: よくあるエラーとその対処法

エラー1: docker: Error response from daemon: unknown or invalid runtime name: nvidia
解決策: ステップ3のランタイム設定が完了していないか、Dockerの再起動がされていません。sudo nvidia-ctk runtime configure --runtime=dockersudo systemctl restart dockerを再実行してください。

エラー2: Error invoking nvidia-container-cli: unknown device
解決策: 指定したGPU IDが存在しません。nvidia-smiで正しいGPU IDを確認し、--gpus '"device=0,1"'のように修正してください。

まとめ・補足情報

NVIDIA Container Toolkitを正しくインストール・設定することで、Dockerコンテナ内からシームレスにGPUを利用できるようになります。これにより、AI開発環境の再現性が飛躍的に向上し、異なるマシン間やチーム間での環境差異に悩まされることがなくなります。

重要な補足ポイント

  • Dockerのバージョン: 古いバージョンのDocker(19.03以前)では、--gpusオプションの代わりに--runtime=nvidiaオプションを使用する必要があります。可能であればDocker 20.10以上へのアップグレードを推奨します。
  • CUDAバージョンの互換性: ホストのNVIDIAドライババージョンは、コンテナ内で使用したいCUDAバージョンと互換性がある必要があります。NVIDIAの公式ドキュメントで互換性テーブルを確認してください。
  • ROOT権限: デフォルトではdockerコマンドにsudoが必要です。開発利便性のためにユーザーをdockerグループに追加(sudo usermod -aG docker $USER)することも一般的ですが、セキュリティリスクを理解した上で行ってください。
  • 永続化設定: 本記事の設定はシステム再起動後も永続的に有効です。/etc/docker/daemon.jsonが正しく設定されているか確認することで、問題の切り分けが可能です。

この設定は、個人の開発環境から本番サーバーまで、GPUを活用するあらゆるDockerベースのAIワークフローの基盤となります。一度正しく設定すれば、複雑なドライバの依存関係に煩わされることなく、クリーンでポータブルなAI開発環境を構築・共有できるようになるでしょう。

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