Docker の GPU アクセスにより、機械学習アプリケーションなどの要求の厳しいワークロードをコンテナ化できます。新しいコンテナを開始するときに GPU は自動的に使用可能になりませんが、 アクティブ化できます。
--gpus
docker run
のフラグを設定するか、
docker-compose.yml
ファイルに追加のフィールドを追加します。
この記事では、Docker Compose で GPU サポートを有効にする方法を説明します。このガイドに従うには、Docker Compose バージョン v1.28 以降が必要です。 GPU は Compose バージョン v1.18 以前ではサポートされていません。 v1.19 から v1.27 までのリリースでは、制御性が低い 従来のフィールド構造 が使用されています。
システムの準備
Docker ホストは、GPU ハードウェアを公開する前に準備する必要があります。コンテナはホストのカーネルを共有しますが、インストールされているシステム パッケージを見ることはできません。プレーンなコンテナーには、GPU と接続するデバイス ドライバーがありません。
NVIDIA の Docker Container Toolkit をインストールすることで、NVIDIA GPU のサポートをアクティブ化できます。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
&&カール -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key 追加 –
&&カール -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo aptアップデート
sudo apt install -y nvidia-docker2
sudo systemctl ドッカーを再起動する
このパッケージは、ホストの NVIDIA ドライバーへのインターフェイスを備えた Docker のコンテナー ランタイムをラップします。
/etc/docker/daemon.json
ファイルを調べると、構成されたコンテナー ランタイムが変更されたことが確認されます。 NVIDIA ツールキットは、新しいコンテナーの開始時に GPU デバイス接続の挿入を処理します。その後、通常のコンテナー ランタイムに引き渡されます。
$ cat /etc/docker/daemon.json
{
“ランタイム”: {
“nvidia”: {
“パス”: “nvidia-コンテナー ランタイム”,
“runtimeArgs”: []
}
}
}
画像の準備
Docker での GPU アクセスは、コンテナー イメージが
にも依存します。通常、イメージを
nvidia/cuda
のバリアントに基づいて作成するのが最も簡単です。この NVIDIA が提供する開始点は、CUDA サポートを使用して事前構成されています。必要なプログラミング言語をインストールし、GPU に依存するコードをコピーします。
nvidia/cuda から:11.4.0-base-ubuntu20.04
apt アップデートを実行&&\
apt-get install -y python3 python3-pip &&\
pip インストール tensorflow-gpu
tensor.py をコピーします。
ENTRYPONT [“python3”, “tensor.py”]
ホストにインストールされているものと同じ CUDA バージョンを使用する必要があります。これは
nvidia-smi
を実行することで確認できます。
$ nvidia-smi
2022年5月10日(火)19:15:00
+———————————————— ————————+
| NVIDIA-SMI 470.103.01 ドライバー バージョン: 470.103.01 CUDA バージョン: 11.4 |
|—————————–+————— —+———————-+
…
これで、GPU アタッチメントを使用してコンテナーを起動するための Docker Compose ファイルを作成できるようになりました。
Docker Compose での GPU へのアクセス
GPU は、GPU を必要とするサービス内の
deploy.resources.reservations.devices
フィールドを介して
docker-compose.yml
ファイル内で参照されます。このメカニズムにより、接続する GPU を識別できます。選択した各デバイスがコンテナーに提供されます。
これは、
nvidia/cuda
イメージを使用してコンテナーを起動する簡単な例です。コンテナーの起動時に GPU に関する情報が出力されます。
サービス:
アプリ:
画像: nvidia/cuda:11.4.0-base-ubuntu20.04
コマンド: nvidia-smi
展開する:
リソース:
予約:
デバイス:
– ドライバー: nvidia
機能: [GPU]
「
deploy.resources.reservations.devices
」フィールドは、コンテナーが使用できるデバイスを指定します。
driver
nvidia
に設定し、
gpu
機能を追加すると、GPU デバイスが定義されます。
docker-compose up
(Compose v2 の場合は
docker compose up
) を実行してコンテナーを起動します。
$ docker 構成
デフォルトのドライバーを使用してネットワーク「scratch_default」を作成する
Scratch_app_1 を作成中 … 完了
Scratch_app_1 にアタッチしています
アプリ_1 | 2022年5月10日(火)14:21:14
アプリ_1 | +———————————————— ————————+
アプリ_1 | | NVIDIA-SMI 470.103.01 ドライバー バージョン: 470.103.01 CUDA バージョン: 11.4 |
アプリ_1 | |—————————–+————— —+———————-+
コンテナーは GPU へのアクセスを正常に取得する必要があります。ドライバーと CUDA のバージョンは、ホストにインストールされているものと一致します。
複数の GPU の使用
追加の構成が提供されない限り、コンテナーはシステム内のすべての GPU にアクセスできます。 GPU デバイスのサブセットにアクセスするには 2 つの異なる方法があります。
固定数のデバイスへのアクセス
count
フィールドは、指定された数のデバイスを予約します。この例では、2 つの GPU を備えたシステムが、そのうちの 1 つをコンテナーに提供します。どちらを選択するかは任意です。
サービス:
アプリ:
画像: nvidia/cuda:11.4.0-base-ubuntu20.04
コマンド: nvidia-smi
展開する:
リソース:
予約:
デバイス:
– ドライバー: nvidia
カウント: 1
機能: [GPU]
特定のデバイスへのアクセス
device_ids
フィールドを使用して、システム内の個々のデバイスを識別できます。これは、コンテナーに提供する、0 から始まるインデックスのデバイス ID の配列を受け入れます。これらの ID は
nvidia-smi
で GPU をリストすることで見つけることができます。
$ nvidia-smi --list-gpus
GPU 0: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-5ba4538b-234f-2c18-6a7a-458d0a7fb348)
GPU 1: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-d5ce9af3-710c-4222-95f8-271db933d438)
GPU 2: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-50d4eb4f-7b08-4f8f-8d20-27d797fb7f19)
GPU 3: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-bed2d40a-c6e7-4547-8d7d-a1576c5247b2)
リストの最後の 2 つのデバイスに確実にアクセスするには、サービス構成にデバイス ID を含めます。
サービス:
アプリ:
画像: nvidia/cuda:11.4.0-base-ubuntu20.04
コマンド: nvidia-smi
展開する:
リソース:
予約:
デバイス:
– ドライバー: nvidia
デバイスID: [“2”, “3”]
機能: [GPU]
各サービス定義で
count
または
device_ids
使用できます。両方を組み合わせようとしたり、無効なデバイス ID を指定したり、システム内の GPU の数より大きい
count
の値を使用したりすると
docker-compose up
実行するときにエラーが発生します。
まとめ
最新の Docker Compose リリースは、
deploy.resources
デバイス予約機能を介した GPU アクセスをサポートしています。ホスト環境を準備し、GPU 対応のコンテナー イメージを使用するのは依然としてお客様の責任です。それが完了したら、
docker run
使用するたびに
--gpus all
フラグを忘れずに含めるよりも
docker-compose up -d
実行する方が簡単です。
docker-compose.yml
ファイルをソース管理にコミットすると、誰もが自動 GPU アクセスを取得できます。イメージで使用されるリリースはホストにインストールされているリリースと一致する必要があるため、NVIDIA ドライバーの一貫したバージョンを標準化するようにしてください。将来的には、Docker の GPU サポートは Intel および AMD デバイスでも動作する可能性がありますが、現在使用しようとするとエラー
が発生します
。 NVIDIA は、
で現在サポートされている唯一の GPU ベンダーです。





