Condividi tramite


Usare le GPU di Windows per carichi di lavoro a elevato utilizzo di calcolo nel servizio Azure Kubernetes (anteprima)

Le unità di elaborazione grafica (GPU) sono spesso usate per carichi di lavoro a elevato utilizzo di calcolo, ad esempio i carichi di lavoro di visualizzazione o di grafica. Il servizio Azure Kubernetes supporta i pool di nodi Windows e Linux per eseguire carichi di lavoro Kubernetes a elevato utilizzo di calcolo.

Questo articolo illustra come effettuare il provisioning di nodi Windows con GPU pianificabili in cluster del servizio Azure Kubernetes nuovi ed esistenti (anteprima).

Macchine virtuali abilitate per GPU supportate

Per visualizzare le macchine virtuali abilitate per GPU supportate, vedere Dimensioni delle macchine virtuali ottimizzate per la GPU in Azure. Per i pool del nodo del servizio Azure Kubernetes è consigliabile una dimensione minima di Standard_NC6s_v3. La serie NVv4 (basata sulle GPU AMD) non è supportata nel servizio Azure Kubernetes.

Nota

Le macchine virtuali abilitate per la GPU contengono hardware specializzato soggetto a prezzi maggiori e alla disponibilità regionale. Per altre informazioni, vedere il calcolatore dei prezzi e la disponibilità a livello di area.

Limiti

  • L'aggiornamento di un pool di nodi Windows esistente per aggiungere GPU non è supportato.
  • Non supportato in Kubernetes versione 1.28 e successive.

Operazioni preliminari

  • Questo articolo presuppone che sia presente un cluster del servizio Azure Kubernetes esistente. Se non si ha un cluster, crearne uno usando l'interfaccia della riga di comando di Azure, Azure PowerShello il portale di Azure.
  • È necessaria l'interfaccia della riga di comando di Azure versione 1.0.0b2 o successiva installata e configurata per usare il campo --skip-gpu-driver-install con il comando az aks nodepool add. Eseguire az --version per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.
  • È necessaria l'interfaccia della riga di comando di Azure versione 9.0.0b5 o successiva installata e configurata per usare il --driver-type campo con il az aks nodepool add comando . Eseguire az --version per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.

Ottenere le credenziali per il cluster

  • Ottenere le credenziali per il cluster del servizio Azure Kubernetes usando il comando az aks get-credentials. Il comando di esempio seguente ottiene le credenziali per myAKSCluster nel gruppo di risorse myResourceGroup:

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

Uso di GPU Windows con l'installazione automatica dei driver

L'uso di GPU NVIDIA prevede l'installazione di vari componenti software NVIDIA, ad esempio il plug-in del dispositivo NVIDIA per Kubernetes, l'installazione del driver GPU e altro ancora. Quando si crea un pool di nodi Windows con una macchina virtuale abilitata per la GPU supportata, questi componenti e i driver NVIDIA CUDA o GRID appropriati vengono installati. Per le dimensioni delle macchine virtuali serie NC e ND, viene installato il driver CUDA. Per le dimensioni delle macchine virtuali della serie NV, viene installato il driver GRID.

Importante

Le funzionalità di anteprima del servizio Azure Kubernetes sono disponibili in modalità self-service e opzionale. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:

Installare l'estensione aks-preview dell'interfaccia della riga di comando di Azure.

  • Registrare o aggiornare l'estensione aks-preview usando il comando az extension add o az extension update.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

Registrare il flag di funzionalità WindowsGPUPreview

  1. Registrare il flag di funzionalità WindowsGPUPreview usando il comando az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    

    Sono necessari alcuni minuti per visualizzare lo stato Registered.

  2. Verificare lo stato della registrazione usando il comando az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    
  3. Quando lo stato riflette Registrato, aggiornare la registrazione del provider di risorse Microsoft.ContainerService usando il comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Creare un pool di nodi abilitato per GPU Windows (anteprima)

Per creare un pool di nodi abilitato per GPU Windows, è necessario usare una dimensione di macchina virtuale abilitata per la GPU supportata e specificare os-type come Windows. Il valore predefinito di Windows os-sku è Windows2022, ma tutte le opzioni di Windows os-sku sono supportate.

  1. Creare un pool di nodi abilitato per GPU Windows usando il comando az aks nodepool add.

    az aks nodepool add \
       --resource-group myResourceGroup \
       --cluster-name myAKSCluster \
       --name gpunp \
       --node-count 1 \
       --os-type Windows \
       --kubernetes-version 1.29.0 \
       --node-vm-size Standard_NC6s_v3
    
  2. Verificare che le GPU siano pianificabili.

  3. Dopo aver verificato che le GPU sono pianificabili, è possibile eseguire il carico di lavoro GPU.

Specificare il tipo di driver GPU (anteprima)

Per impostazione predefinita, il servizio Azure Kubernetes specifica un tipo di driver GPU predefinito per ogni macchina virtuale abilitata per la GPU supportata. Poiché la compatibilità dei carichi di lavoro e dei driver è importante per i carichi di lavoro GPU funzionanti, è possibile specificare il tipo di driver per il nodo GPU di Windows. Questa funzionalità non è supportata per i pool di nodi GPU Linux.

Quando si crea un pool di agenti Windows con supporto GPU, è possibile specificare il tipo di driver GPU usando il --driver-type flag .

Le opzioni disponibili sono:

  • GRID: per le applicazioni che richiedono il supporto della virtualizzazione.
  • CUDA: ottimizzato per le attività di calcolo in applicazioni scientifiche e a elevato utilizzo di dati.

Nota

Quando si imposta il --driver-type flag, si assume la responsabilità di assicurarsi che il tipo di driver selezionato sia compatibile con le dimensioni e la configurazione specifiche della macchina virtuale del pool di nodi. Mentre il servizio Azure Kubernetes tenta di convalidare la compatibilità, esistono scenari in cui la creazione del pool di nodi potrebbe non riuscire a causa di incompatibilità tra il tipo di driver specificato e la macchina virtuale o l'hardware sottostante.

Per creare un pool di nodi abilitato per Windows GPU con un tipo di driver GPU specifico, usare il az aks nodepool add comando .

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name gpunp \
    --node-count 1 \
    --os-type Windows \
    --kubernetes-version 1.29.0 \
    --node-vm-size Standard_NC6s_v3 \
    --driver-type GRID

Ad esempio, il comando precedente crea un pool di nodi abilitato per GPU usando il GRID tipo di driver GPU. Se si seleziona questo tipo di driver, viene eseguito l'override del valore predefinito del tipo di driver per gli SKU della CUDA macchina virtuale della serie NC.

Uso di GPU Windows con l'installazione manuale del driver

Quando si crea un pool di nodi Windows con dimensioni di macchine virtuali NVIDIA GPU (N) nel servizio Azure Kubernetes, il driver GPU e il plug-in del dispositivo DirectX Kubernetes vengono installati automaticamente. Per ignorare questa installazione automatica, seguire questa procedura:

  1. Ignorare l'installazione del driver GPU (anteprima) usando --skip-gpu-driver-install.
  2. Installazione manuale del plug-in del dispositivo DirectX Kubernetes.

Ignorare l'installazione del driver GPU (anteprima)

Il servizio Azure Kubernetes ha l'installazione automatica del driver GPU abilitata per impostazione predefinita. In alcuni casi, ad esempio l'installazione di driver personalizzati, è possibile ignorare l'installazione del driver GPU.

Importante

Le funzionalità di anteprima del servizio Azure Kubernetes sono disponibili in modalità self-service e opzionale. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:

  1. Registrare o aggiornare l'estensione aks-preview usando il comando az extension add o az extension update.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Creare un pool di nodi usando il comando az aks nodepool add con il flag --skip-gpu-driver-install per ignorare l'installazione automatica del driver GPU.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022 \
        --skip-gpu-driver-install
    

Nota

Se l'oggetto --node-vm-size in uso non è ancora stato caricato nel servizio Azure Kubernetes, non è possibile usare GPU e --skip-gpu-driver-install non funziona.

Installare manualmente il plug-in del dispositivo DirectX Kubernetes

È possibile distribuire un DaemonSet per il plug-in del dispositivo DirectX Kubernetes, che esegue un pod in ogni nodo per fornire i driver necessari per le GPU.

  • Aggiungere un pool di nodi al cluster usando il comando az aks nodepool add.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022
    

Creare uno spazio dei nomi e distribuire il plug-in del dispositivo DirectX Kubernetes

  1. Creare uno spazio dei nomi usando il comando kubectl create namespace.

    kubectl create namespace gpu-resources
    
  2. Creare un file denominato k8s-directx-device-plugin.yaml e incollare il manifesto YAML seguente fornito come parte del plugin del dispositivo NVIDIA per il progetto Kubernetes:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nvidia-device-plugin-daemonset
      namespace: gpu-resources
    spec:
      selector:
        matchLabels:
          name: nvidia-device-plugin-ds
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          # 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.  This annotation works in tandem with the toleration below.
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          # Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
          # This, along with the annotation above marks this pod as a critical add-on.
          - key: CriticalAddonsOnly
            operator: Exists
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          containers:
          - image: mcr.microsoft.com/oss/nvidia/k8s-device-plugin:v0.14.1
            name: nvidia-device-plugin-ctr
            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
    
  3. Creare il DaemonSet e verificare che il plug-in del dispositivo NVIDIA sia stato creato correttamente usando il comando kubectl apply.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Dopo aver installato correttamente il plug-in del dispositivo NVIDIA, è possibile verificare che le GPU siano pianificabili.

Verificare che le GPU siano pianificabili

Dopo aver creato il cluster, verificare che le GPU siano pianificabili in Kubernetes.

  1. Elencare i nodi nel cluster usando il comando kubectl get nodes.

    kubectl get nodes
    

    L'output dovrebbe essere simile all'esempio di output seguente:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Verificare che le GPU siano pianificabili usando il comando kubectl describe node.

    kubectl describe node aks-gpunp-28993262-0
    

    Nella sezione Capacity (Capacità) la GPU deve comparire in elenco come microsoft.com/directx: 1. L'output dovrebbe essere simile all'output di esempio condensato seguente:

    Capacity:
    [...]
     microsoft.com.directx/gpu:                 1
    [...]
    

Usare Informazioni dettagliate sul contenitore per monitorare l'utilizzo della GPU

Informazioni dettagliate sui contenitori con servizio Azure Kubernetes monitora le metriche di utilizzo della GPU seguenti:

Nome metrica Dimensione metrica (tag) Descrizione
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModelgpuVendor Percentuale di tempo nel periodo di campionamento precedente (60 secondi) durante il quale la GPU è stata occupata/attivamente l'elaborazione per un contenitore. Il ciclo di servizio è un numero compreso tra 1 e 100.
containerGpuLimits container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Ogni contenitore può specificare limiti come una o più GPU. Non è possibile richiedere o limitare una frazione di una GPU.
containerGpuRequests container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Ogni contenitore può richiedere una o più GPU. Non è possibile richiedere o limitare una frazione di una GPU.
containerGpumemoryTotalBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModelgpuVendor Quantità di memoria GPU in byte disponibili per l'uso per un contenitore specifico.
containerGpumemoryUsedBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModelgpuVendor Quantità di memoria GPU in byte usati da un contenitore specifico.
nodeGpuAllocatable container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Numero di GPU in un nodo che Kubernetes può usare.
nodeGpuCapacity container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Numero totale di GPU in un nodo.

Pulire le risorse

  • Rimuovere gli oggetti Kubernetes associati creati in questo articolo usando il comando kubectl delete job.

    kubectl delete jobs windows-gpu-workload
    

Passaggi successivi