NVIDIAのGPUをDockerfileで活用する|CUDA環境コンテナ構築の実践手順

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Docker > NVIDIAのGPUをDockerfileで活用する|CUDA環境コンテナ構築の実践手順
「DockerでNVIDIA GPUを使いたいのに、コンテナからGPUが見えない」「CUDAのバージョンが合わずにエラーが出る」という問題で詰まっていないか。
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イメージ+マルチステージビルドで


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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.04

PyTorchなどコンパイル済みの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"]

本番に不要なnvccやヘッダファイルを最終ステージから切り離すことで、イメージの軽量化と攻撃面の縮小を同時に達成できる。

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環境設計も含め、コンテナ技術を体系的に学べる学習リソースを用意している。

>> Docker実践学習ガイドの詳細を見る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。