次の方法で共有


Azure Kubernetes Service (AKS) でマルチインスタンス GPU ノード プールを作成する

一部の NVIDIA の A100 GPU は、最大 7 つの独立したインスタンスに分割できます。 各インスタンスには、命令の並列実行を担当する独自のストリーム マルチプロセッサ (SM) と GPU メモリが搭載されています。 GPU パーティション分割の詳細については、「NVIDIA MIG」を参照してください。

この記事では、Azure Kubernetes Service (AKS) クラスターで MIG と互換性のある VM サイズを使用して、マルチインスタンス GPU ノード プールを作成する方法について説明します。

前提条件と制限事項

  • アクティブなサブスクリプションが含まれる Azure アカウント。 アカウントがない場合は、無料でアカウントを作成することができます。
  • Azure CLI バージョン 2.2.0 以降がインストールされ構成されていること。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、「Azure CLI のインストール」を参照してください。
  • Kubernetes コマンド ライン クライアント kubectl がインストールされ、構成されていること。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。 これをローカルでインストールする必要がある場合は、az aks install-cli コマンドを使用できます。
  • Helm v3 がインストールされ構成されていること。 詳細については、「Helm のインストール」を参照してください。
  • マルチインスタンス GPU は現在、AKS の Standard_NC40ads_H100_v5Standard_ND96isr_H100_v5、A100 GPU VM サイズでサポートされています。

GPU インスタンス プロファイル

GPU インスタンス プロファイルでは、GPU のパーティション分割方法を定義します。 次の表は、Standard_ND96asr_v4 に対して使用できる GPU インスタンス プロファイルを示しています。

プロファイル名 SM の割合 メモリの割合 作成されるインスタンスの数
MIG 1g.5gb 1/7 1/8 7
MIG 2g.10gb 2/7 2/8 3
MIG 3g.20gb 3/7 4/8 2
MIG 4g 20ギガバイト 4/7 4/8 1
MIG 7g.40gb 7月7日 8/8 1

例として、MIG 1g.5gb の GPU インスタンス プロファイルは、各 GPU インスタンスに 1g の SM (ストリーミング マルチプロセッサ) と 5gb のメモリが割り当てられていることを示しています。 この場合、GPU は 7 つのインスタンスにパーティション分割されています。

この VM サイズで使用できる GPU インスタンス プロファイルは、MIG1gMIG2gMIG3gMIG4gMIG7g です。

重要

ノード プールの作成後に、適用される GPU インスタンス プロファイルを変更することはできません。

AKS クラスターを作成する

  1. az group create コマンドを使用して、Azure リソース グループを作成します。

    az group create --name myResourceGroup --location southcentralus
    
  2. az aks create コマンドを使用して、AKS クラスターを作成します。

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --generate-ssh-keys
    
  3. kubectl コマンドを使用して、AKS クラスターに接続するように az aks get-credentials を構成します。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

マルチインスタンス GPU ノード プールを作成する

ノード プールは、Azure CLI または ARM API への HTTP 要求のいずれかを使用して作成できます。

  • az aks nodepool add コマンドでマルチインスタンス GPU ノード プールを作成し、GPU インスタンス プロファイルを指定します。 次の例では、Standard_ND96asr_v4 の MIG 互換 GPU VM サイズのノード プールを作成します。

    az aks nodepool add \
        --name aksMigNode \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --node-vm-size Standard_ND96asr_v4 \
        --node-count 1 \
        --gpu-instance-profile MIG1g
    

マルチインスタンス GPU (MIG) 戦略を決定する

NVIDIA プラグインをインストールする前に、"Single 戦略" または "Mixed 戦略" のどちらのマルチインスタンス GPU (MIG) 戦略を GPU パーティション分割に使用するかを指定する必要があります。 2 つの戦略は、CPU ワークロードの実行方法ではなく、GPU リソースの表示方法に影響します。

  • Single 戦略: Single 戦略では、すべての GPU インスタンスが GPU として扱われます。 この戦略を使用すると、GPU リソースは nvidia.com/gpu: 1 として表示されます。
  • Mixed 戦略: Mixed 戦略では、GPU インスタンスと GPU インスタンス プロファイルが公開されます。 この戦略を使用すると、GPU リソースは nvidia.com/mig1g.5gb: 1 として表示されます。

NVIDIA デバイス プラグインと GPU 機能検出 (GFD) コンポーネントをインストールする

  1. MIG 戦略を環境変数として設定します。 Single 戦略または Mixed 戦略のいずれかを使用できます。

    # Single strategy
    export MIG_STRATEGY=single
    
    # Mixed strategy
    export MIG_STRATEGY=mixed
    
  2. helm repo add および helm repo update コマンドを使用して、NVIDIA デバイス プラグインの helm リポジトリを追加します。

    helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
    helm repo update
    
  3. helm install コマンドを使用して NVIDIA デバイス プラグインをインストールします。

    helm install nvdp nvdp/nvidia-device-plugin \
    --version=0.17.0 \
    --set migStrategy=${MIG_STRATEGY} \
    --set gfd.enabled=true \
    --namespace nvidia-device-plugin \
    --create-namespace
    

NVIDIA デバイス プラグインの Helm インストールにより、Kubernetes デバイス プラグインと GFD リポジトリが統合されます。 AKS マネージド マルチインスタンス GPU を使用する場合、GFD ソフトウェア コンポーネントの別の Helm インストールは推奨されません。

マルチインスタンス GPU の機能を確認する

  1. kubectl コマンドを使用してクラスターへの kubectl get 接続を確認し、クラスター ノードの一覧を返します。

    kubectl get nodes -o wide
    
  2. kubectl describe node コマンドを使用して、ノードにマルチインスタンス GPU 機能があることを確認します。 次のコマンド例では、aksMigNode という名前のノードについて説明します。これは、MIG1g を GPU インスタンス プロファイルとして使用します。

    kubectl describe node aksMigNode
    

    出力は、次の出力例のようになります。

    # Single strategy output
    Allocatable:
        nvidia.com/gpu: 56
    
    # Mixed strategy output
    Allocatable:
        nvidia.com/mig-1g.5gb: 56
    

作業のスケジュール

次の例は、Ubuntu 22.04 の CUDA 基本イメージ バージョン 12.1.1 に基づいており、12.1.1-base-ubuntu22.04 というタグが付けられています。

Single 戦略

  1. single-strategy-example.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

    apiVersion: v1
    kind: Pod
    metadata:
      name: nvidia-single
    spec:
      containers:
      - name: nvidia-single
        image: nvidia/cuda:12.1.1-base-ubuntu22.04
        command: ["/bin/sh"]
        args: ["-c","sleep 1000"]
        resources:
          limits:
            "nvidia.com/gpu": 1
    
  2. kubectl apply コマンドを使用してアプリケーションをデプロイし、ご利用の YAML マニフェストの名前を指定します。

    kubectl apply -f single-strategy-example.yaml
    
  3. kubectl exec コマンドを使用して、割り当てられた GPU デバイスを確認します。 このコマンドを実行すると、クラスター ノードの一覧が返されます。

    kubectl exec nvidia-single -- nvidia-smi -L
    

    デプロイとサービスが正常に作成されたことを示す出力の例は、次のようになります。

    GPU 0: NVIDIA A100 40GB PCIe (UUID: GPU-48aeb943-9458-4282-da24-e5f49e0db44b)
    MIG 1g.5gb     Device  0: (UUID: MIG-fb42055e-9e53-5764-9278-438605a3014c)
    MIG 1g.5gb     Device  1: (UUID: MIG-3d4db13e-c42d-5555-98f4-8b50389791bc)
    MIG 1g.5gb     Device  2: (UUID: MIG-de819d17-9382-56a2-b9ca-aec36c88014f)
    MIG 1g.5gb     Device  3: (UUID: MIG-50ab4b32-92db-5567-bf6d-fac646fe29f2)
    MIG 1g.5gb     Device  4: (UUID: MIG-7b6b1b6e-5101-58a4-b5f5-21563789e62e)
    MIG 1g.5gb     Device  5: (UUID: MIG-14549027-dd49-5cc0-bca4-55e67011bd85)
    MIG 1g.5gb     Device  6: (UUID: MIG-37e055e8-8890-567f-a646-ebf9fde3ce7a)
    

Mixed 戦略

  1. mixed-strategy-example.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

    apiVersion: v1
    kind: Pod
    metadata:
      name: nvidia-mixed
    spec:
      containers:
      - name: nvidia-mixed
        image: nvidia/cuda:12.1.1-base-ubuntu22.04
        command: ["/bin/sh"]
        args: ["-c","sleep 100"]
        resources:
          limits:
            "nvidia.com/mig-1g.5gb": 1
    
  2. kubectl apply コマンドを使用してアプリケーションをデプロイし、ご利用の YAML マニフェストの名前を指定します。

    kubectl apply -f mixed-strategy-example.yaml
    
  3. kubectl exec コマンドを使用して、割り当てられた GPU デバイスを確認します。 このコマンドを実行すると、クラスター ノードの一覧が返されます。

    kubectl exec nvidia-mixed -- nvidia-smi -L
    

    デプロイとサービスが正常に作成されたことを示す出力の例は、次のようになります。

    GPU 0: NVIDIA A100 40GB PCIe (UUID: GPU-48aeb943-9458-4282-da24-e5f49e0db44b)
    MIG 1g.5gb     Device  0: (UUID: MIG-fb42055e-9e53-5764-9278-438605a3014c)
    

重要

CUDA イメージの latest タグは、Docker Hub では非推奨になりました。 最新のイメージと対応するタグについては、「NVIDIA のリポジトリ」を参照してください。

トラブルシューティング

ノード プールの作成後にマルチインスタンス GPU 機能が表示されない場合は、API のバージョンが 2021-08-01 より古くないことを確認してください。

次のステップ

Azure Kubernetes Service の GPU の詳細については、次を参照してください。