GPU's gebruiken voor rekenintensieve workloads in Azure Kubernetes Service (AKS)

Grafische verwerkingseenheden (GPU's) worden vaak gebruikt voor rekenintensieve workloads, zoals afbeeldingen en visualisatieworkloads. AKS ondersteunt Linux-knooppuntgroepen met GPU om rekenintensieve Kubernetes-workloads uit te voeren.

Dit artikel helpt u bij het inrichten van knooppunten met gescheerde GPU's op nieuwe en bestaande AKS-clusters.

Ondersteunde VM's met GPU

Zie voor GPU geoptimaliseerde VM-grootten in Azure om ondersteunde VM-vm's met GPU weer te geven. Voor AKS-knooppuntgroepen raden we een minimale grootte van Standard_NC6s_v3 aan. De NVv4-serie (gebaseerd op AMD GPU's) wordt niet ondersteund op AKS.

Notitie

VM's met GPU-functionaliteit bevatten speciale hardware waarvoor hogere prijzen en beschikbaarheid van regio's gelden. Zie het prijshulpprogramma en de beschikbaarheid van regio's voor meer informatie.

Beperkingen

  • Als u een azure Linux GPU-knooppuntgroep gebruikt, worden er geen automatische beveiligingspatches toegepast en wordt het standaardgedrag voor het cluster niet beheerd. Zie automatische upgrade voor meer informatie.
  • NVadsA10 v5-serie is geen aanbevolen SKU voor GPU-VHD.
  • Het bijwerken van een bestaande knooppuntgroep om GPU toe te voegen wordt niet ondersteund.

Voordat u begint

  • In dit artikel wordt ervan uitgegaan dat u een bestaand AKS-cluster hebt. Als u geen cluster hebt, maakt u er een met behulp van de Azure CLI, Azure PowerShell of Azure Portal.
  • U hebt Azure CLI versie 2.0.64 of hoger geïnstalleerd en geconfigureerd. Voer az --version uit om de versie te bekijken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.

De referenties voor uw cluster ophalen

  • Haal de referenties voor uw AKS-cluster op met behulp van de az aks get-credentials opdracht. Met de volgende voorbeeldopdracht worden de referenties voor het myAKSCluster in de resourcegroep myResourceGroup ophaalt:

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

Opties voor het gebruik van NVIDIA GPU's

Het gebruik van NVIDIA GPU's omvat de installatie van verschillende NVIDIA-softwareonderdelen, zoals de NVIDIA-apparaatinvoegtoepassing voor Kubernetes, installatie van GPU-stuurprogramma's en meer.

Installatie van GPU-stuurprogramma overslaan (preview)

AKS heeft standaard automatische installatie van GPU-stuurprogramma's ingeschakeld. In sommige gevallen, zoals het installeren van uw eigen stuurprogramma's of het gebruik van de NVIDIA GPU-operator, kunt u de installatie van GPU-stuurprogramma's overslaan.

Belangrijk

AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals is' en 'als beschikbaar' en ze worden uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning op basis van best effort. Daarom zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:

  1. Registreer of werk de aks-preview-extensie bij met behulp van de az extension add of az extension update opdracht.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Maak een knooppuntgroep met behulp van de az aks nodepool add opdracht met de vlag om de --skip-gpu-driver-install automatische installatie van GPU-stuurprogramma's over te slaan.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --skip-gpu-driver-install \
        --node-vm-size Standard_NC6s_v3 \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3
    

    Als u de vlag toevoegt tijdens het --skip-gpu-driver-install maken van een knooppuntgroep, wordt de automatische installatie van het GPU-stuurprogramma overgeslagen. Bestaande knooppunten worden niet gewijzigd. U kunt de knooppuntgroep schalen naar nul en vervolgens een back-up maken om de wijziging door te voeren.

Installatie van NVIDIA-apparaatinvoegtoepassing

Installatie van DE NVIDIA-apparaatinvoegtoepassing is vereist bij het gebruik van GPU's op AKS. In sommige gevallen wordt de installatie automatisch verwerkt, bijvoorbeeld wanneer u de NVIDIA GPU-operator of de AKS GPU-installatiekopieën (preview) gebruikt. U kunt de NVIDIA-apparaatinvoegtoepassing ook handmatig installeren.

De NVIDIA-apparaatinvoegtoepassing handmatig installeren

U kunt een DaemonSet implementeren voor de NVIDIA-apparaatinvoegtoepassing, die op elk knooppunt een pod uitvoert om de vereiste stuurprogramma's voor de GPU's op te geven. Dit is de aanbevolen aanpak bij het gebruik van gpu-knooppuntgroepen voor Azure Linux.

Als u de standaard-SKU van het besturingssysteem wilt gebruiken, maakt u de knooppuntgroep zonder een SKU van het besturingssysteem op te geven. De knooppuntgroep is geconfigureerd voor het standaardbesturingssysteem op basis van de Kubernetes-versie van het cluster.

  1. Voeg een knooppuntgroep toe aan uw cluster met behulp van de az aks nodepool add opdracht.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --node-vm-size Standard_NC6s_v3 \
        --node-taints sku=gpu:NoSchedule \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3
    

    Met deze opdracht wordt een knooppuntgroep met de naam gpunp toegevoegd aan myAKSCluster in myResourceGroup en worden parameters gebruikt om de volgende instellingen voor de knooppuntgroep te configureren:

    • --node-vm-size: hiermee stelt u de VM-grootte voor het knooppunt in de knooppuntgroep in op Standard_NC6s_v3.
    • --node-taints: Hiermee geeft u een sku=gpu:NoSchedule taint op de knooppuntgroep.
    • --enable-cluster-autoscaler: hiermee schakelt u automatische schaalaanpassing van clusters in.
    • --min-count: hiermee configureert u de automatische schaalaanpassing van clusters om minimaal één knooppunt in de knooppuntgroep te onderhouden.
    • --max-count: hiermee configureert u de automatische schaalaanpassing van clusters om maximaal drie knooppunten in de knooppuntgroep te onderhouden.

    Notitie

    Taints en VM-grootten kunnen alleen worden ingesteld voor knooppuntgroepen tijdens het maken van de knooppuntgroep, maar u kunt instellingen voor automatische schaalaanpassing op elk gewenst moment bijwerken.

  1. Maak een naamruimte met behulp van de kubectl create namespace opdracht.

    kubectl create namespace gpu-resources
    
  2. Maak een bestand met de naam nvidia-device-plugin-ds.yaml en plak het volgende YAML-manifest dat is opgegeven als onderdeel van de NVIDIA-apparaatinvoegtoepassing voor het Kubernetes-project:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nvidia-device-plugin-daemonset
      namespace: gpu-resources
    spec:
      selector:
        matchLabels:
          name: nvidia-device-plugin-ds
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          # Mark this pod as a critical add-on; when enabled, the critical add-on scheduler
          # reserves resources for critical add-on pods so that they can be rescheduled after
          # a failure.  This annotation works in tandem with the toleration below.
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          # Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
          # This, along with the annotation above marks this pod as a critical add-on.
          - key: CriticalAddonsOnly
            operator: Exists
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          containers:
          - image: mcr.microsoft.com/oss/nvidia/k8s-device-plugin:v0.14.1
            name: nvidia-device-plugin-ctr
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: ["ALL"]
            volumeMounts:
              - name: device-plugin
                mountPath: /var/lib/kubelet/device-plugins
          volumes:
            - name: device-plugin
              hostPath:
                path: /var/lib/kubelet/device-plugins
    
  3. Maak de DaemonSet en controleer of de NVIDIA-apparaatinvoegtoepassing is gemaakt met behulp van de kubectl apply opdracht.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Nu u de NVIDIA-apparaatinvoegtoepassing hebt geïnstalleerd, kunt u controleren of uw GPU's kunnen worden scheduleerbaar en een GPU-workload uitvoeren.

NVIDIA GPU-operator gebruiken met AKS

De NVIDIA GPU Operator automatiseert het beheer van alle NVIDIA-softwareonderdelen die nodig zijn om GPU in te richten, inclusief installatie van stuurprogramma's, de NVIDIA-apparaatinvoegtoepassing voor Kubernetes, de NVIDIA-containerruntime en meer. Omdat de GPU-operator deze onderdelen verwerkt, is het niet nodig om de NVIDIA-apparaatinvoegtoepassing handmatig te installeren. Dit betekent ook dat de automatische installatie van gpu-stuurprogramma's op AKS niet meer vereist is.

  1. Sla de automatische installatie van GPU-stuurprogramma's over door een knooppuntgroep te maken met behulp van de az aks nodepool add opdracht met --skip-gpu-driver-install. Als u de vlag toevoegt tijdens het --skip-gpu-driver-install maken van een knooppuntgroep, wordt de automatische installatie van het GPU-stuurprogramma overgeslagen. Bestaande knooppunten worden niet gewijzigd. U kunt de knooppuntgroep schalen naar nul en vervolgens een back-up maken om de wijziging door te voeren.

  2. Volg de NVIDIA-documentatie om de GPU-operator te installeren.

  3. Nu u de GPU-operator hebt geïnstalleerd, kunt u controleren of uw GPU's scheduleerbaar zijn en een GPU-workload uitvoeren.

Waarschuwing

Het is niet raadzaam om de daemon van de NVIDIA-apparaatinvoegtoepassing handmatig te installeren met clusters met behulp van de AKS GPU-installatiekopie.

De AKS GPU-installatiekopieën gebruiken (preview)

AKS biedt een volledig geconfigureerde AKS-installatiekopie met de NVIDIA-apparaatinvoegtoepassing voor Kubernetes. De AKS GPU-installatiekopie wordt momenteel alleen ondersteund voor Ubuntu 18.04.

Belangrijk

AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals is' en 'als beschikbaar' en ze worden uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning op basis van best effort. Daarom zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:

  1. Installeer de aks-preview Azure CLI-extensie met behulp van de az extension add opdracht.

    az extension add --name aks-preview
    
  2. Werk bij naar de nieuwste versie van de extensie met behulp van de az extension update opdracht.

    az extension update --name aks-preview
    
  3. Registreer de GPUDedicatedVHDPreview functievlag met behulp van de az feature register opdracht.

    az feature register --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    

    Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven.

  4. Controleer de registratiestatus met behulp van de az feature show opdracht.

    az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
    
  5. Wanneer de status Geregistreerd weergeeft, vernieuwt u de registratie van de Microsoft.ContainerService-resourceprovider met behulp van de az provider register opdracht.

    az provider register --namespace Microsoft.ContainerService
    

    Nu u uw cluster hebt bijgewerkt om de AKS GPU-installatiekopieën te gebruiken, kunt u een knooppuntgroep voor GPU-knooppunten toevoegen aan uw cluster.

  6. Voeg een knooppuntgroep toe met behulp van de az aks nodepool add opdracht.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --node-vm-size Standard_NC6s_v3 \
        --node-taints sku=gpu:NoSchedule \
        --aks-custom-headers UseGPUDedicatedVHD=true \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3
    

    Met de vorige voorbeeldopdracht wordt een knooppuntgroep met de naam gpunp toegevoegd aan myAKSCluster in myResourceGroup en worden parameters gebruikt om de volgende instellingen voor de knooppuntgroep te configureren:

    • --node-vm-size: hiermee stelt u de VM-grootte voor het knooppunt in de knooppuntgroep in op Standard_NC6s_v3.
    • --node-taints: Hiermee geeft u een sku=gpu:NoSchedule taint op de knooppuntgroep.
    • --aks-custom-headers: Hiermee geeft u een gespecialiseerde AKS GPU-installatiekopieën, UseGPUDedicatedVHD=true. Als uw GPU-sku virtuele machines van de tweede generatie vereist, gebruikt u in plaats daarvan --aks-custom-headers UseGPUDedicatedVHD=true, usegen2vm=true .
    • --enable-cluster-autoscaler: hiermee schakelt u automatische schaalaanpassing van clusters in.
    • --min-count: hiermee configureert u de automatische schaalaanpassing van clusters om minimaal één knooppunt in de knooppuntgroep te onderhouden.
    • --max-count: hiermee configureert u de automatische schaalaanpassing van clusters om maximaal drie knooppunten in de knooppuntgroep te onderhouden.

    Notitie

    Taints en VM-grootten kunnen alleen worden ingesteld voor knooppuntgroepen tijdens het maken van de knooppuntgroep, maar u kunt instellingen voor automatische schaalaanpassing op elk gewenst moment bijwerken.

  7. Nu u een knooppuntgroep hebt gemaakt met behulp van de GPU-installatiekopieën, kunt u controleren of uw GPU's kunnen worden geschuleerbaar en een GPU-workload uitvoeren.

Controleer of GPU's kunnen worden gescheerd

Nadat u het cluster hebt gemaakt, controleert u of GPU's beschikbaar zijn in Kubernetes.

  1. Vermeld de knooppunten in uw cluster met behulp van de kubectl get nodes opdracht.

    kubectl get nodes
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Controleer of de GPU's beschikbaar zijn met behulp van de kubectl describe node opdracht.

    kubectl describe node aks-gpunp-28993262-0
    

    Onder de sectie Capaciteit moet de GPU worden weergegeven als nvidia.com/gpu: 1. De uitvoer moet er ongeveer uitzien als in de volgende verkorte voorbeelduitvoer:

    Name:               aks-gpunp-28993262-0
    Roles:              agent
    Labels:             accelerator=nvidia
    
    [...]
    
    Capacity:
    [...]
     nvidia.com/gpu:                 1
    [...]
    

Een workload met GPU uitvoeren

Als u de GPU in actie wilt zien, kunt u een workload met GPU plannen met de juiste resourceaanvraag. In dit voorbeeld voeren we een Tensorflow-taak uit op de MNIST-gegevensset.

  1. Maak een bestand met de naam samples-tf-mnist-demo.yaml en plak het volgende YAML-manifest, dat een resourcelimiet van nvidia.com/gpu: 1:

    Notitie

    Als er een fout optreedt bij het aanroepen van stuurprogramma's, zoals 'CUDA-stuurprogrammaversie is onvoldoende voor de CUDA-runtimeversie', raadpleegt u de compatibiliteitsgrafiek van het NVIDIA-stuurprogramma.

    apiVersion: batch/v1
    kind: Job
    metadata:
      labels:
        app: samples-tf-mnist-demo
      name: samples-tf-mnist-demo
    spec:
      template:
        metadata:
          labels:
            app: samples-tf-mnist-demo
        spec:
          containers:
          - name: samples-tf-mnist-demo
            image: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu
            args: ["--max_steps", "500"]
            imagePullPolicy: IfNotPresent
            resources:
              limits:
               nvidia.com/gpu: 1
          restartPolicy: OnFailure
          tolerations:
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
    
  2. Voer de taak uit met behulp van de kubectl apply opdracht, waarmee het manifestbestand wordt geparseerd en de gedefinieerde Kubernetes-objecten worden gemaakt.

    kubectl apply -f samples-tf-mnist-demo.yaml
    

De status van de workload met GPU weergeven

  1. Controleer de voortgang van de taak met behulp van de kubectl get jobs opdracht met de --watch vlag. Het kan enkele minuten duren voordat de installatiekopie wordt opgehaald en de gegevensset wordt verwerkt.

    kubectl get jobs samples-tf-mnist-demo --watch
    

    Wanneer in de kolom VOLTOOIINGEN 1/1 wordt weergegeven, is de taak voltooid, zoals wordt weergegeven in de volgende voorbeelduitvoer:

    NAME                    COMPLETIONS   DURATION   AGE
    
    samples-tf-mnist-demo   0/1           3m29s      3m29s
    samples-tf-mnist-demo   1/1   3m10s   3m36s
    
  2. Sluit het kubectl --watch proces af met Ctrl-C.

  3. Haal de naam van de pod op met behulp van de kubectl get pods opdracht.

    kubectl get pods --selector app=samples-tf-mnist-demo
    
  4. Bekijk de uitvoer van de workload met GPU-functionaliteit met behulp van de kubectl logs opdracht.

    kubectl logs samples-tf-mnist-demo-smnr6
    

    In de volgende verkorte voorbeelduitvoer van de podlogboeken wordt bevestigd dat het juiste GPU-apparaat, Tesla K80is gedetecteerd:

    2019-05-16 16:08:31.258328: 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
    2019-05-16 16:08:31.396846: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties: 
    name: Tesla K80 major: 3 minor: 7 memoryClockRate(GHz): 0.8235
    pciBusID: 2fd7:00:00.0
    totalMemory: 11.17GiB freeMemory: 11.10GiB
    2019-05-16 16:08:31.396886: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla K80, pci bus id: 2fd7:00:00.0, compute capability: 3.7)
    2019-05-16 16:08:36.076962: 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.1081
    Accuracy at step 10: 0.7457
    Accuracy at step 20: 0.8233
    Accuracy at step 30: 0.8644
    Accuracy at step 40: 0.8848
    Accuracy at step 50: 0.8889
    Accuracy at step 60: 0.8898
    Accuracy at step 70: 0.8979
    Accuracy at step 80: 0.9087
    Accuracy at step 90: 0.9099
    Adding run metadata for 99
    Accuracy at step 100: 0.9125
    Accuracy at step 110: 0.9184
    Accuracy at step 120: 0.922
    Accuracy at step 130: 0.9161
    Accuracy at step 140: 0.9219
    Accuracy at step 150: 0.9151
    Accuracy at step 160: 0.9199
    Accuracy at step 170: 0.9305
    Accuracy at step 180: 0.9251
    Accuracy at step 190: 0.9258
    Adding run metadata for 199
    [...]
    Adding run metadata for 499
    

Container Insights gebruiken om GPU-gebruik te bewaken

Container Insights met AKS bewaakt de volgende metrische gegevens over GPU-gebruik:

Naam van meetwaarde Metrische dimensie (tags) Beschrijving
containerGpuDutyCycle container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName, gpuId, , , gpuModelgpuVendor Percentage van de tijd gedurende de afgelopen voorbeeldperiode (60 seconden) waarin GPU bezig was/actief werd verwerkt voor een container. De dienstcyclus is een getal tussen 1 en 100.
containerGpuLimits container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Elke container kan limieten opgeven als een of meer GPU's. Het is niet mogelijk om een fractie van een GPU aan te vragen of te beperken.
containerGpuRequests container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName Elke container kan een of meer GPU's aanvragen. Het is niet mogelijk om een fractie van een GPU aan te vragen of te beperken.
containerGpumemoryTotalBytes container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName, gpuId, , , gpuModelgpuVendor Hoeveelheid GPU-geheugen in bytes die beschikbaar zijn voor gebruik voor een specifieke container.
containerGpumemoryUsedBytes container.azm.ms/clusterId, , container.azm.ms/clusterNamecontainerName, gpuId, , , gpuModelgpuVendor Hoeveelheid GPU-geheugen in bytes die worden gebruikt door een specifieke container.
nodeGpuAllocatable container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Het aantal GPU's in een knooppunt dat kan worden gebruikt door Kubernetes.
nodeGpuCapacity container.azm.ms/clusterId, , container.azm.ms/clusterNamegpuVendor Totaal aantal GPU's in een knooppunt.

Resources opschonen

  • Verwijder de bijbehorende Kubernetes-objecten die u in dit artikel hebt gemaakt met behulp van de kubectl delete job opdracht.

    kubectl delete jobs samples-tf-mnist-demo
    

Volgende stappen