Usare GPU per carichi di lavoro con utilizzo intensivo di calcolo (servizio Azure Kubernetes in Azure Stack HCI 23H2)

Si applica a: Azure Stack HCI, versione 23H2

Nota

Per informazioni sulle GPU in Azure Stack HCI 22H2, vedere Usare GPU (HCI 22H2).

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 con utilizzo intensivo di calcolo nel servizio Azure Kubernetes abilitato da Azure Arc.

Modelli GPU supportati

I modelli GPU seguenti sono supportati dal servizio Azure Kubernetes in Azure Stack HCI 23H2:

Produttore Modello GPU Versione supportata
Nvidia A2 2311.2
Nvidia A16 2402.0

Dimensioni delle macchine virtuali supportate

Le dimensioni della macchina virtuale seguenti per ogni modello GPU sono supportate dal servizio Azure Kubernetes in Azure Stack HCI 23H2.

Nvidia A2 è supportato dagli SKU NC2 A2

Dimensioni macchina virtuale GPU Memoria GPU: GiB vCPU Memoria: GiB
Standard_NC4_A2 1 16 4 8
Standard_NC8_A2 1 16 8 16
Standard_NC16_A2 2 48 16 64
Standard_NC32_A2 2 48 32 28

Nvidia A16 è supportato dagli SKU NC2 A16

Dimensioni macchina virtuale GPU Memoria GPU: GiB vCPU Memoria: GiB
Standard_NC4_A16 1 16 4 8
Standard_NC8_A16 1 16 8 16
Standard_NC16_A16 2 48 16 64
Standard_NC32_A16 2 48 32 28

Prima di iniziare

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

Passaggio 1: installare il sistema operativo

Installare il sistema operativo Azure Stack HCI versione 23H2 in locale in ogni server nel cluster Azure Stack HCI.

Passaggio 2: scaricare e installare il driver di mitigazione NVIDIA

Il software può includere componenti sviluppati e di proprietà di NVIDIA Corporation o dei suoi concessori. L'uso di questi componenti è disciplinato dal contratto di licenza dell'utente finale NVIDIA.

Per scaricare il driver di mitigazione NVIDIA, vedere la documentazione del data center 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 e selezionare il file del driver GPU in base al tipo di GPU effettivo installato negli host azure Stack HCI. 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 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_A2_base.inf /install 
pnputil /scan-devices 

Dopo aver installato il driver di mitigazione, le GPU sono elencate nello stato OK in NvidiaA2_base - Smontato:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"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 3: ripetere i passaggi 1 e 2

Ripetere i passaggi 1 e 2 per ogni server nel cluster HCI.

Passaggio 4: continuare la distribuzione del cluster Azure Stack HCI

Continuare la distribuzione del cluster HCI di Azure Stack seguendo la procedura descritta nella distribuzione di Azure Stack HCI, versione 23H2.

Ottenere un elenco di SKU di macchine virtuali abilitate per LA GPU disponibili

Al termine della distribuzione del cluster Azure Stack HCI, è possibile eseguire il comando seguente dell'interfaccia della riga di comando per visualizzare gli SKU di VM disponibili nella distribuzione. Se i driver GPU sono installati correttamente, sono elencati gli SKU delle 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, l'uso dei pool di nodi abilitati per GPU è disponibile solo 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>

Nell'esempio seguente viene aggiunto un pool di nodi con 2 nodi abilitati per GPU (NVDIA 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

Verificare che sia possibile pianificare LE GPU

Con il pool di nodi GPU creato, 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:

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 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:

  1. Pianificare i tempi di inattività durante l'aggiornamento.
  2. 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.

Passaggi successivi