問題の概要:Dockerコンテナ内でGPUが認識されない
AI開発、特に深層学習モデルのトレーニングや推論を行う際、Dockerコンテナ内からホストマシンのNVIDIA GPUを利用したい場面は多々あります。しかし、標準のDocker環境では、コンテナ内からGPUを認識・利用することができません。以下のようなエラーメッセージに遭遇したことはないでしょうか。
$ docker run --rm nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
あるいは、PyTorchやTensorFlowをコンテナ内で実行した際に、GPUが利用できないという警告やエラーが発生します。
import torch
print(torch.cuda.is_available()) # False と出力され、期待したTrueにならない
この問題は、DockerコンテナとホストのGPUリソースを安全に連携させるための専用ツール「NVIDIA Container Toolkit」が正しくインストール・設定されていないために発生します。本記事では、この問題の原因を解説し、ステップバイステップで確実に解決する方法を紹介します。
原因の解説:なぜDockerはデフォルトでGPUを認識しないのか
Dockerの標準的なコンテナランタイム(通常はrunc)は、セキュリティと隔離性を優先する設計となっています。そのため、GPUのような特権的なハードウェアリソースへの直接アクセスは、デフォルトでは許可されていません。NVIDIA GPUを利用するには、以下の要素が必要です。
- NVIDIAドライバ: ホストOS上でGPUを制御するための基本ソフトウェア。
- NVIDIA Container Toolkit: Dockerなどのコンテナランタイムと連携し、GPUリソースを安全にコンテナ内に「パススルー」するためのミドルウェア。旧称は「nvidia-docker2」です。
- コンテナランタイムの設定: Dockerの設定ファイルを変更し、NVIDIA Container Toolkitをデフォルトのランタイムとして使用するよう指示する必要があります。
これらのいずれかが欠けている、または設定が不適切であると、冒頭で示したようなエラーが発生します。特に、ホストにNVIDIAドライバは入っているのに、Toolkitのインストールを忘れているケースや、インストール後にDockerデーモンの再起動を忘れているケースが非常に多いです。
解決方法:NVIDIA Container Toolkitのインストールと設定
ここからは、Ubuntu 22.04 LTSを例に、具体的な解決手順を説明します。他のディストリビューションでも、パッケージマネージャーやリポジトリの追加方法が異なるだけで、基本的な流れは同じです。
ステップ1: 前提条件の確認
まず、ホストマシンにNVIDIA GPUドライバとDocker Engineが正しくインストールされていることを確認します。
# NVIDIAドライバの確認
nvidia-smi
# Dockerの確認
docker --version
sudo systemctl status docker
nvidia-smiコマンドがエラーなく実行され、GPU情報が表示されることを確認してください。表示されない場合は、先にNVIDIA公式サイトやディストリビューションのパッケージマネージャーを使用してドライバをインストールする必要があります。
ステップ2: NVIDIA Container Toolkitのインストール
NVIDIAのリポジトリを追加し、必要なパッケージをインストールします。
# パッケージリストの更新と依存関係のインストール
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
# リポジトリを追加したので、再度パッケージリストを更新
sudo apt-get update
# NVIDIA Container Toolkitをインストール
sudo apt-get install -y nvidia-container-toolkit
ステップ3: Dockerランタイムの設定
Toolkitをインストールしただけでは不十分です。DockerデーモンがNVIDIAランタイムを使用するように設定する必要があります。
# nvidia-container-toolkitをDockerのランタイムとして設定
sudo nvidia-ctk runtime configure --runtime=docker
# 上記コマンドは、/etc/docker/daemon.json ファイルを自動的に編集します。
# ファイルの内容を確認してみましょう。
sudo cat /etc/docker/daemon.json
正常に設定されていれば、daemon.jsonファイルに"runtimes"セクションが追加され、"nvidia"ランタイムが定義されているはずです。
ステップ4: Dockerデーモンの再起動と動作確認
設定を反映させるために、Dockerデーモンを再起動します。
# Dockerデーモンの再起動
sudo systemctl restart docker
# 動作確認:最もシンプルなテスト
docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
このコマンドが成功し、ホストでnvidia-smiを実行した時と同様のGPU情報がコンテナ内から出力されれば、設定は完了です。
ステップ5: (オプション)デフォルトランタイムの設定と`–gpus`フラグ
毎回--runtime=nvidiaと指定するのは面倒です。daemon.jsonを編集してデフォルトのランタイムを設定することも可能ですが、現在は--gpusフラグを使用する方法が推奨されています。--gpusフラグを使うと、ランタイムの指定を省略できます。
# --gpus フラグを使用した実行例(推奨)
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
# 特定のGPUのみを割り当てる例(GPU IDが0と1のデバイスを指定)
docker run --rm --gpus '"device=0,1"' nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
コード例・コマンド例:実践的なAI開発環境の構築
実際のAI開発では、CUDAツールキットやcuDNNがインストールされたベースイメージを使い、さらに必要なPythonパッケージをインストールすることが一般的です。以下は、PyTorch環境を構築するDockerfileの例と、そのビルド・実行コマンドです。
# Dockerfileの例 (Dockerfile)
FROM nvidia/cuda:12.1.0-cudnn8-runtime-ubuntu22.04
# システムパッケージの更新とPythonのインストール
RUN apt-get update && apt-get install -y
python3-pip
python3-dev
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリの設定
WORKDIR /workspace
# 必要なPythonパッケージのインストール
COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt
# アプリケーションコードのコピー
COPY . .
# コンテナ起動時のデフォルトコマンド
CMD ["python3"]
# requirements.txtの例
torch==2.1.0
torchvision==0.16.0
torchaudio==2.1.0
--index-url https://download.pytorch.org/whl/cu121
numpy
pandas
# イメージのビルドと実行
docker build -t my-pytorch-app .
docker run -it --rm --gpus all my-pytorch-app python3 -c "import torch; print(f'CUDA available: {torch.cuda.is_available()}'); print(f'GPU device count: {torch.cuda.device_count()}')"
このコマンドを実行し、CUDA available: Trueと表示されれば、コンテナ内のPyTorchがGPUを正しく認識している証拠です。
まとめ・補足情報
NVIDIA Container Toolkitは、Dockerコンテナ内でGPUを利用するための必須の橋渡し役です。インストール手順は、1) リポジトリの追加、2) パッケージのインストール、3) Dockerランタイムの設定、4) Dockerデーモンの再起動、という4ステップで完了します。最も多い失敗原因は「ステップ4の再起動忘れ」です。設定を変更したら必ずsudo systemctl restart dockerを実行しましょう。
トラブルシューティングのヒント:
- 「Error response from daemon: Unknown runtime specified nvidia」:
/etc/docker/daemon.jsonの設定が間違っているか、反映されていません。sudo nvidia-ctk runtime configure --runtime=dockerを再実行し、Dockerを再起動してください。 - 「docker: Error response from daemon: failed to create shim task: … nvidia-container-cli: initialization error: driver error: failed to process request」: ホストのNVIDIAドライバに問題がある可能性があります。ホストで
nvidia-smiが正常に動作するか、ドライバのバージョンが古すぎないか確認してください。 - 複数GPU環境で特定のGPUのみを割り当てたい場合は、
--gpus '"device=0,2"'のように指定します。シングルクォートとダブルクォートのネストに注意が必要です。
本ガイドに沿って設定を行うことで、再現性が高く、ホスト環境を汚さない、理想的なAI開発環境をDocker上に構築できるはずです。GPUリソースをコンテナで効率的に活用し、生産性の高い開発を進めましょう。