GPU リソースを使用するコンテナー インスタンスをデプロイする

特定のコンピューティング集中型ワークロードを Azure Container Instances で実行するには、GPU リソースを持つコンテナー グループをデプロイします。 グループのコンテナー インスタンスは、CUDA やディープ ラーニング アプリケーションなどのコンテナー ワークロードを実行しながら、1 つまたは複数の NVIDIA Tesla GPU にアクセスできます。

この記事では、YAML ファイルまたは Resource Manager テンプレートを使用して、コンテナー グループをデプロイするときに GPU リソースを追加する方法について説明します。 また、Azure portal を使用してコンテナー インスタンスをデプロイするときに GPU リソースも指定できます。

重要

K80 GPU SKU および P100 GPU SKU は 2023 年 8 月 31 日で提供を終了します。 これは、基盤として使われている VM (NC シリーズNCv2 シリーズ) の提供停止によるものです。V100 SKU は使用可能ですが、代替として Azure Kubernetes Service を使用することをお勧めします。 GPU リソースは完全にはサポートされていないため、運用ワークロードには使用しないでください。 今すぐ AKS に移行するには、次のリソースを使用します: AKS へ移行する方法

重要

この機能は現在プレビュー段階であり、一定の制限事項が適用されます。 プレビュー版は、追加使用条件に同意することを条件に使用できます。 この機能の一部の側面は、一般公開 (GA) 前に変更される可能性があります。

前提条件

注意

現在はいくつかの制限があるため、すべての制限引き上げの要求が承認されるとは限りません。

  • この SKU を運用コンテナーのデプロイに使用する場合は、専用の上限を上げるための Azure サポート リクエストを作成してください。

プレビューの制限事項

プレビューでは、コンテナー グループで GPU リソースを使用する場合に、次の制限が適用されます。

利用可能なリージョン

リージョン OS 使用可能な GPU SKU
米国東部、西ヨーロッパ、米国西部 2 Linux K80、P100、V100
東南アジア Linux V100
インド中部 Linux V100

サポート対象リージョンは今後追加される予定です。

サポートされている OS の種類:Linux のみ

追加の制限事項:GPU リソースは、コンテナー グループを仮想ネットワークにデプロイするときには使用できません。

GPU リソースについて

カウントと SKU

コンテナー インスタンスで GPU を使用するには、次の情報を使って GPU リソースを指定します。

  • カウント - GPU の数:12、または 4

  • SKU - GPU SKU: V100。 各 SKU は、次のいずれかの Azure GPU 対応 VM ファミリの NVIDIA Tesla GPU にマップされます。

    SKU VM ファミリ
    V100 NCv3

SKU ごとの最大リソース

OS GPU SKU GPU 数 Max CPU (最大 CPU) 最大メモリ (GB) ストレージ (GB)
Linux K80 1 6 56 50
Linux K80 2 12 112 50
Linux K80 4 24 224 50
Linux P100 1 6 112 50
Linux P100 2 12 224 50
Linux P100 4 24 448 50
Linux V100 1 6 112 50
Linux V100 2 12 224 50
Linux V100 4 24 448 50

GPU リソースをデプロイするときに、ワークロードに適した CPU とメモリ リソースを設定します。上記の表は最大値を表しています。 これらの値は、現在、GPU リソースのないコンテナー グループで使用可能な CPU とメモリ リソースよりも大きくなっています。

重要

GPU リソースの既定のサブスクリプション制限 (クォータ) は、SKU によって異なります。 V100 SKU の既定の CPU 制限は、最初は 0 に設定されています。 使用可能なリージョンでの引き上げを要求するには、Azure サポート リクエストを送信してください。

注意事項

  • デプロイ時- GPU リソースを含むコンテナー グループの作成には、最大で 8 - 10 分かかります。 これは、Azure で GPU VM をプロビジョニングして構成するための追加時間によるものです。

  • 価格- GPU リソースのないコンテナー グループと同様に、Azure では GPU リソースがあるコンテナー グループの期間にわたって使用されたリソースに対して請求されます。 期間は、最初のコンテナー イメージのプルが開始された時点から、コンテナー グループが終了する時点までが計算されます。 コンテナー グループをデプロイする時間は含まれません。

    価格の詳細を参照してください。

  • CUDA ドライバー - GPU リソースがあるコンテナー インスタンスは、NVIDIA CUDA ドライバーとコンテナーのランタイムを使用して事前にプロビジョニングされているため、CUDA ワークロード用に開発されたコンテナー イメージを使用できます。

    この段階では、CUDA 11 までサポートしています。 たとえば、次の基本イメージを Dockerfile で使用できます。

    Note

    Docker Hub からのパブリック コンテナー イメージを使用するときの信頼性を向上させるには、プライベート Azure コンテナー レジストリにイメージをインポートして管理し、プライベートに管理された基本イメージを使用するように Dockerfile を更新します。 パブリック イメージの操作に関する詳細を参照してください

YAML の例

GPU リソースを追加するには、YAML ファイルを使用してコンテナー グループをデプロイする方法があります。 次の YAML を gpu-deploy-aci.yaml という名前の新しいファイルにコピーしてから、ファイルを保存します。 この YAML により、V100 GPU を持つコンテナー インスタンスを指定する gpucontainergroup という名前のコンテナー グループが作成されます。 このインスタンスでは、CUDA ベクトル加法アプリケーションのサンプルが実行されます。 ワークロードを実行するには、リソース要求だけで十分です。

Note

次の例では、パブリック コンテナー イメージを使用します。 信頼性を向上させるために、プライベート Azure Container Registry 内のイメージをインポートして管理し、プライベートのマネージド基本イメージを使用するように YAML を更新します。 パブリック イメージの操作に関する詳細を参照してください

additional_properties: {}
apiVersion: '2021-09-01'
name: gpucontainergroup
properties:
  containers:
  - name: gpucontainer
    properties:
      image: k8s-gcrio.azureedge.net/cuda-vector-add:v0.1
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
          gpu:
            count: 1
            sku: V100
  osType: Linux
  restartPolicy: OnFailure

az container create コマンドを使って、--file パラメーターに YAML ファイル名を指定して、コンテナー グループをデプロイします。 リソース グループの名前と、GPU リソースをサポートするコンテナー グループの場所 (eastus など) を指定する必要があります。

az container create --resource-group myResourceGroup --file gpu-deploy-aci.yaml --location eastus

デプロイが完了するまで、数分間かかります。 その後、コンテナーが起動して CUDA ベクトル加法演算が実行されます。 az container logs コマンドを実行して、ログの出力を表示します。

az container logs --resource-group myResourceGroup --name gpucontainergroup --container-name gpucontainer

出力:

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

Resource Manager テンプレートの例

GPU リソースでコンテナー グループをデプロイするには、Resource Manager テンプレートを使用する方法もあります。 まず、gpudeploy.json という名前のファイルを作成し、次の JSON をそのファイルにコピーします。 この例では、MNIST データセットに対して TensorFlow トレーニング ジョブを実行する V100 GPU を搭載したコンテナー インスタンスをデプロイします。 ワークロードを実行するには、リソース要求だけで十分です。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "containerGroupName": {
        "type": "string",
        "defaultValue": "gpucontainergrouprm",
        "metadata": {
          "description": "Container Group name."
        }
      }
    },
    "variables": {
      "containername": "gpucontainer",
      "containerimage": "mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu"
    },
    "resources": [
      {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2021-09-01",
        "location": "[resourceGroup().location]",
        "properties": {
            "containers": [
            {
              "name": "[variables('containername')]",
              "properties": {
                "image": "[variables('containerimage')]",
                "resources": {
                  "requests": {
                    "cpu": 4.0,
                    "memoryInGb": 12.0,
                    "gpu": {
                        "count": 1,
                        "sku": "V100"
                  }
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "restartPolicy": "OnFailure"
        }
      }
    ]
}

az deployment group create コマンドを使用してテンプレートをデプロイします。 GPU リソースをサポートしているリージョン (eastus など) で作成されたリソース グループの名前を指定する必要があります。

az deployment group create --resource-group myResourceGroup --template-file gpudeploy.json

デプロイが完了するまで、数分間かかります。 その後、コンテナーが起動し、TensorFlow ジョブが実行されます。 az container logs コマンドを実行して、ログの出力を表示します。

az container logs --resource-group myResourceGroup --name gpucontainergrouprm --container-name gpucontainer

出力:

2018-10-25 18:31:10.155010: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-10-25 18:31:10.305937: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Tesla V100 major: 3 minor: 7 memoryClockRate(GHz): 0.8235
pciBusID: ccb6:00:00.0
totalMemory: 11.92GiB freeMemory: 11.85GiB
2018-10-25 18:31:10.305981: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla V100, pci bus id: ccb6:00:00.0, compute capability: 3.7)
2018-10-25 18:31:14.941723: I tensorflow/stream_executor/dso_loader.cc:139] successfully opened CUDA library libcupti.so.8.0 locally
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting /tmp/tensorflow/input_data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting /tmp/tensorflow/input_data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting /tmp/tensorflow/input_data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting /tmp/tensorflow/input_data/t10k-labels-idx1-ubyte.gz
Accuracy at step 0: 0.097
Accuracy at step 10: 0.6993
Accuracy at step 20: 0.8208
Accuracy at step 30: 0.8594
...
Accuracy at step 990: 0.969
Adding run metadata for 999

リソースをクリーンアップする

GPU のリソースの使用は高価になる可能性があるため、コンテナーが長期間にわたり予期せず実行されていることがないようにします。 Azure portal でコンテナーを監視するか、az container show コマンドを使用して、コンテナー グループの状態を確認します。 次に例を示します。

az container show --resource-group myResourceGroup --name gpucontainergroup --output table

作成したコンテナー インスタンスの操作が完了したら、次のコマンドを使ってそれらを削除します。

az container delete --resource-group myResourceGroup --name gpucontainergroup -y
az container delete --resource-group myResourceGroup --name gpucontainergrouprm -y

次のステップ