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 automatische beveiligingspatches niet toegepast. Raadpleeg uw huidige AKS API-versie voor het standaardgedrag van het upgradekanaal van het knooppunt besturingssysteem.
Notitie
Voor AKS API-versie 2023-06-01 of hoger is NodeImage het standaardkanaal voor het upgraden van het knooppuntbesturingssysteem. Voor eerdere versies is het standaardkanaal Geen. 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.
Notitie
Standaard onderhoudt Microsoft automatisch de versie van de NVidia-stuurprogramma's als onderdeel van de implementatie van de knooppuntinstallatiekopie. AKS ondersteunt en beheert deze. Hoewel de NVidia-stuurprogramma's standaard zijn geïnstalleerd op gpu-compatibele knooppunten, moet u de invoegtoepassing voor apparaten installeren.
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.
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.
Maak een naamruimte met behulp van de
kubectl create namespace
opdracht.kubectl create namespace gpu-resources
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: kube-system spec: selector: matchLabels: name: nvidia-device-plugin-ds updateStrategy: type: RollingUpdate template: metadata: labels: name: nvidia-device-plugin-ds spec: tolerations: - key: "sku" operator: "Equal" value: "gpu" effect: "NoSchedule" # 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. # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/ priorityClassName: "system-node-critical" containers: - image: nvcr.io/nvidia/k8s-device-plugin:v0.15.0 name: nvidia-device-plugin-ctr env: - name: FAIL_ON_INIT_ERROR value: "false" 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
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
Nu u de NVIDIA-apparaatinvoegtoepassing hebt geïnstalleerd, kunt u controleren of uw GPU's kunnen worden scheduleerbaar en een GPU-workload uitvoeren.
Installatie van GPU-stuurprogramma overslaan (preview)
Als u de installatie van de NVidia-stuurprogramma's wilt beheren of de NVIDIA GPU-operator wilt gebruiken, kunt u de standaardinstallatie van het GPU-stuurprogramma overslaan. Microsoft biedt geen ondersteuning voor het onderhoud en de compatibiliteit van de NVidia-stuurprogramma's als onderdeel van de implementatie van de knooppuntinstallatiekopie.
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:
Registreer of werk de aks-preview-extensie bij met behulp van de
az extension add
ofaz 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
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.
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.
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.Volg de NVIDIA-documentatie om de GPU-operator te installeren.
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.
Notitie
Er zijn mogelijk extra overwegingen die u moet nemen bij het gebruik van de NVIDIA GPU-operator en het implementeren op SPOT-exemplaren. Zie https://github.com/NVIDIA/gpu-operator/issues/577
De AKS GPU-installatiekopieën gebruiken (preview)
Notitie
De AKS GPU-installatiekopieën (preview) worden op 10 januari 2025 buiten gebruik gesteld. De aangepaste header die hieronder wordt gebruikt, is niet meer beschikbaar, wat betekent dat u geen nieuwe GPU-knooppuntgroepen kunt maken met behulp van de AKS GPU-installatiekopieën. Het is raadzaam om te migreren naar of te gebruiken van de standaard GPU-configuratie in plaats van de toegewezen GPU-installatiekopieën, omdat de toegewezen GPU-installatiekopieën niet meer worden ondersteund. Zie de releaseopmerkingen van AKS of bekijk deze aankondiging voor buitengebruikstelling in onze openbare AKS-roadmap voor meer informatie.
AKS biedt een volledig geconfigureerde AKS-installatiekopie met de NVIDIA-apparaatinvoegtoepassing voor Kubernetes. De AKS GPU-installatiekopie is momenteel alleen beschikbaar op 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:
Installeer de
aks-preview
Azure CLI-extensie met behulp van deaz extension add
opdracht.az extension add --name aks-preview
Werk bij naar de nieuwste versie van de extensie met behulp van de
az extension update
opdracht.az extension update --name aks-preview
Registreer de
GPUDedicatedVHDPreview
functievlag met behulp van deaz feature register
opdracht.az feature register --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven.
Controleer de registratiestatus met behulp van de
az feature show
opdracht.az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"
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.
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.
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.
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
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.
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"
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
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
Sluit het
kubectl --watch
proces af met Ctrl-C.Haal de naam van de pod op met behulp van de
kubectl get pods
opdracht.kubectl get pods --selector app=samples-tf-mnist-demo
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 K80
is 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/clusterName containerName , gpuId , , , gpuModel gpuVendor |
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/clusterName containerName |
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/clusterName containerName |
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/clusterName containerName , gpuId , , , gpuModel gpuVendor |
Hoeveelheid GPU-geheugen in bytes die beschikbaar zijn voor gebruik voor een specifieke container. |
containerGpumemoryUsedBytes | container.azm.ms/clusterId , , container.azm.ms/clusterName containerName , gpuId , , , gpuModel gpuVendor |
Hoeveelheid GPU-geheugen in bytes die worden gebruikt door een specifieke container. |
nodeGpuAllocatable | container.azm.ms/clusterId , , container.azm.ms/clusterName gpuVendor |
Het aantal GPU's in een knooppunt dat kan worden gebruikt door Kubernetes. |
nodeGpuCapacity | container.azm.ms/clusterId , , container.azm.ms/clusterName gpuVendor |
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
- Zie Apache Spark-taken uitvoeren op AKS als u Apache Spark-taken wilt uitvoeren.
- Zie Best practices voor geavanceerde scheduler-functies in AKS voor meer informatie over functies van de Kubernetes-planner.
- Zie voor meer informatie over Azure Kubernetes Service en Azure Machine Learning:
Azure Kubernetes Service