Compose で GPU アクセスの有効化

Docker ホストに GPU デバイスが入っており、かつ、 Docker デーモンで適切な設定がある場合、 Compose サービスで GPU デバイス予約を定義できます。このために、 必要条件 のインストールがまだであれば、終えておく必要があります。

以下のセクションにある例では、 サービス用コンテナが GPU デバイスにアクセスするため、Docker Compose での設定方法に焦点を絞ります。 docker-composedocker compose 、どちらのコマンドも使えます。

Compose v2.3 形式から サービス runtime プロパティを使う(古い方法)

Docker Compose v1.27.0 以上では、2.x と 3.x バージョンの全てのプロパティを統合した Compose Specification スキームを使うように切り替わりました。これにより、サービス用コンテナが GPU にアクセスできるようにするための、 runtime サービス プロパティを再び使えるようになります。しかし、こちらを使うと、 GPU デバイスにある特定のプロパティを制御できません。

services:
  test:
    image: nvidia/cuda:10.2-base
    command: nvidia-smi
    runtime: nvidia

サービス用コンテナで GPU アクセスの有効化

Docker Compose v1.28.0 以上では、Compose Specification の device 構造の定義を使い、 GPU 指定の定義が可能です。これにより、以下のデバイス プロパティに任意の値を指定できるため、 GPU 指定を細かく制御できるようになります。

  • capabilities - 文字列のリストとして値を指定(例: capabilities: [gpu] )。このフィールドを Compose ファイル内で指定する必要がある。そうしなければ、サービスのデプロイ時、エラーが返る。

  • count - 予約すべき GPU デバイス(ホストが保持している GPU 数)を整数値として指定するか all 値で指定。

  • device_ids - ホスト上で予約する GPU デバイスの ID を表す文字列を値として指定。デバイス ID はホスト上で nvidia-smi の出力で確認できる。

  • driver - 文字列の値として指定(例: driver: 'nvidia'

  • options - ドライバ固有のオプションを表す キーバリューの組み合わせ(key-value pairs)

注釈

capabilities フィールドの指定が必須です。そうしなければ、サービスのデプロイ時にエラーが返ります。 countdevice_ids は互いに矛盾します。フィールドでは、一度に一方しか指定できません。

各プロパティに関する情報は、 Compose Specificationdeploy セクションをご覧ください。

この Compose ファイル例は、1 GPU デバイスにアクセスするサービスを実行:

services:
  test:
    image: nvidia/cuda:10.2-base
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

Docker Compose で実行:

$ docker-compose up
Creating network "gpu_default" with the default driver
Creating gpu_test_1 ... done
Attaching to gpu_test_1
test_1  | +-----------------------------------------------------------------------------+
test_1  | | NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.1     |
test_1  | |-------------------------------+----------------------+----------------------+
test_1  | | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
test_1  | | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
test_1  | |                               |                      |               MIG M. |
test_1  | |===============================+======================+======================|
test_1  | |   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
test_1  | | N/A   23C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
test_1  | |                               |                      |                  N/A |
test_1  | +-------------------------------+----------------------+----------------------+
test_1  |
test_1  | +-----------------------------------------------------------------------------+
test_1  | | Processes:                                                                  |
test_1  | |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
test_1  | |        ID   ID                                                   Usage      |
test_1  | |=============================================================================|
test_1  | |  No running processes found                                                 |
test_1  | +-----------------------------------------------------------------------------+
gpu_test_1 exited with code 0

countdevice_ids が設定されていなければ、デフォルトではホスト上で利用可能な GPU すべてを使います。

services:
  test:
    image: tensorflow/tensorflow:latest-gpu
    command: python -c "import tensorflow as tf;tf.test.gpu_device_name()"
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
$ docker-compose up
Creating network "gpu_default" with the default driver
Creating gpu_test_1 ... done
Attaching to gpu_test_1
test_1  | I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1

マシン上に複数の GPU を取り付けている場合、 device_ids フィールドによって対象となる GPU デバイスの指定ができ、 count によってサービス用コンテナに割り当てる GPU デバイス数の上限も指定できます。 count がホスト上で利用可能な GPU 数よりも超えた場合、デプロイはエラーが出て失敗します。

$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| 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  Tesla T4            On   | 00000000:00:1B.0 Off |                    0 |
| N/A   72C    P8    12W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla T4            On   | 00000000:00:1C.0 Off |                    0 |
| N/A   67C    P8    11W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  Tesla T4            On   | 00000000:00:1D.0 Off |                    0 |
| N/A   74C    P8    12W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   3  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   62C    P8    11W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

GPU-0 と GPU-3 デバイスのみアクセスできるようにする:

services:
  test:
    image: tensorflow/tensorflow:latest-gpu
    command: python -c "import tensorflow as tf;tf.test.gpu_device_name()"
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            device_ids: ['0', '3']
            capabilities: [gpu]
$ docker-compose up
...
Created TensorFlow device (/device:GPU:0 with 13970 MB memory -> physical GPU (device: 0, name: Tesla T4, pci bus id: 0000:00:1b.0, compute capability: 7.5)
...
Created TensorFlow device (/device:GPU:1 with 13970 MB memory) -> physical GPU (device: 1, name: Tesla T4, pci bus id: 0000:00:1e.0, compute capability: 7.5)
...
gpu_test_1 exited with code 0

参考

Enabling GPU access with Compose | Docker Documentation

https://docs.docker.com/compose/gpu-support/