Condividi tramite


Usare GPU per carichi di lavoro a elevato utilizzo di calcolo in Azure Kubernetes Service su Azure Local

Si applica a: AKS locale su Azure

Nota

Per informazioni sulle GPU nel servizio Azure Kubernetes in Windows Server, vedere Usare GPU nel servizio Azure Kubernetes in Windows Server.

Le unità di elaborazione grafica (GPU) sono utili 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.

Modelli GPU supportati

I seguenti modelli di GPU sono supportati da AKS su Azure Locale. Si noti che le GPU sono supportate solo nei pool di nodi del sistema operativo Linux. Le GPU non sono supportate nei pool di nodi del sistema operativo Windows.

Fabbricante Modello GPU Versione supportata
NVidia A2 2311.2
NVidia A16 2402.0
NVidia T4 2408.0
NVidia L4 2512.0
NVidia L40 2512.0
NVidia L40S 2512.0

Dimensioni delle macchine virtuali GPU supportate

Le dimensioni di VM seguenti per ogni modello GPU sono supportate da AKS su Azure Locale.

Nvidia T4 è supportato dagli SKU NK T4

Dimensioni macchina virtuale GPU (unità di elaborazione grafica) Memoria GPU: GiB Unità di elaborazione virtuale (vCPU) Memoria: GiB
Standard_NK6 1 8 6 12
Standard_NK12 2 16 12 24

Nvidia A2 è supportato dagli SKU NC2 A2

Dimensioni macchina virtuale GPU (unità di elaborazione grafica) Memoria GPU: GiB Unità di elaborazione virtuale (vCPU) Memoria: GiB
Standard_NC4_A2 1 16 4 8
Standard_NC8_A2 1 16 8 16
Standard_NC16_A2 2 32 16 64
Standard_NC32_A2 2 32 32 128

Nvidia A16 è supportato dagli SKU NC2 A16

Dimensioni macchina virtuale GPU (unità di elaborazione grafica) Memoria GPU: GiB Unità di elaborazione virtuale (vCPU) Memoria: GiB
Standard_NC4_A16 1 16 4 8
Standard_NC8_A16 1 16 8 16
Standard_NC16_A16 2 32 16 64
Standard_NC32_A16 2 32 32 128

Nvidia L4 è supportato dagli SKU NC2 L4 (anteprima)

Dimensioni macchina virtuale GPU (unità di elaborazione grafica) Memoria GPU: GiB Unità di elaborazione virtuale (vCPU) Memoria: GiB
Standard_NC16_L4_1 1 24 16 64
Standard_NC16_L4_2 2 48 16 64
Standard_NC32_L4_1 1 24 32 128
Standard_NC32_L4_2 2 48 32 128

Nvidia L40 è supportato dagli SKU NC2 L40 (anteprima)

Dimensioni macchina virtuale GPU (unità di elaborazione grafica) Memoria GPU: GiB Unità di elaborazione virtuale (vCPU) Memoria: GiB
Standard_NC16_L40_1 1 48 16 64
Standard_NC16_L40_2 2 96 16 64
Standard_NC32_L40_1 1 48 32 128
Standard_NC32_L40_2 2 96 32 128

Nvidia L40S è supportato dagli SKU NC2 L40S (anteprima)

Dimensioni macchina virtuale GPU (unità di elaborazione grafica) Memoria GPU: GiB Unità di elaborazione virtuale (vCPU) Memoria: GiB
Standard_NC16_L40S_1 1 48 16 64
Standard_NC16_L40S_2 2 96 16 64
Standard_NC32_L40S_1 1 48 32 128
Standard_NC32_L40S_2 2 96 32 128

Operazioni preliminari

Per usare GPU in AKS Arc, assicurarsi di installare i driver GPU necessari prima di iniziare la distribuzione del cluster. Seguire i passaggi descritti in questa sezione.

Passaggio 1: installare il sistema operativo

Installare il sistema operativo locale di Azure in locale in ogni server del cluster locale di Azure.

Passaggio 2: disinstallare il driver host NVIDIA

In ogni computer host passare a Pannello > di controllo Aggiungi o Rimuovi programmi, 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 | where {$_.friendlyname -eq "3D Video Controller"}

I dispositivi GPU dovrebbero essere 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 3: Disinstallare 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 (3D Video Controller), 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. Le GPU dovrebbero essere visualizzate nello stato Unknown.

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -eq "3D Video Controller"}
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 4: Scaricare e installare il driver di mitigazione NVIDIA

Il software potrebbe 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. È possibile seguire questo script di PowerShell per scaricare il driver di mitigazione ed estrarlo:

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 e selezionare il file del driver GPU in base al tipo di GPU effettivo installato negli host locali di Azure. Ad esempio, se il tipo è A2 GPU, fare clic con il pulsante destro del mouse sul file nvidia_azure_stack_A2_base.inf e scegliere Installa.

È anche possibile installare il driver di mitigazione eseguendo i comandi seguenti dalla riga di comando:

pnputil /add-driver nvidia_azure_stack_A2_base.inf /install 
pnputil /scan-devices 

Dopo aver installato il driver di mitigazione, le GPU vengono elencate nello stato OK in Nvidia A2_base - Smontato:

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -match "Nvidia"}"
OK       Nvidia A2_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia A2_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

Passaggio 5: ripetere i passaggi da 1 a 4

Ripetere i passaggi da 1 a 4 per ogni server nel cluster locale di Azure.

Passaggio 6: continuare la distribuzione del cluster locale di Azure

Continuare la distribuzione del cluster locale di Azure seguendo la procedura descritta in Distribuzione locale di Azure.

Ottenere un elenco degli SKU di macchine virtuali abilitati per GPU disponibili

Al termine della distribuzione del cluster locale di Azure, eseguire il comando seguente dell'interfaccia della riga di comando per visualizzare gli SKU di macchina virtuale disponibili nella distribuzione. Se si installano correttamente i driver GPU, il comando elenca gli SKU di VM GPU corrispondenti:

az aksarc vmsize list --custom-location <custom location ID> -g <resource group name>

Creare un nuovo cluster del carico di lavoro con un pool di nodi abilitato per GPU

Attualmente, è possibile usare solo pool di nodi abilitati per GPU per i pool di nodi Linux. Per creare un nuovo cluster Kubernetes:

az aksarc create -n <aks cluster name> -g <resource group name> --custom-location <custom location ID> --vnet-ids <vnet ID>

L'esempio seguente aggiunge un pool di nodi con due nodi abilitati per GPU (NVIDIA A2) con uno SKU di macchina virtuale Standard_NC4_A2 :

az aksarc nodepool add --cluster-name <aks cluster name> -n <node pool name> -g <resource group name> --node-count 2 --node-vm-size Standard_NC4_A2 --os-type Linux

Confermare di poter pianificare le 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 sia possibile pianificare le GPU. Nella sezione Capacità la GPU viene visualizzata come nvidia.com/gpu: 1.

kubectl describe <node> | findstr "gpu" 

L'output visualizza le GPU dal nodo di lavoro e ha un aspetto simile all'esempio seguente:

Capacity: 
  cpu:                4 
  ephemeral-storage:  103110508Ki 
  hugepages-1Gi:      0 
  hugepages-2Mi:      0 
  memory:             7865020Ki 
  nvidia.com/gpu:     1 
  pods:               110

Eseguire un carico di lavoro supportato da 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, che abbia completato l'esecuzione e che la GPU sia assegnata.

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 a driver, ad esempio "La versione del driver CUDA non è sufficiente per la versione del runtime CUDA", vedere 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é l'aggiornamento abbia esito positivo, Kubernetes deve creare nuove macchine virtuali nel computer host fisico con una o più GPU fisiche disponibili per l'assegnazione del dispositivo. Questa disponibilità garantisce che le applicazioni possano continuare a essere in esecuzione quando Kubernetes pianifica i pod in questo nodo aggiornato.

Prima di eseguire l'aggiornamento:

  1. Pianificare tempi di inattività durante l'aggiornamento.
  2. Se stai eseguendo il Standard_NK6, dovresti avere una GPU aggiuntiva per ogni host fisico; se stai eseguendo Standard_NK12, dovresti avere due GPU aggiuntive. Se si esegue con capacità completa e non si dispone di una GPU aggiuntiva, ridurre il pool di nodi a un singolo nodo prima dell'aggiornamento, quindi aumentare le prestazioni dopo l'aggiornamento.

Cosa accade se non sono presenti GPU fisiche aggiuntive nel computer fisico durante un aggiornamento?

Se si attiva un aggiornamento 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, ridurre il pool di nodi a un singolo nodo prima dell'aggiornamento, quindi aumentare le prestazioni dopo che l'aggiornamento ha esito positivo.

Passaggi successivi