1. 概要
Ubuntu OS 上の GPU の存在は間違いなく、nvidia-smi が実行できるにもかかわらず、 Docker コンテナからは GPU が認識できない時ってありますよね。
そんな場合の対策記事になります。
2. 動作環境
私の実行環境は以下の通りでした。
| items | version など | 確認コマンド |
|---|---|---|
| OS | Ubuntu 22.04.3 LTS | lsb_release -a |
| docker | Docker version 29.4.1, build 055a478 | docker --version |
| GPU | NVIDIA Corporation Device 2331 (rev a1) | lspci | grep -i nvidia |
| nvcc | なし | nvcc -v |
3. 問題発生状況
3-1. Docker コンテナ上で発生したエラー
大幅に省略しているが、 GPU を Docker コンテナに認識させるための記述は以下のようにしていた。
# docker-compose.yml の一部
services:
app:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
この状態で docker compose up や run を実行したときに、以下のようなエラーが発生する
$ docker compose run app bash
Container docker-bayes3d-run-9956c308fca9 Creating
Container docker-bayes3d-run-9956c308fca9 Created
Error response from daemon: could not select device driver "nvidia" with capabilities: [[gpu]]
さて、この原因を調べよう。
3-2. ホストマシン上での動作確認結果
以下の通り、ホストマシン上では nvidia-smi はうまく動作する。
$ nvidia-smi
Wed Apr 29 19:25:33 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.133.20 Driver Version: 570.133.20 CUDA Version: 12.8 |
|-----------------------------------------+------------------------+----------------------+
| 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 H100-20C On | 00000000:07:00.0 Off | 0 |
| N/A N/A P0 N/A / N/A | 0MiB / 20480MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
このような場合には NVIDIA Container Toolkit をインストールすれば解決することが多い。
4. 対処法
4-1. 手順
NVIDIA 公式ドキュメントの、以下の方法に従おう。
Docker は正しく install できていると思うので、その場合は、最初の Setting up Docker はスキップして問題ない(私はスキップした)。
その場合は、ドキュメントの Setting up NVIDIA Container Toolkit から開始できる。
記載通りに以下の手順を踏めば、問題が解消しているはずである。
- Setup the package repository and the GPG key
- Install the nvidia-container-toolkit package
- Configure the Docker daemon
- Restart the Docker daemon
- 動作テスト
(具体的な手順は将来変わりうるので、コマンド詳細はリンク先のドキュメントに譲る)
4-2. 動作テスト
簡単な動作確認方法としては、 docker コンテナに run か exec で入って、その状態で nvidia-smi を実行すれば良い。
対処に成功していれば、 docker コンテナ内であっても nvidia-smi の結果が以下のような感じで返ってくる。
$ nvidia-smi
Wed Apr 29 11:08:40 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.133.20 Driver Version: 570.133.20 CUDA Version: 12.8 |
|-----------------------------------------+------------------------+----------------------+
| 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 H100-20C On | 00000000:07:00.0 Off | 0 |
| N/A N/A P0 N/A / N/A | 0MiB / 20480MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+