Autoskalning av GPU-arbetsbelastningar i AKS med DCGM-mått och KEDA

I den här artikeln får du lära dig hur du autoskalar GPU-arbetsbelastningar på Azure Kubernetes Service (AKS) med hjälp av GPU-mått som samlats in av NVIDIA Data Center GPU Manager-exportören (DCGM). Dessa mått exponeras via Azure Managed Prometheus och används av Kubernetes Event-Driven Autoscaling (KEDA) för att automatiskt skala arbetsbelastningar baserat på GPU-användning i realtid. Den här lösningen hjälper till att optimera GPU-resursanvändningen och styra driftskostnaderna genom att dynamiskt justera programskalan som svar på efterfrågan på arbetsbelastningar.

Förutsättningar

  • Azure CLI version 2.60.0 eller senare. Kör az --version för att hitta versionen. Om du behöver installera eller uppgradera, se Installera Azure CLI.
  • Helm version 3.17.0 eller senare installerad.
  • kubectl version 1.28.9 eller senare installerad.
  • NVIDIA GPU-kvot i din Azure-prenumeration. I det här exemplet används SKU:n Standard_NC40ads_H100_v5 , men andra NVIDIA H100 VM-SKU:er stöds också.

Kontrollera att AKS-klustret är konfigurerat med följande innan du fortsätter:

Nu bör du ha:

Skapa en ny KEDA-skalare med hjälp av NVIDIA DCGM Exporter-metrik

För att skapa en KEDA-skalare behöver du två komponenter:

  1. Prometheus-frågeslutpunkten.
  2. Den användartilldelade hanterade identiteten.

Hämta Azure Managed Prometheus-frågeslutpunkten

  1. Du hittar det här värdet i avsnittet Översikt på Azure Monitor-arbetsytan som är kopplad till ditt AKS-kluster i Azure-portalen.

    Skärmbild av den hanterade Prometheus-frågeslutpunkten.

  2. Exportera Azure Managed Prometheus-frågeslutpunkten till en miljövariabel:

    export PROMETHEUS_QUERY_ENDPOINT="https://example.prometheus.monitor.azure.com"
    

Hämta den användartilldelade hanterade identiteten

Den användartilldelade hanterade identiteten skapades tidigare enligt KEDA-integreringsstegen. Om det behövs läser du in det här värdet igen med az identity show kommandot :

export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group $RESOURCE_GROUP --name $USER_ASSIGNED_IDENTITY_NAME --query 'clientId' -o tsv)"

Skapa KEDA-skalare manifestet

Det här manifestet skapar TriggerAuthentication och ScaledObject för autoskalning baserat på GPU-användning mätt med DCGM_FI_DEV_GPU_UTIL-mätvärdet.

Anmärkning

I det här exemplet används måttet DCGM_FI_DEV_GPU_UTIL som mäter GPU-användning. Andra mått är också tillgängliga från DCGM-exportören beroende på dina arbetsbelastningskrav. En fullständig lista över tillgängliga mått finns i dokumentationen för NVIDIA DCGM Exporter.

Fält Beskrivning
metricName Anger det GPU-mått som ska övervakas. DCGM_FI_DEV_GPU_UTIL rapporterar procentandelen av tiden som GPU:n aktivt bearbetar arbetsbelastningar. Det här värdet varierar vanligtvis från 0 till 100.
query PromQL-fråga som beräknar den genomsnittliga GPU-användningen för alla poddar i distributionen my-gpu-workload. Detta säkerställer att skalningsbeslut baseras på övergripande GPU-användning, inte en enda podd.
threshold Den genomsnittliga GPU-utnyttjandeprocenten som utlöser skalning. Om genomsnittet överskrider 5%, ökar skalaren antalet poddrepliker.
activationThreshold Den minsta genomsnittliga GPU-användningen som krävs för att aktivera skalning. Om användningen är under 2%sker inte skalningsåtgärder, vilket förhindrar onödig skalning under perioder med låg aktivitet.
  1. Skapa följande KEDA-manifest:

    cat <<EOF > keda-gpu-scaler-prometheus.yaml
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: azure-managed-prometheus-trigger-auth
    spec:
      podIdentity:
        provider: azure-workload
        identityId: ${USER_ASSIGNED_CLIENT_ID}
    ---
    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: my-gpu-workload
    spec:
      scaleTargetRef:
        name: my-gpu-workload
      minReplicaCount: 1
      maxReplicaCount: 20
      triggers:
        - type: prometheus
          metadata:
            serverAddress: ${PROMETHEUS_QUERY_ENDPOINT}
            metricName: DCGM_FI_DEV_GPU_UTIL
            query: avg(DCGM_FI_DEV_GPU_UTIL{deployment="my-gpu-workload"})
            threshold: '5'
            activationThreshold: '2'
          authenticationRef:
            name: azure-managed-prometheus-trigger-auth
    EOF
    
  2. Använd det här manifestet kubectl apply med kommandot :

    kubectl apply -f keda-gpu-scaler-prometheus.yaml
    

Testa de nya skalningsfunktionerna

  1. Skapa en exempelarbetsbelastning som använder GPU-resurser i ditt AKS-kluster. Du kan börja med följande exempel:

    cat <<EOF > my-gpu-workload.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-gpu-workload
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-gpu-workload
      template:
        metadata:
          labels:
            app: my-gpu-workload
        spec:
          tolerations:
            - key: "sku"
              operator: "Equal"
              value: "gpu"
              effect: "NoSchedule"
          containers:
            - name: my-gpu-workload
              image: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu
              command: ["/bin/sh"]
              args: ["-c", "while true; do python /app/main.py --max_steps=500; done"]
              resources:
                limits:
                  nvidia.com/gpu: 1
    EOF
    
  2. Använd det här distributionsmanifestet kubectl apply med kommandot :

    kubectl apply -f my-gpu-workload.yaml
    

    Anmärkning

    Om inga GPU-noder är tillgängliga för närvarande förblir podden i ett Pending tillstånd tills en nod har etablerats, vilket visar följande meddelande:

    Events:
      Type     Reason            Age    From                Message
      ----     ------            ----   ----                -------
      Warning  FailedScheduling  3m19s  default-scheduler   0/2 nodes are available: 2 Insufficient nvidia.com/gpu. preemption: 0/2 nodes are available: 2 No preemption victims found for incoming pod.
    

    Autoskalningen av klustret kommer så småningom att starta och etablera en ny GPU-nod.

    Normal   TriggeredScaleUp  2m43s  cluster-autoscaler  pod triggered scale-up: [{aks-gpunp-36854149-vmss 0->1 (max: 2)}]
    

    Anmärkning

    Beroende på storleken på din etablerade GPU SKU kan det ta flera minuter att etablera noder.

  3. Kontrollera förloppet genom att kontrollera HPA-händelserna (Horizontal Pod Autoscaler) med kommandot kubectl describe :

    kubectl describe hpa my-gpu-workload
    

    Utdata bör se ut så här:

    Conditions:
      Type            Status  Reason            Message
      ----            ------  ------            -------
      AbleToScale     True    ReadyForNewScale  recommended size matches current size
      ScalingActive   True    ValidMetricFound  the HPA successfully calculated a replica count from external metric s0-prometheus(&LabelSelector{MatchLabels:map[string]string{scaledobject.keda.sh/name: my-gpu-workload}})
      ScalingLimited  True    TooFewReplicas    the desired replica count is less than the minimum replica count
    
  4. Bekräfta att GPU-noden har lagts till och att podden körs med kubectl get kommandot :

    kubectl get nodes
    

    Utdata bör se ut så här:

    NAME                                STATUS   ROLES    AGE     VERSION
    aks-gpunp-36854149-vmss000005       Ready    <none>   4m36s   v1.31.7
    aks-nodepool1-34179260-vmss000002   Ready    <none>   26h     v1.31.7
    aks-nodepool1-34179260-vmss000003   Ready    <none>   26h     v1.31.7
    

Skala ner GPU-nodpoolen

Om du vill skala ned GPU-nodpoolen tar du bort arbetsbelastningsdistributionen med kommandot kubectl delete :

kubectl delete deployment my-gpu-workload

Anmärkning

Du kan konfigurera nodpoolen så att den skalar ned till noll genom att aktivera autoskalaren för klustret och ange min-count och 0 vid skapandet av nodpoolen. Till exempel:

az aks nodepool add \
 --resource-group myResourceGroup \
 --cluster-name myAKSCluster \
 --name gpunp \
 --node-count 1 \
 --node-vm-size Standard_NC40ads_H100_v5 \
 --node-taints sku=gpu:NoSchedule \
 --enable-cluster-autoscaler \
 --min-count 0 \
 --max-count 3

Nästa steg