Verwenden von GPUs für rechenintensive Workloads
Gilt für: AKS auf Azure Local 22H2, AKS unter Windows Server
Grafische Verarbeitungseinheiten (GPU) werden für rechenintensive Workloads wie Machine Learning, Deep Learning und vieles mehr verwendet. In diesem Artikel wird beschrieben, wie Sie GPUs für rechenintensive Workloads in AKS verwenden, die durch Azure Arc aktiviert werden.
Bevor Sie beginnen
Wenn Sie AKS aus einer Vorschauversion aktualisieren, die älter als Oktober 2022 ist und GPU-fähige Knotenpools ausführt, stellen Sie sicher, dass Sie alle Workloadcluster entfernen, die GPUs ausführen, bevor Sie beginnen. Führen Sie die Schritte in diesem Abschnitt aus.
Schritt 1: Deinstallieren des Nvidia-Hosttreibers
Navigieren Sie auf jedem Hostcomputer zu Systemsteuerung, > Programme hinzufügen/entfernen, deinstallieren Sie den NVIDIA-Hosttreiber, und starten Sie anschließend den Computer neu. Vergewissern Sie sich nach dem Neustart des Computers, dass der Treiber erfolgreich deinstalliert wurde. Öffnen Sie ein PowerShell-Terminal mit erhöhten Rechten, und führen Sie den folgenden Befehl aus:
Get-PnpDevice | select status, class, friendlyname, instanceid | findstr /i /c:"3d video"
Sie sollten sehen, dass sich die GPU-Geräte in einem Fehlerstatus befinden, wie in dieser Beispielausgabe gezeigt:
Error 3D Video Controller PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000
Error 3D Video Controller PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000
Schritt 2: Entfernen Sie den Host-Treiber vom Host
Wenn Sie den Hosttreiber deinstallieren, wechselt die physische GPU in einen Fehlerzustand. Sie müssen alle GPU-Geräte vom Host abmelden.
Führen Sie für jedes GPU-Gerät (3D-Videocontroller) die folgenden Befehle in PowerShell aus. Kopieren Sie die Instanz-ID; Beispiel: PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000
aus der vorherigen Befehlsausgabe:
$id1 = "<Copy and paste GPU instance id into this string>"
$lp1 = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceId $id1).Data[0]
Disable-PnpDevice -InstanceId $id1 -Confirm:$false
Dismount-VMHostAssignableDevice -LocationPath $lp1 -Force
Führen Sie den folgenden Befehl aus, um zu bestätigen, dass die GPUs ordnungsgemäß vom Host getrennt wurden. Sie sollten GPUs in den Zustand Unknown
versetzen.
Get-PnpDevice | select status, class, friendlyname, instanceid | findstr /i /c:"3d video"
Unknown 3D Video Controller PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000
Unknown 3D Video Controller PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000
Schritt 3: Laden Sie den NVIDIA-Behebungstreiber herunter und installieren Sie ihn
Die Software kann Komponenten enthalten, die im Besitz der NVIDIA Corporation oder ihrer Lizenzgeber sind. Die Verwendung dieser Komponenten unterliegt dem NVIDIA Endbenutzer-Lizenzvertrag.
In der NVIDIA Data Center Dokumentation können Sie den NVIDIA-Behebungstreiber herunterladen. Erweitern Sie nach dem Herunterladen des Treibers das Archiv und installieren Sie den Behebungstreiber auf jeder Maschine des Hosts.
Invoke-WebRequest -Uri "https://docs.nvidia.com/datacenter/tesla/gpu-passthrough/nvidia_azure_stack_inf_v2022.10.13_public.zip" -OutFile "nvidia_azure_stack_inf_v2022.10.13_public.zip"
mkdir nvidia-mitigation-driver
Expand-Archive .\nvidia_azure_stack_inf_v2022.10.13_public.zip .\nvidia-mitigation-driver\
Um den Behebungstreiber zu installieren, navigieren Sie zu dem Ordner, der die extrahierten Dateien enthält, klicken Sie mit der rechten Maustaste auf die Datei nvidia_azure_stack_T4_base.inf und wählen Sie Installieren. Überprüfen Sie, ob Sie über den richtigen Treiber verfügen; AKS unterstützt derzeit nur die NVIDIA Tesla T4 GPU.
Sie können die Installation auch über die Befehlszeile durchführen, indem Sie zum Ordner navigieren und die folgenden Befehle ausführen, um den Entschärfungstreiber zu installieren:
pnputil /add-driver nvidia_azure_stack_T4_base.inf /install
pnputil /scan-devices
Nachdem Sie den Behebungstreiber installiert haben, werden die GPUs im Status OK unter Nvidia T4_base – Dismounted aufgeführt:
Get-PnpDevice | select status, class, friendlyname, instanceid | findstr /i /c:"nvidia"
OK Nvidia T4_base - Dismounted PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000
OK Nvidia T4_base - Dismounted PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000
Schritt 4: Wiederholen Sie die Schritte 1 bis 3.
Wiederholen Sie die Schritte 1 bis 3 für jeden Knoten in Ihrem Failover-Cluster.
Wichtig
GPU-fähige virtuelle Computer werden nicht zum Failoverclustering in Windows Server 2019, Windows Server 2022 oder Azure Local hinzugefügt.
Installieren oder Aktualisieren von AKS
Sehen Sie sich den AKS-Schnellstart mit PowerShell oder mit Windows Admin Center an, um AKS, das von Arc aktiviert wird, zu installieren oder zu aktualisieren.
Erstellen eines neuen Workloadclusters mit einem GPU-fähigen Knotenpool
Derzeit ist die Verwendung von GPU-fähigen Knotenpools nur für Linux-Knotenpools verfügbar.
New-AksHciCluster -Name "gpucluster" -nodePoolName "gpunodepool" -nodeCount 2 -osType linux -nodeVmSize Standard_NK6
Führen Sie nach der Installation des Workloadclusters den folgenden Befehl aus, um Ihre Kubeconfig abzurufen:
Get-AksHciCredential -Name gpucluster
Bestätigen der Planbarkeit von GPUs
Vergewissern Sie sich bei der Erstellung Ihres GPU-Knotenpools, dass Sie GPUs in Kubernetes planen können. Listen Sie zunächst die Knoten in Ihrem Cluster mit dem Befehl kubectl get nodes auf:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
moc-l9qz36vtxzj Ready control-plane,master 6m14s v1.22.6
moc-lhbkqoncefu Ready <none> 3m19s v1.22.6
moc-li87udi8l9s Ready <none> 3m5s v1.22.6
Verwenden Sie nun den Befehl kubectl describe node, um zu bestätigen, dass die GPUs geplant werden können. Unter dem Abschnitt Kapazität sollte die GPU als nvidia.com/gpu: 1 erscheinen.
kubectl describe <node> | findstr "gpu"
Der Bildschirm sollte die GPU(s) des Knotens der Arbeitskraft anzeigen und in etwa so aussehen:
nvidia.com/gpu.compute.major=7
nvidia.com/gpu.compute.minor=5
nvidia.com/gpu.count=1
nvidia.com/gpu.family=turing
nvidia.com/gpu.machine=Virtual-Machine
nvidia.com/gpu.memory=16384
nvidia.com/gpu.product=Tesla-T4
Annotations: cluster.x-k8s.io/cluster-name: gpucluster
cluster.x-k8s.io/machine: gpunodepool-md-58d9b96dd9-vsdbl
cluster.x-k8s.io/owner-name: gpunodepool-md-58d9b96dd9
nvidia.com/gpu: 1
nvidia.com/gpu: 1
ProviderID: moc://gpunodepool-97d9f5667-49lt4
kube-system gpu-feature-discovery-gd62h 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7m1s
nvidia.com/gpu 0 0
Ausführen einer GPU-fähigen Workload
Nachdem Sie die vorherigen Schritte ausgeführt haben, erstellen Sie eine neue YAML-Datei zum Testen. beispiel: gpupod.yaml. Kopieren Sie die folgende YAML-Datei, und fügen Sie sie in die neue Datei mit dem Namen gpupod.yamlein, und speichern Sie sie:
apiVersion: v1
kind: Pod
metadata:
name: cuda-vector-add
spec:
restartPolicy: OnFailure
containers:
- name: cuda-vector-add
image: "k8s.gcr.io/cuda-vector-add:v0.1"
resources:
limits:
nvidia.com/gpu: 1
Führen Sie den folgenden Befehl aus, um die Beispielanwendung bereitzustellen:
kubectl apply -f gpupod.yaml
Überprüfen Sie, ob der Pod gestartet und ausgeführt wurde und ob die GPU zugewiesen ist:
kubectl describe pod cuda-vector-add | findstr 'gpu'
Der vorherige Befehl sollte eine zugewiesene GPU anzeigen.
nvidia.com/gpu: 1
nvidia.com/gpu: 1
Überprüfen Sie die Protokolldatei des Pods, um festzustellen, ob der Test bestanden hat:
kubectl logs cuda-vector-add
Nachfolgend finden Sie eine Beispielausgabe des vorherigen Befehls.
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done
Wenn Sie beim Aufrufen von Treibern einen Versionsfehler erhalten, wie z. B. "Die CUDA Treiberversion ist unzureichend für die CUDA Runtime Version", sehen Sie sich die NVIDIA Treibermatrix-Kompatibilitätstabelle an.
Häufig gestellte Fragen
Was geschieht während des Upgrades eines GPU-fähigen Knotenpools?
Das Upgrade von GPU-fähigen Knotenpools folgt dem gleichen rollierenden Upgrademuster, das für normale Knotenpools verwendet wird. Damit GPU-fähige Knotenpools in einer neuen VM erfolgreich erstellt werden können, erfordert dies, dass mindestens eine physische GPU für eine erfolgreiche Gerätezuweisung verfügbar ist. Diese Verfügbarkeit stellt sicher, dass Ihre Anwendungen weiterhin ausgeführt werden können, wenn Kubernetes Pods auf diesem aktualisierten Knoten einplant.
Vor dem Upgrade:
- Planen Sie ausfallzeiten während des Upgrades.
- Haben Sie eine zusätzliche GPU pro physischem Host, wenn Sie Standard_NK6 verwenden, oder 2 zusätzliche GPUs, wenn Sie Standard_NK12verwenden. Wenn Ihre Ressourcen vollständig ausgelastet sind und Sie über keine zusätzliche GPU verfügen, empfehlen wir, den Knotenpool vor dem Upgrade auf einen einzelnen Knoten zu reduzieren und ihn nach erfolgreichem Upgrade wieder zu vergrößern.
Was geschieht, wenn ich während eines Upgrades keine zusätzlichen physischen GPUs auf meinem physischen Computer habe?
Wenn ein Upgrade auf einem Cluster ohne zusätzliche GPU-Ressourcen ausgelöst wird, um das rollierende Upgrade zu erleichtern, hängt der Upgradevorgang, bis eine GPU verfügbar ist. Wenn Sie bei voller Auslastung arbeiten und nicht über eine zusätzliche GPU verfügen, empfehlen wir, den Knotenpool vor dem Upgrade auf einen einzelnen Knoten zu skalieren und ihn nach dem erfolgreichen Upgrade wieder zu skalieren.