Erstellen eines GPU-Knotenpools mit mehreren Instanzen in Azure Kubernetes Service (AKS)

Die A100-GPU von Nvidia kann in bis zu sieben unabhängige Instanzen unterteilt werden. Jede Instanz verfügt über eigenen Arbeitsspeicher und Stream Multiprocessor (SM). Weitere Informationen zu Nvidia A100 finden Sie unter Nvidia A100-GPU.

In diesem Artikel erfahren Sie, wie Sie einen GPU-Knotenpool mit mehreren Instanzen in einem AKS-Cluster (Azure Kubernetes Service) erstellen.

Voraussetzungen und Einschränkungen

  • Ein Azure-Konto mit einem aktiven Abonnement. Falls Sie über keins verfügen, können Sie ein kostenloses Konto erstellen.
  • Installation und Konfiguration der Azure CLI, Version 2.2.0 oder höher. Führen Sie az --version aus, um die Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sie bei Bedarf unter Installieren der Azure CLI.
  • Installation und Konfiguration des Kubernetes-Befehlszeilenclients kubectl. Bei Verwendung von Azure Cloud Shell ist kubectl bereits installiert. Wenn Sie eine lokale Installation bevorzugen, können Sie den Befehl az aks install-cli verwenden.
  • Installation und Konfiguration von Helm 3. Weitere Informationen finden Sie unter Installing Helm (Installieren von Helm).
  • Sie können die Clusterautoskalierung nicht mit Knotenpools mehrere Instanzen verwenden.

GPU-Instanzprofile

GPU-Instanzprofile definieren, wie GPUs partitioniert werden. Die folgende Tabelle zeigt das verfügbare GPU-Instanzprofil für Standard_ND96asr_v4:

Profilname Anteil von SM Anteil des Arbeitsspeichers Anzahl erstellter Instanzen
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

Das GPU-Instanzprofil von MIG 1g.5gb gibt beispielsweise an, dass jede GPU-Instanz 1g SM (Computingressource) und 5 GB Arbeitsspeicher aufweist. In diesem Fall wird die GPU in sieben Instanzen partitioniert.

Die verfügbaren GPU-Instanzprofile für diese Instanzgröße sind MIG1g, MIG2g, MIG3g, MIG4g, MIG7g.

Wichtig

Das angewendete GPU-Instanzprofil kann nach der Erstellung des Knotenpools nicht mehr geändert werden.

Erstellen eines AKS-Clusters

  1. Erstellen Sie mithilfe des Befehls az group create eine Azure-Ressourcengruppe.

    az group create --name myResourceGroup --location southcentralus
    
  2. Erstellen Sie mit dem Befehl az aks create einen AKS-Cluster.

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster\
        --node-count 1 \
        --generate-ssh-keys
    

Erstellen eines GPU-Knotenpools mit mehreren Instanzen

Sie können entweder die Azure CLI oder eine HTTP-Anforderung an die ARM-API verwenden, um den Knotenpool zu erstellen.

  • Erstellen Sie einen GPU-Knotenpool mit mehreren Instanzen über den Befehl az aks nodepool add, und geben Sie das GPU-Instanzprofil an.

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

Festlegen der Strategie für GPU mit mehreren Instanzen (MIG)

Bevor Sie die Nvidia-Plug-Ins installieren, müssen Sie angeben, welche MIG-Strategie (GPU mit mehreren Instanzen) für die GPU-Partitionierung verwendet werden soll: Einzelstrategie oder Gemischte Strategie. Die beiden Strategien wirken sich nicht auf die Ausführung von CPU-Workloads aus, sondern darauf, wie GPU-Ressourcen angezeigt werden.

  • Einzelstrategie: Die Einzelstrategie behandelt jede GPU-Instanz als GPU. Wenn Sie diese Strategie verwenden, werden die GPU-Ressourcen als nvidia.com/gpu: 1 angezeigt.
  • Gemischte Strategie: Die gemischte Strategie macht die GPU-Instanzen und das GPU-Instanzprofil verfügbar. Wenn Sie diese Strategie verwenden, werden die GPU-Ressourcen als nvidia.com/mig1g.5gb: 1 angezeigt.

Installieren des NVIDIA-Geräte-Plug-Ins und der GPU-Featureermittlung

  1. Legen Sie Ihre MIG-Strategie als Umgebungsvariable fest. Sie können entweder die Einzelstrategie oder die gemischte Strategie verwenden.

    # Single strategy
    export MIG_STRATEGY=single
    
    # Mixed strategy
    export MIG_STRATEGY=mixed
    
  2. Fügen Sie die Helm-Repositorys des Nvidia-Geräte-Plug-Ins und der GPU-Featureermittlung mithilfe der Befehle helm repo add und helm repo update hinzu.

    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. Installieren Sie das Nvidia-Geräte-Plug-In mithilfe des Befehls helm install.

    helm install \
    --version=0.14.0 \
    --generate-name \
    --set migStrategy=${MIG_STRATEGY} \
    nvdp/nvidia-device-plugin
    
  4. Installieren Sie die GPU-Featureermittlung mithilfe des Befehls helm install.

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

Bestätigen der GPU-Funktion für mehrere Instanzen

  1. Konfigurieren Sie kubectl, um mithilfe des Befehls az aks get-credentials eine Verbindung mit Ihrem AKS-Cluster herzustellen.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. Überprüfen Sie die Verbindung mit Ihrem Cluster mithilfe des Befehls kubectl get, um eine Liste der Clusterknoten zurückzugeben.

    kubectl get nodes -o wide
    
  3. Vergewissern Sie sich mithilfe des Befehls kubectl describe node, dass der Knoten über eine GPU-Funktion mit mehreren Instanzen verfügt. Der folgende Beispielbefehl beschreibt den Knoten namens mignode, der MIG1g als GPU-Instanzprofil verwendet.

    kubectl describe node mignode
    

    Ihre Ausgabe sollte in etwa wie die folgende Beispielausgabe aussehen:

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

Planen der Arbeit

Die folgenden Beispiele basieren auf der cuda-Basisimageversion 12.1.1 für Ubuntu 22.04, gekennzeichnet als 12.1.1-base-ubuntu22.04.

Einzelne Strategie

  1. Erstellen Sie eine Datei namens single-strategy-example.yaml, und fügen Sie das folgende Manifest ein.

    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. Stellen Sie die Anwendung über den Befehl „kubectl apply“ bereit, und geben Sie den Namen Ihres YAML-Manifests an.

    kubectl apply -f single-strategy-example.yaml
    
  3. Überprüfen Sie die zugeordneten GPU-Geräte mithilfe des Befehls kubectl exec. Dieser Befehl gibt eine Liste der Clusterknoten zurück.

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

    Das folgende Beispiel ähnelt einer Ausgabe, die erfolgreich erstellte Bereitstellungen und Dienste anzeigt:

    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)
    

Gemischte Strategie

  1. Erstellen Sie eine Datei namens mixed-strategy-example.yaml, und fügen Sie das folgende Manifest ein.

    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. Stellen Sie die Anwendung über den Befehl „kubectl apply“ bereit, und geben Sie den Namen Ihres YAML-Manifests an.

    kubectl apply -f mixed-strategy-example.yaml
    
  3. Überprüfen Sie die zugeordneten GPU-Geräte mithilfe des Befehls kubectl exec. Dieser Befehl gibt eine Liste der Clusterknoten zurück.

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

    Das folgende Beispiel ähnelt einer Ausgabe, die erfolgreich erstellte Bereitstellungen und Dienste anzeigt:

    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)
    

Wichtig

Das Tag latest für CUDA-Images gilt auf Docker Hub als veraltet. Die neuesten Images und entsprechenden Tags finden Sie im NVIDIA-Repository.

Problembehandlung

Wenn nach dem Erstellen des Knotenpools keine GPU-Funktion mit mehreren Instanzen angezeigt wird, vergewissern Sie sich, dass die API-Version nicht älter als 2021-08-01 ist.

Nächste Schritte

Weitere Informationen zu AKS-Knotenpools finden Sie unter Verwalten von Knotenpools für einen Cluster in AKS.