次の方法で共有


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

Nvidia の A100 GPU は、最大 7 つの独立したインスタンスに分割できます。 各インスタンスに独自のメモリとストリーム マルチプロセッサ (SM) があります。 Nvidia A100 の詳細については、Nvidia A100 GPU に関するページを参照してください。

この記事では、Azure Kubernetes Service (AKS) クラスターでマルチインスタンス GPU ノード プールを作成する方法について説明します。

前提条件と制限事項

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

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

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

Profile name 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.20gb 4/7 4/8 1
MIG 7g.40gb 7/7 8/8 1

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

このインスタンス サイズで使用できる GPU インスタンス プロファイルは、MIG1gMIG2gMIG3gMIG4g、および MIG7g です。

重要

ノード プールの作成後に、適用される 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\
        --node-count 1 \
        --generate-ssh-keys
    

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

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

  • az aks nodepool add コマンドでマルチインスタンス GPU ノード プールを作成し、GPU インスタンス プロファイルを指定します。

    az aks nodepool add \
        --name mignode \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --node-vm-size Standard_ND96asr_v4 \
        --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 機能検出をインストールする

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

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

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

    helm install \
    --version=0.14.0 \
    --generate-name \
    --set migStrategy=${MIG_STRATEGY} \
    nvdp/nvidia-device-plugin
    
  4. helm install コマンドを使用して GPU 機能検出をインストールします。

    helm install \
    --version=0.2.0 \
    --generate-name \
    --set migStrategy=${MIG_STRATEGY} \
    nvgfd/gpu-feature-discovery
    

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

  1. az aks get-credentials コマンドを使用して、AKS クラスターに接続するように kubectl を構成します。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. kubectl get コマンドを使用してクラスターへの接続を確認し、クラスター ノードの一覧を返します。

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

    kubectl describe node mignode
    

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

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

作業のスケジュール

次の例は、Ubuntu22.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 より古くないことを確認してください。

次のステップ

AKS ノード プールの詳細については、「AKS のクラスターでノード プールを管理する」を参照してください。