GPU搭載マシンでの機械学習実験や推論APIをDockerコンテナに移行する場面は増えている。しかし、Dockerfileに正しいベースイメージを指定しても、ホスト側の前提設定が足りなければGPUは見えない。逆に前提を整えれば、CUDAのバージョン管理はDockerfileだけで完結する。
この記事では、Ubuntu 22.04 LTS環境を想定して、NVIDIAのGPUをDockerfileで活用するCUDA対応コンテナの構築手順を解説する。nvidia/cudaベースイメージの種類と選び方、nvidia-container-toolkitの設定、PyTorch開発環境と本番推論向けマルチステージビルドのDockerfileまで、実際に動かせる設計を示す。
この記事のポイント
・nvidia/cudaイメージはbase/runtime/develの3種類
・ホストのnvidia-container-toolkit設定が先決
・docker run --gpus all でGPUをコンテナに渡す
・本番はruntimeイメージ+マルチステージビルドで
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
DockerコンテナでNVIDIA GPUを使う仕組みを理解する
Dockerコンテナは通常、ホストのGPUから隔離されている。NVIDIAのGPUをコンテナ内で使うには、NVIDIA Container Toolkit(nvidia-container-toolkit)を経由してホストのGPUドライバとコンテナをつなぐ仕組みが必要だ。構成を整理すると次のようになる。
・ホスト側:NVIDIAドライバ(例:545.x)をインストール済み
・nvidia-container-toolkit:DockerとNVIDIAドライバの橋渡し役。これがないと「--gpus」オプションが機能しない
・Dockerfile:nvidia/cudaベースイメージを使い、CUDA対応のライブラリをその上に積む
コンテナ内のCUDAバージョンとホストのドライババージョンは完全に一致させる必要はない。ホストのドライバが対応する最大CUDAバージョン以下であれば、コンテナ内で異なるCUDAマイナーバージョンを使える。ドライバのバージョンと対応するCUDA上限は、
nvidia-smiの出力右上に表示される「CUDA Version」で確認できる。前提:nvidia-container-toolkitのインストールと設定
Dockerfileを書く前に、ホストOS側でnvidia-container-toolkitを設定する必要がある。1. パッケージリポジトリの追加とインストール
Ubuntu 22.04でのインストール手順を示す。# 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/stable/deb/nvidia-container-toolkit.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
2. DockerデーモンへNVIDIA runtimeを適用する
インストール後、DockerデーモンにNVIDIA Container Runtimeを認識させる。# /etc/docker/daemon.json に設定を書き込む sudo nvidia-ctk runtime configure --runtime=docker # Dockerデーモンを再起動 sudo systemctl restart docker # 設定確認(「nvidia」が表示されれば準備完了) docker info | grep -i runtime # 出力例(環境により異なります) # Runtimes: io.containerd.runc.v2 nvidia runc
nvidia/cudaベースイメージの種類と選び方
nvidia/cudaイメージには3つの種類がある。用途に合わせて選ぶことがDockerfile設計の出発点だ。| タグ | 含まれるもの | 用途 |
|---|---|---|
base |
CUDAランタイム(libcuda)のみ | 最小構成。自分でライブラリを積む場合 |
runtime |
base + cuBLAS + cuDNN | 学習済みモデルの推論。本番環境に最適 |
devel |
runtime + nvcc + ヘッダファイル | CUDAコードのコンパイル。開発環境向け |
nvidia/cuda:<CUDAバージョン>-<タイプ>-<OS> だ。例:
nvidia/cuda:12.3.2-devel-ubuntu22.04PyTorchなどコンパイル済みのWheelをpipインストールするだけなら
runtimeで十分だ。develは独自CUDAカーネルを書く場合や、ソースからビルドするライブラリを使う場合に選ぶ。サイズはdevelが最も大きく、baseが最も小さい。開発環境向けDockerfileの設計
PyTorchを使う機械学習の開発環境を例に、Dockerfileの構成例を示す。1. Dockerfileの全体構成例(PyTorch開発環境)
# ベースイメージ:CUDA 12.3 + devel(nvccが必要な場合はdevel、不要ならruntimeに変更可) FROM nvidia/cuda:12.3.2-devel-ubuntu22.04 # タイムゾーン設定の対話を無効化 ENV DEBIAN_FRONTEND=noninteractive # 基本パッケージのインストール RUN apt-get update && apt-get install -y \ python3 python3-pip git \ && rm -rf /var/lib/apt/lists/* # PyTorchのインストール(CUDA 12.1対応ビルドを使用) RUN pip3 install --no-cache-dir \ torch torchvision torchaudio \ --index-url https://download.pytorch.org/whl/cu121 WORKDIR /workspace # 依存ライブラリを先にコピー(キャッシュ最適化) COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt # ソースコードをコピー COPY . . CMD ["python3", "train.py"]
2. CUDAバージョンとPyTorchビルドの対応
PyTorchのインストールURLに含まれるcu121 は「CUDA 12.1対応ビルド」を意味する。ベースイメージのCUDAバージョンと完全に一致させる必要はなく、ホストドライバが対応している範囲内であれば動作する。COPY requirements.txt . の行をソースコードのコピーより前に置くのがポイントだ。ソースコードを変更するたびに依存ライブラリのインストールが走るのを防ぎ、docker build のキャッシュを有効活用できる。コンテナ技術を体系的に学びたい方は、Docker実践学習ガイドも参照してほしい。
本番推論向けマルチステージDockerfileの設計
開発環境向けのdevelイメージはサイズが大きい。本番推論にはruntimeイメージを使ったマルチステージビルドが有効だ。develとruntimeではイメージサイズが数百MB異なり、デプロイ時間の短縮とセキュリティリスクの低減につながる。# Stage 1: develイメージで依存関係をビルド FROM nvidia/cuda:12.3.2-devel-ubuntu22.04 AS builder ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y \ python3 python3-pip \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt # Stage 2: runtimeイメージで本番用の軽量イメージを構成 FROM nvidia/cuda:12.3.2-runtime-ubuntu22.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y \ python3 \ && rm -rf /var/lib/apt/lists/* # builderステージからPythonパッケージをコピー COPY --from=builder /usr/local/lib/python3.10 /usr/local/lib/python3.10 COPY --from=builder /usr/local/bin/pip3 /usr/local/bin/pip3 COPY . /app WORKDIR /app CMD ["python3", "inference.py"]
docker buildと--gpusオプションでコンテナを起動する
1. イメージのビルド
# Dockerfileがあるディレクトリで実行 docker build -t my-cuda-app:latest . # 出力例(環境により異なります) # [+] Building 185.4s (10/10) FINISHED # => [internal] load build definition from Dockerfile # => [1/5] FROM nvidia/cuda:12.3.2-devel-ubuntu22.04 # => [2/5] RUN apt-get update && apt-get install -y ... # => [3/5] RUN pip3 install ... # => exporting to image
2. --gpusオプションを指定してコンテナを起動する
--gpus allを付けないと、Dockerfileでnvidia/cudaイメージを使っていてもGPUはコンテナに渡されない。# 全GPUをコンテナに渡す docker run --gpus all --rm -it my-cuda-app:latest nvidia-smi # GPU 0番のみを渡す場合 docker run --gpus '"device=0"' --rm -it my-cuda-app:latest nvidia-smi # 複数GPU(0番と1番)を指定する場合 docker run --gpus '"device=0,1"' --rm -it my-cuda-app:latest nvidia-smi
3. CUDAの動作確認
# PyTorchでGPU認識を確認 docker run --gpus all --rm my-cuda-app:latest \ python3 -c "import torch; print('GPU:', torch.cuda.is_available()); print('デバイス名:', torch.cuda.get_device_name(0))" # 出力例(環境により異なります) # GPU: True # デバイス名: NVIDIA GeForce RTX 3090 # nvidia-smiでドライバとCUDAのバージョンを確認 docker run --gpus all --rm my-cuda-app:latest nvidia-smi # 出力例(環境により異なります) # +-----------------------------------------------------------------------------+ # | NVIDIA-SMI 545.23.08 Driver Version: 545.23.08 CUDA Version: 12.3 | # |-------------------------------+----------------------+----------------------+ # | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | # | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | # |===============================+======================+======================| # | 0 NVIDIA GeForce ... Off | 00000000:01:00.0 Off | N/A |
トラブルシュート|よくあるエラーと対処法
「could not select device driver "" with capabilities: [[gpu]]」nvidia-container-toolkitがDockerデーモンに設定されていない。
sudo nvidia-ctk runtime configure --runtime=dockerを実行し、sudo systemctl restart dockerで再起動する。docker info | grep -i runtimeで「nvidia」が表示されるか確認する。「CUDA error: no kernel image is available for execution on the device」
ホストGPUのCompute Capabilityが、コンテナ内のライブラリ(例:PyTorch)が要求するCompute Capabilityを下回っている。古いGPU(GTX 10xx系など)では、対応するPyTorchのバージョンを下げるか、CUDAのマイナーバージョンを変更する。
「Failed to initialize NVML: Driver/library version mismatch」
ホストのNVIDIAドライバとカーネルモジュールのバージョンが一致していない。ドライバの再インストール後、
sudo rebootで再起動して解消する。「OCI runtime create failed: container_linux.go:...」
Dockerfileの書き方の問題ではなく、nvidia-container-runtimeの設定問題であることが多い。
sudo nvidia-ctk runtime configure --runtime=dockerを再実行してからDockerデーモンを再起動する。まとめ
NVIDIAのGPUをDockerfileで活用するCUDA環境構築の要点をまとめる。| やること | コマンド・設定 |
|---|---|
| nvidia-container-toolkitをインストール | sudo apt-get install -y nvidia-container-toolkit |
| DockerデーモンにNVIDIA runtimeを適用 | sudo nvidia-ctk runtime configure --runtime=docker |
| 開発環境向けベースイメージ | FROM nvidia/cuda:12.3.2-devel-ubuntu22.04 |
| 本番向けベースイメージ | FROM nvidia/cuda:12.3.2-runtime-ubuntu22.04 |
| GPUをコンテナに渡す | docker run --gpus all ... |
| GPU認識の確認 | docker run --gpus all --rm イメージ名 nvidia-smi |
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、NVIDIAのGPUをDockerfileで動かすCUDA環境設計も含め、コンテナ技術を体系的に学べる学習リソースを用意している。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:MinIOのDockerfile構成とS3互換ストレージ運用|バケット初期化と認証設定の手順
- この記事の属するカテゴリ:Dockerへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます