Usare GPU per carichi di lavoro a elevato utilizzo di calcolo
Si applica a: servizio Azure Kubernetes in Azure Stack HCI 22H2, servizio Azure Kubernetes in Windows Server
Le unità di elaborazione grafica (GPU) vengono usate per carichi di lavoro a elevato utilizzo di calcolo, ad esempio Machine Learning, Deep Learning e altro ancora. Questo articolo descrive come usare GPU per carichi di lavoro a elevato utilizzo di calcolo nel servizio Azure Kubernetes abilitato da Azure Arc.
Prima di iniziare
Se si aggiorna il servizio Azure Kubernetes da una versione di anteprima precedente a ottobre 2022 che esegue pool di nodi abilitati per GPU, assicurarsi di rimuovere tutti i cluster del carico di lavoro che eseguono GPU prima di iniziare. Seguire la procedura descritta in questa sezione.
Passaggio 1: Disinstallare il driver host Nvidia
In ogni computer host passare a Pannello di controllo > Installazione applicazioni, disinstallare il driver host NVIDIA, quindi riavviare il computer. Dopo il riavvio del computer, verificare che il driver sia stato disinstallato correttamente. Aprire un terminale PowerShell con privilegi elevati ed eseguire il comando seguente:
Get-PnpDevice | select status, class, friendlyname, instanceid | findstr /i /c:"3d video"
I dispositivi GPU verranno visualizzati in uno stato di errore, come illustrato in questo output di esempio:
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
Passaggio 2: Smontare il driver host dall'host
Quando si disinstalla il driver host, la GPU fisica entra in uno stato di errore. È necessario smontare tutti i dispositivi GPU dall'host.
Per ogni dispositivo GPU (controller video 3D), eseguire i comandi seguenti in PowerShell. Copiare l'ID istanza; ad esempio, PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000
dall'output del comando precedente:
$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
Per verificare che le GPU siano state smontate correttamente dall'host, eseguire il comando seguente. È consigliabile inserire GPU in uno Unknown
stato:
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
Passaggio 3: Scaricare e installare il driver di mitigazione NVIDIA
Il software può includere componenti sviluppati e di proprietà di NVIDIA Corporation o dei suoi licenze. L'uso di questi componenti è disciplinato dal contratto di licenza dell'utente finale NVIDIA.
Vedere la documentazione del data center NVIDIA per scaricare il driver di mitigazione NVIDIA. Dopo aver scaricato il driver, espandere l'archivio e installare il driver di mitigazione in ogni computer host.
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\
Per installare il driver di mitigazione, passare alla cartella contenente i file estratti, fare clic con il pulsante destro del mouse sul file nvidia_azure_stack_T4_base.inf e scegliere Installa. Verificare di avere il driver corretto; Il servizio Azure Kubernetes supporta attualmente solo la GPU NVIDIA Tesla T4.
È anche possibile installare usando la riga di comando passando alla cartella ed eseguendo i comandi seguenti per installare il driver di mitigazione:
pnputil /add-driver nvidia_azure_stack_T4_base.inf /install
pnputil /scan-devices
Dopo aver installato il driver di mitigazione, le GPU vengono elencate nello stato OK in Nvidia T4_base - Smontato:
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
Passaggio 4: Ripetere i passaggi da 1 a 3
Ripetere i passaggi da 1 a 3 per ogni nodo nel cluster di failover.
Importante
Le macchine virtuali abilitate per GPU non vengono aggiunte al clustering di failover in Windows Server 2019, Windows Server 2022 o Azure Stack HCI.
Installare o aggiornare il servizio Azure Kubernetes
Vedere la guida introduttiva al servizio Azure Kubernetes con PowerShell o l'uso di Windows Admin Center per installare o aggiornare il servizio Azure Kubernetes abilitato da Arc.
Create un nuovo cluster del carico di lavoro con un pool di nodi abilitato per GPU
Attualmente, l'uso di pool di nodi abilitati per GPU è disponibile solo per i pool di nodi Linux.
New-AksHciCluster -Name "gpucluster" -nodePoolName "gpunodepool" -nodeCount 2 -osType linux -nodeVmSize Standard_NK6
Dopo aver installato il cluster del carico di lavoro, eseguire il comando seguente per ottenere Kubeconfig:
Get-AksHciCredential -Name gpucluster
Confermare che è possibile pianificare GPU
Dopo aver creato il pool di nodi GPU, verificare che sia possibile pianificare GPU in Kubernetes. Elencare prima di tutto i nodi nel cluster usando il comando kubectl get nodes:
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
Usare ora il comando kubectl describe node per verificare che le GPU possano essere pianificate. Nella sezione Capacità la GPU verrà visualizzata come nvidia.com/gpu: 1.
kubectl describe <node> | findstr "gpu"
L'output dovrebbe visualizzare le GPU dal nodo di lavoro e avere un aspetto simile al seguente:
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
Eseguire un carico di lavoro abilitato per la GPU
Dopo aver completato i passaggi precedenti, creare un nuovo file YAML per il test; ad esempio gpupod.yaml. Copiare e incollare il codice YAML seguente nel nuovo file denominato gpupod.yaml, quindi salvarlo:
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
Eseguire il comando seguente per distribuire l'applicazione di esempio:
kubectl apply -f gpupod.yaml
Verificare che il pod sia stato avviato, completato l'esecuzione e che sia assegnata la GPU:
kubectl describe pod cuda-vector-add | findstr 'gpu'
Il comando precedente dovrebbe mostrare una GPU assegnata:
nvidia.com/gpu: 1
nvidia.com/gpu: 1
Controllare il file di log del pod per verificare se il test è stato superato:
kubectl logs cuda-vector-add
Di seguito è riportato l'output di esempio del comando precedente:
[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
Se viene visualizzato un errore di mancata corrispondenza della versione durante la chiamata ai driver, ad esempio "La versione del driver CUDA non è sufficiente per la versione del runtime CUDA", esaminare il grafico di compatibilità della matrice di driver NVIDIA.
Domande frequenti
Cosa accade durante l'aggiornamento di un pool di nodi abilitato per GPU?
L'aggiornamento dei pool di nodi abilitati per GPU segue lo stesso modello di aggiornamento in sequenza usato per i pool di nodi normali. Affinché i pool di nodi abilitati per GPU in una nuova macchina virtuale vengano creati correttamente nel computer host fisico, è necessario che una o più GPU fisiche siano disponibili per l'assegnazione corretta del dispositivo. Questa disponibilità garantisce che le applicazioni possano continuare a essere in esecuzione quando Kubernetes pianifica i pod in questo nodo aggiornato.
Prima dell'aggiornamento:
- Pianificare i tempi di inattività durante l'aggiornamento.
- Se si esegue il Standard_NK6 o 2 GPU aggiuntive se si esegue Standard_NK12, è disponibile una GPU aggiuntiva per ogni host fisico. Se si esegue con capacità completa e non si dispone di una GPU aggiuntiva, è consigliabile ridurre il pool di nodi a un singolo nodo prima dell'aggiornamento, quindi aumentare le prestazioni dopo l'aggiornamento.
Cosa accade se non si dispone di GPU fisiche aggiuntive nel computer fisico durante un aggiornamento?
Se un aggiornamento viene attivato in un cluster senza risorse GPU aggiuntive per facilitare l'aggiornamento in sequenza, il processo di aggiornamento si blocca fino a quando non è disponibile una GPU. Se si esegue con capacità completa e non si dispone di una GPU aggiuntiva, è consigliabile ridurre il pool di nodi a un singolo nodo prima dell'aggiornamento, quindi aumentare le prestazioni dopo l'aggiornamento.