技術ノート プログラミング GPU アクセスを使用して Docker Compose コンテナーを実行する方法

GPU アクセスを使用して Docker Compose コンテナーを実行する方法

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”: []

}

}

}

GPU アクセスを使用して Docker Compose コンテナーを実行する方法

画像の準備

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 ファイルを作成できるようになりました。

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 アクセスを使用して Docker Compose コンテナーを実行する方法

複数の GPU の使用

追加の構成が提供されない限り、コンテナーはシステム内のすべての GPU にアクセスできます。 GPU デバイスのサブセットにアクセスするには 2 つの異なる方法があります。

GPU アクセスを使用して Docker Compose コンテナーを実行する方法

固定数のデバイスへのアクセス

count フィールドは、指定された数のデバイスを予約します。この例では、2 つの GPU を備えたシステムが、そのうちの 1 つをコンテナーに提供します。どちらを選択するかは任意です。

サービス:

アプリ:

画像: nvidia/cuda:11.4.0-base-ubuntu20.04

コマンド: nvidia-smi

展開する:

リソース:

予約:

デバイス:

– ドライバー: nvidia

カウント: 1

機能: [GPU]

GPU アクセスを使用して Docker Compose コンテナーを実行する方法

特定のデバイスへのアクセス

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 実行するときにエラーが発生します。

GPU アクセスを使用して Docker Compose コンテナーを実行する方法

まとめ

最新の 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 ベンダーです。

「 GPU アクセスを使用して Docker Compose コンテナーを実行する方法」に関するベスト動画選定!

Docker Composeを使ったApacheコンテナの作成
Docker Composeを使ったUbuntuコンテナの作成