マルチインスタンス GPU (MIG) は、 互換性のある NVIDIA GPU を 専用のコンピューティングリソースとメモリ リソースを持つパーティションに分割します。 AKS クラスターでは、ワークロードは Kubernetes 拡張リソースを介してこれらのパーティションを要求します。 混合マルチインスタンス GPU (MIG) 戦略を使用して、GPU パーティション のサイズをワークロードに合わせます。 GPU 全体をより小さなワークロードに割り当てたり、ワークロードごとに同じパーティション サイズを使用したりする代わりに、コンピューティングとメモリのニーズが異なるワークロードを 1 つの GPU で実行します。 各パーティションには、分離されたコンピューティング リソースとメモリ リソースがあります。 この方法では、小さいワークロードで GPU 容量を大きなワークロードと共に共有できるようにすることで、GPU 使用率を向上させることができます。
たとえば、NVIDIA A100 80 GB GPU では、1 つの大きなパーティション、1 つの中規模パーティション、2 つの小さなパーティションを提供できます。 次のサンプル混合レイアウトに示すように、4 つのワークロードを同時に実行できます。各ワークロードは、ニーズに合わせてサイズ設定されたパーティションを使用します。
この記事では、混合 MIG ノード プールを作成し、パーティション割り当てを確認し、サンプル ワークロードを実行する方法について説明します。
戦略の選択については、 AKS のマルチインスタンス GPU 戦略に関する説明を参照してください。 均一パーティションについては、「 単一戦略 MIG ノード プールを作成する」を参照してください。
Important
AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は運用環境での使用を目的としていません。 詳細については、次のサポート記事を参照してください。
始める前の準備
混合 MIG ノード プールを構成する前に、次の前提条件があることを確認してください。
- この記事は、AKS クラスターがすでに存在していることを前提としています。 クラスターがない場合は、Azure CLI、Azure PowerShell、または Azure ポータルを使用してクラスターを作成します。
- バージョン
2.85.0以降の Azure CLI と、バージョン22.0.0b15以降のaks-preview拡張機能をインストールしました。az --versionを実行して、Azure CLIのバージョンを確認します。 - 選択した AKS リージョンで使用可能なサポートされている MIG 対応 GPU VM サイズ。 デプロイする予定の VM サイズとノード数に対して十分なリージョンと GPU ファミリの vCPU クォータがあることを確認します。
- 選択した GPU に対応する混合 MIG レイアウト GPU の容量と配置の制約を満たす、サポートされているパーティション プロファイルを選択します。 詳細については、「混合MIGプロファイルについて理解する」を参照してください。
- MIG ノード プールでは、VHD バージョン
202609.01.0以降に基づいて AKS Linux ノード イメージが使用されます。 - サブスクリプションに登録されている
ManagedGPUExperiencePreview機能とMixedMIGStrategyPreview機能 手順については、「プレビュー機能を登録する」を参照してください。
Limitations
-
AzureContainerLinuxとWindowsOS SKU を持つノード プールは、現在、この機能ではサポートされていません。 - 現在、この機能では AKS クラスター オートスケーラーを使用した、混合戦略の MIG ノードの自動スケーリングはサポートされていません。
- 混合戦略構成は、GPU のパーティション分割容量と配置の制約を満たす必要があります。
- MIG ノード プールの作成後にプロファイル構成を変更することはできません。 代替プールを作成してレイアウトを変更するか、MIG の使用を停止します。 戦略を
Noneに更新して MIG を無効にしないでください。
混合 MIG プロファイルを理解する
MIG3gは、のように、1 つの GPU パーティションのサイズを定義します。
レイアウトは、ノード プールで構成するプロファイルのセットです。 レイアウト内の各プロファイルは、ワークロードが拡張リソースとして要求する 1 つの パーティション を作成します。
MIG 戦略は、互換性のあるプロファイル構成と、ワークロードが要求するリソース名の両方を制御します。
| Strategy | プロファイルの構成 | ワークロード リソース |
|---|---|---|
| Single | プロファイルを 1 つだけ指定すると、AKS によって均一なパーティション レイアウトが作成されます。 |
nvidia.com/gpu: 各ユニットは、物理 GPU 全体ではなく、1 つの MIG パーティションを表します。 |
| Mixed | サポートされるレイアウトを形成する 1 つ以上の互換性のあるプロファイルを指定します。 プロファイルを繰り返して、そのサイズの複数のパーティションを要求します。 |
たとえばnvidia.com/mig-1g.10gbのようなプロファイル固有のリソース。 |
サポートされているプロファイル値は、 MIG1g、 MIG2g、 MIG3g、 MIG4g、および MIG7gです。 次の表は、各プロファイルが NVIDIA A100 80 GB GPU ( Standard_NC24ads_A100_v4 の GPU など) で作成するパーティションを示しています。 プロファイルあたりの GPU メモリは NVIDIA GPU モデルによって異なります。
| Profile | コンピュート スライス | Partition | ワークロード リソース |
|---|---|---|---|
MIG1g |
1 | 1g.10gb |
nvidia.com/mig-1g.10gb |
MIG2g |
2 | 2g.20gb |
nvidia.com/mig-2g.20gb |
MIG3g |
3 | 3g.40gb |
nvidia.com/mig-3g.40gb |
MIG4g |
4 | 4g.40gb |
nvidia.com/mig-4g.40gb |
MIG7g |
7 | 7g.80gb |
nvidia.com/mig-7g.80gb |
環境を準備する
混合 MIG ノード プールを追加する前に、環境変数を設定し、プレビュー機能を登録し、既存のクラスターに接続します。
環境変数の設定
既存のクラスター用に次の環境変数を設定します。 この記事の後半のサンプル マニフェストでは、
migmixedにはMIXED_POOLを使用します。export SUBSCRIPTION_ID="<subscription-id>" export RESOURCE_GROUP="<my-resource-group>" export CLUSTER_NAME="<my-cluster-name>" export MIXED_POOL="<mig-pool-name>"
プレビュー機能を登録する
aks-preview拡張機能をインストールまたは更新します。az extension add --name aks-preview --upgrade --yesManagedGPUExperiencePreview機能を登録します。az feature register \ --namespace Microsoft.ContainerService \ --name ManagedGPUExperiencePreviewMixedMIGStrategyPreview機能を登録します。az feature register \ --namespace Microsoft.ContainerService \ --name MixedMIGStrategyPreviewマネージド GPU 機能の登録状態を確認します。
az feature show \ --namespace Microsoft.ContainerService \ --name ManagedGPUExperiencePreview \ --query properties.state --output tsv混合 MIG 機能の登録状態を確認します。
az feature show \ --namespace Microsoft.ContainerService \ --name MixedMIGStrategyPreview \ --query properties.state --output tsv両方の状態が
Registered返されたら、リソース プロバイダーの登録を更新してください。az provider register --namespace Microsoft.ContainerService
AKS クラスターに接続する
クラスターの資格情報を取得します。
az aks get-credentials \ --resource-group "$RESOURCE_GROUP" \ --name "$CLUSTER_NAME"接続と既存のノードの状態を確認します。
kubectl get nodes
新しいノード プールで混合 MIG を有効にする
Azure CLIを使用して、混合 MIG ノード プールを作成します。 ノード OS SKU のタブを選択します。
既定の OS SKU を使用するには、OS SKU を指定せずにノード プールを作成します。 ノード プールは、クラスターの Kubernetes バージョンに基づき、既定のオペレーティング システムに対して設定されます。
次の A100 レイアウトを使用して、混合 MIG ノード プールを作成します。
--enable-managed-gpu=true、--gpu-mig-strategy Mixed、および MIG プロファイル リストを一緒に指定します。 AKS は、指定されたリストの順序を保持し、ノード構成時に配置順序を制御します。
az aks nodepool add \
--resource-group "$RESOURCE_GROUP" \
--cluster-name "$CLUSTER_NAME" \
--name "$MIXED_POOL" \
--node-vm-size "Standard_NC24ads_A100_v4" \
--enable-managed-gpu=true \
--gpu-mig-strategy Mixed \
--gpu-mig-profiles MIG3g MIG2g MIG1g MIG1g \
--node-count 1
混合 MIG 構成を確認する
ノード プールの構成、ノードの準備状況、およびアドバタイズされたリソースを個別に確認します。 GPU ノードのプロビジョニングだけでは、ワークロードがパーティションを使用できることを確認できません。
プールの構成とノード イメージを調べます。
az aks nodepool show \ --resource-group "$RESOURCE_GROUP" \ --cluster-name "$CLUSTER_NAME" \ --name "$MIXED_POOL" \ --query "{state:provisioningState,image:nodeImageVersion,gpu:gpuProfile.nvidia}" \ --output json出力が次の値と一致することを確認します。
出力フィールド 予測値 stateSucceededgpu.managementModeManagedgpu.driverModeDevicePlugingpu.migStrategyMixedgpu.migProfilesMIG3g、MIG2g、MIG1g、MIG1g(両方のMIG1gエントリ)混合 MIG ノード プール内のノードが
Readyになるまで待ちます。kubectl wait --for=condition=Ready node \ -l agentpool="$MIXED_POOL" --timeout=600sプール内のすべてのノードで、割り当て可能な NVIDIA リソースを調べます。
kubectl describe nodes -l agentpool="$MIXED_POOL"MIG3g MIG2g MIG1g MIG1gレイアウトを使用したStandard_NC24ads_A100_v4の場合、各ノードのAllocatableセクションには、CPU、メモリ、その他のリソースと共に次のリソース数が含まれている必要があります。Allocatable: nvidia.com/mig-1g.10gb: 2 nvidia.com/mig-2g.20gb: 1 nvidia.com/mig-3g.40gb: 1これらの数は、現在使用されていないパーティションのレポートではなく、割り当て可能な容量です。 スケジュールされたPod リクエストを調べて、残りの容量を判断します。
さまざまなパーティション サイズでワークロードを実行する
ノードがアドバタイズする正確な拡張リソース名を使用します。 次の例では、1 つの 3g.40gb パーティションと 1 つの 1g.10gb パーティションを要求します。 各コンテナーは、GPU デバイス情報を報告するために nvidia-smi を1回実行し、その後終了します。
次のマニフェストを使用して、
mixed-mig-workloads.yamlという名前のファイルを作成します。agentpoolセレクターでは、migmixedプール名が使用されます。MIXED_POOLに別の名前を使用した場合は、両方のセレクターを更新します。apiVersion: v1 kind: Pod metadata: name: mixed-mig-pod-3g spec: restartPolicy: Never nodeSelector: agentpool: migmixed containers: - name: gpu-test image: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu command: ["nvidia-smi"] resources: limits: nvidia.com/mig-3g.40gb: "1" --- apiVersion: v1 kind: Pod metadata: name: mixed-mig-pod-1g spec: restartPolicy: Never nodeSelector: agentpool: migmixed containers: - name: gpu-test image: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu command: ["nvidia-smi"] resources: limits: nvidia.com/mig-1g.10gb: "1"別途の要求を省略すると、Kubernetes は要求として拡張リソース制限を使用します。 整数のパーティション数を指定します。 同じ GPU リソースに対して要求と制限の両方を設定する場合は、同じ値を使用します。
サンプル ポッドをデプロイします。
kubectl apply -f mixed-mig-workloads.yaml大きなパーティション ポッドが正常に完了するまで待ちます。
kubectl wait --for=jsonpath='{.status.phase}'=Succeeded \ pod/mixed-mig-pod-3g --timeout=300s小さいパーティション ポッドが正常に完了するまで待ちます。
kubectl wait --for=jsonpath='{.status.phase}'=Succeeded \ pod/mixed-mig-pod-1g --timeout=300sポッドのノード割り当てを確認します。
kubectl get pods mixed-mig-pod-3g mixed-mig-pod-1g -o wideパーティションが大きいポッドの GPU デバイス情報を読み取ります。
kubectl logs mixed-mig-pod-3gが GPU と割り当てられた MIG デバイスをエラーなしで報告することを確認します。 ポッドは、ノードのアドバタイズされた
nvidia.com/mig-3g.40gbリソースを要求します。小さいパーティション ポッドの GPU デバイス情報を読み取ります。
kubectl logs mixed-mig-pod-1gが GPU と割り当てられた MIG デバイスをエラーなしで報告することを確認します。 ポッドは、ノードのアドバタイズされた
nvidia.com/mig-1g.10gbリソースを要求します。 出力の書式設定はドライバーのバージョンによって異なります。既定のコマンドでは、プロファイル名が必ずしも表示されるとは限りません。 物理 GPU 情報は、ポッドが GPU 全体にアクセスできる証拠ではありません。正常に完了したポッドは、
Completedにkubectl get podsを表示します。 コンテナーが終了した後、Ready のままではなく、パーティションの割り当ても保持されません。 完了待機がタイムアウトした場合は、ポッドの状態、ログ、およびイベントを調べて、スケジュールの問題とイメージまたはコンテナーの障害を区別します。
Single戦略プールの場合は、プロファイル固有のリソースではなくnvidia.com/gpu: "1"を要求します。 この例では、このリソース名を再利用して、混合プールからパーティションを要求しないでください。
ノード プールのスケーリングと保守
スケーリングでは、混合 MIG ノード プールの元の戦略とプロファイル リストが保持されます。 ノードを追加する前に、クォータと利用可能な GPU リソースがあることを確認します。
az aks nodepool scale \
--resource-group "$RESOURCE_GROUP" \
--cluster-name "$CLUSTER_NAME" \
--name "$MIXED_POOL" \
--node-count 2
すべてのノードについて、ノードの準備状況と割り当て可能なリソース チェックを繰り返します。
Standard_NC24ads_A100_v4とMIG3g MIG2g MIG1g MIG1g レイアウトでは、各ノードは同じ 4 つのパーティション (1 つの3g.40gb、1 つの2g.20gb、2 つの1g.10gb) をアドバタイズします。 ノードを増やすと、構成済みのパーティションの種類の容量が追加されます。不足している種類は追加されません。
node-image-only アップグレード コマンドを使用してノード イメージを更新します。 メンテナンス中のワークロードの中断、代替ノードの GPU クォータと容量を計画します。
az aks nodepool upgrade \
--resource-group "$RESOURCE_GROUP" \
--cluster-name "$CLUSTER_NAME" \
--name "$MIXED_POOL" \
--node-image-only
本番ワークロード評価用にパーティションの使用を最適化する
運用環境のデプロイを計画する前に、AKS テスト環境で運用ワークロードの組み合わせを評価するには、次のプラクティスを使用します。
- 測定値に基づいてパーティションのサイズを決定します。 代表的な推論、バッチ、トレーニングのワークロードをベンチマークします。 現実的なコンカレンシーの下で、ピーク時のデバイス メモリ、コンピューティング使用率、スループット、待機時間を測定します。 メモリに余裕を持って、ワークロードの要件を満たす最小のパーティションを選択します。
- 同時の需要に合わせてレイアウトを合わせます。
Standard_NC24ads_A100_v4のMIG3g MIG2g MIG1g MIG1gレイアウトでは、ノードごとに 1 つの大きい、1 つの中、および 2 つの小さなパーティションが提供されます。 大きなパーティションに対する 2 つの同時要求には、小さなパーティションがアイドル状態であっても、2 つのノードが必要です。 GPU メモリの合計だけでなく、同時需要の分布からレイアウトを選択します。 - 容量を個別のリソースの種類として扱います。 各
nvidia.com/mig-*リソースの要求された容量と使用可能な容量を追跡します。 Kubernetes では、小さなパーティションを大きなパーティションに結合したり、保留状態のPodの要件を満たすように構成されたレイアウトのサイズを変更したりすることはありません。 - ワークロード クラスごとに個別のプールを使用します。 MIG 設定なしで作成されたプールに、パーティション分割されていない GPU を必要とするワークロードを配置します。 すべてのジョブで同じパーティション サイズが必要な場合は統一された 1 つの戦略を使用し、ワークロードで異なるサイズが必要な場合は混在レイアウトを使用します。 分散ワークロードまたはマルチ GPU ワークロードを、完全 GPU ワークロードのように動作すると想定するのではなく、個別にベンチマークします。
- CPU とメモリの要求と GPU の制限を設定します。 使用可能な GPU パーティションでは、ノードにワークロードを実行するのに十分なホスト メモリまたは CPU があることを確認できません。 この記事の検査ポッドではなく、アプリケーションのライフサイクルに適したデプロイまたはジョブを使用します。
- ワークロードの結果とパーティション使用率を一緒に監視します。 待ち時間、スループット、GPU メモリ不足、および MIG プロファイル別のスケジューリングの失敗を比較します。
- アプリケーション スタックを検証します。 フレームワーク、CUDA、ドライバー、パーティションの互換性をテストします。 検証済みのアプリケーション イメージのバージョンまたはダイジェストをピン留めし、実稼働アプリケーション イメージとして検査イメージを使用しないでください。
構成とスケジューリングのトラブルシューティング
サンプル ポッドが Pending のままの場合は、スケジュール イベントとノードの割り当てられたリソースを確認します。
mixed-mig-pod-3gのなど、保留中のサンプル ポッドのスケジュール イベントを調べます。
kubectl describe pod mixed-mig-pod-3g
混合 MIG ノード プールのノードで割り当てられたリソース要求を確認します:
kubectl describe nodes -l agentpool="$MIXED_POOL"
一般的な原因には、次のようなものがあります。
- ポッドは、プールがアドバタイズしないリソースを要求します。 たとえば、
nvidia.com/mig-4g.40gbの要求は、MIG3g MIG2g MIG1g MIG1gで作成されたプールで保留中のままです。これは、プールがそのリソースをアドバタイズしないためです。 プールをスケーリングしても、この不一致は解決されません。 - ノードに他のリソースがありません。 GPU パーティションが使用可能な場合は、CPU、ホスト メモリ、テイント、アフィニティを確認します。
関連するガイダンスについては、 単一戦略の MIG のトラブルシューティング と マネージド GPU 検証を参照してください。 この記事の構成要件は、新しい混合プロファイル プレビューに適用されます。
混合 MIG 戦略を無効にしてサンプル リソースを削除する
ワークロードを移行し、混合 MIG ノード プールを削除して、混合 MIG の使用を無効にします。 プレビューでは、インプレースでの変更や None 戦略は提供されません。 サブスクリプション機能の登録解除を行っても、既存のノードが変換されたり、ノード プールの削除が置き換えられたりすることはありません。
混合 MIG ノード プールを削除または置き換える
アプリケーション ワークロードを実行するノード プールを削除する前に、十分な容量で代替 MIG プールをプロビジョニングし、ワークロード リソースの要求とセレクターを更新し、アプリケーションの正常性を確認します。 パーティション分割されていない GPU プールを作成するには、 --gpu-mig-strategy と --gpu-mig-profilesの両方を省略します。 単一の戦略に移行するには、 --gpu-mig-strategy Single と正確に 1 つのプロファイルを持つ新しいノード プールを作成します。
たとえば、アプリケーションに GPU 容量がまだ必要な場合にのみ、マネージドフル GPU 交換ノード プールを作成します。
az aks nodepool add \
--resource-group "$RESOURCE_GROUP" \
--cluster-name "$CLUSTER_NAME" \
--name gpufull \
--node-vm-size "Standard_NC24ads_A100_v4" \
--enable-managed-gpu=true \
--node-count 1
置換ノードが Ready であること、および MIG パーティション リソースではなく nvidia.com/gpu をアドバタイズしていることを確認します。
kubectl describe nodes -l agentpool=gpufull
各ノードの Conditions セクションで、 Ready が Trueされていることを確認します。
Allocatable セクションで、nvidia.com/gpuが存在し、MIG パーティション リソースがアドバタイズされていないことを確認します。
移行されたワークロードを更新して nvidia.com/gpu を要求し、 agentpool: gpufullを選択します。 古いノード プールを削除する前に、完全な GPU でアプリケーションのサイズ設定と動作を再検証します。 代替 GPU 容量が必要ない場合は、この例をスキップし、サンプル プールを直接削除してください。
サンプル ポッドと混合 MIG ノード プールを削除する
検査ポッドを削除します。
kubectl delete pod mixed-mig-pod-3g mixed-mig-pod-1g \ --ignore-not-found=trueサンプル ポッドがなくなったことを確認します。
kubectl get pods \ --field-selector metadata.name=mixed-mig-pod-3gkubectl get pods \ --field-selector metadata.name=mixed-mig-pod-1g他のワークロードを移行した後、混合 MIG ノード プールを削除します。 別のクラスター操作を開始する前に、この操作が完了するまで待ちます。
az aks nodepool delete \ --resource-group "$RESOURCE_GROUP" \ --cluster-name "$CLUSTER_NAME" \ --name "$MIXED_POOL"削除されたノード プールが表示されなくなったことを確認します。
az aks nodepool list \ --resource-group "$RESOURCE_GROUP" \ --cluster-name "$CLUSTER_NAME" \ --query "[?name=='$MIXED_POOL'].name" \ --output json出力は
[]であるはずです。そのノード プールに対して Kubernetes ノードが残っていないことを確認します。
kubectl get nodes -l agentpool="$MIXED_POOL"このコマンドでは、削除が完了した後に一致するリソースが報告されません。
次のステップ
- AKS でサポートされている MIG 戦略 について説明します。
- AKS のマネージド GPU ノードを確認します。
- 単一戦略 MIG ノード プールを作成する の単一戦略構成の例と比較します。