GPU-workloads automatisch schalen op AKS met behulp van DCGM Metrics en KEDA

In dit artikel leert u hoe u GPU-workloads in Azure Kubernetes Service (AKS) automatisch schaalt met behulp van GPU-metrische gegevens die zijn verzameld door de DCGM-exporteur (NVIDIA Data Center GPU Manager). Deze metrische gegevens worden weergegeven via Azure Managed Prometheus en gebruikt door Kubernetes Event-Driven Automatisch schalen (KEDA) om workloads automatisch te schalen op basis van realtime GPU-gebruik. Deze oplossing helpt het GPU-resourcegebruik te optimaliseren en operationele kosten te beheren door de toepassingsschaal dynamisch aan te passen in reactie op de vraag naar workloads.

Vereiste voorwaarden

  • Azure CLI versie 2.60.0 of hoger. Voer az --version uit om de versie te vinden. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.
  • Helm-versie 3.17.0 of hoger geïnstalleerd.
  • kubectl versie 1.28.9 of hoger geïnstalleerd.
  • NVIDIA GPU-quotum in uw Azure-abonnement. In dit voorbeeld wordt de Standard_NC40ads_H100_v5 SKU gebruikt, maar andere NVIDIA H100 VM-SKU's worden ook ondersteund.

Voordat u doorgaat, moet u ervoor zorgen dat uw AKS-cluster is geconfigureerd met het volgende:

Op dit moment hebt u het volgende nodig:

Een nieuwe KEDA-scaler maken met behulp van de metrische gegevens van NVIDIA DCGM Exporter

Als u een KEDA-schaalfunctie wilt maken, hebt u twee onderdelen nodig:

  1. Het Prometheus-queryeindpunt.
  2. De door de gebruiker toegewezen beheerde identiteit.

Het Azure Managed Prometheus-queryeindpunt ophalen

  1. U vindt deze waarde in de sectie Overzicht van de Azure Monitor-werkruimte die is gekoppeld aan uw AKS-cluster in Azure Portal.

    Schermopname van het eindpunt van de beheerde Prometheus-query.

  2. Exporteer het azure Managed Prometheus-queryeindpunt naar een omgevingsvariabele:

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

De door de gebruiker toegewezen beheerde identiteit ophalen

De door de gebruiker toegewezen beheerde identiteit is eerder gemaakt volgens de KEDA-integratiestappen. Laad deze waarde indien nodig opnieuw met de az identity show opdracht:

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

Maak het KEDA-scaler manifest aan

Met dit manifest worden de TriggerAuthentication en ScaledObject voor autoschaling gecreëerd op basis van GPU-gebruik, gemeten door de DCGM_FI_DEV_GPU_UTIL metriek.

Opmerking

In dit voorbeeld wordt de DCGM_FI_DEV_GPU_UTIL metrische waarde gebruikt, waarmee het GPU-gebruik wordt berekend. Andere metrische gegevens zijn ook beschikbaar bij de DCGM-exporteur, afhankelijk van uw workloadvereisten. Raadpleeg de documentatie van NVIDIA DCGM Exporter voor een volledige lijst met beschikbare metrische gegevens.

Veld Beschrijving
metricName Hiermee geeft u de GPU-metrische gegevens op die moeten worden bewaakt. DCGM_FI_DEV_GPU_UTIL rapporteert het percentage tijd dat de GPU werkbelastingen actief verwerkt. Deze waarde varieert doorgaans van 0 tot 100.
query PromQL-query waarmee het gemiddelde GPU-gebruik wordt berekend voor alle pods in de implementatie my-gpu-workload. Dit zorgt ervoor dat schaalbeslissingen zijn gebaseerd op het algehele GPU-gebruik, niet op één pod.
threshold Het gemiddelde GPU-gebruikspercentage dat schaalaanpassingen activeert. Als het gemiddelde groter is dan 5%, verhoogt de scaler het aantal pod replica's.
activationThreshold Het minimale gemiddelde GPU-gebruik dat nodig is om schaalaanpassing te activeren. Als het gebruik lager is dan 2%, treden er geen schaalacties op, waardoor onnodig schalen tijdens lage activiteitsperioden niet wordt voorkomen.
  1. Maak het volgende 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. Pas dit manifest toe met behulp van de kubectl apply opdracht:

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

De nieuwe schaalmogelijkheden testen

  1. Maak een voorbeeldworkload die GPU-resources in uw AKS-cluster verbruikt. U kunt beginnen met het volgende voorbeeld:

    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. Pas dit implementatiemanifest toe met behulp van de kubectl apply opdracht:

    kubectl apply -f my-gpu-workload.yaml
    

    Opmerking

    Als er momenteel geen GPU-knooppunten beschikbaar zijn, blijft de pod in een Pending status totdat een knooppunt is ingericht, met het volgende bericht:

    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.
    

    De cluster autoscaler zal uiteindelijk starten en een nieuw GPU-knooppunt inrichten.

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

    Opmerking

    Afhankelijk van de grootte van uw ingerichte GPU-SKU kan het inrichten van knooppunten enkele minuten duren.

  3. Als u de voortgang wilt controleren, controleert u de HPA-gebeurtenissen (Horizontal Pod AutoScaler) met behulp van de kubectl describe opdracht:

    kubectl describe hpa my-gpu-workload
    

    De uitvoer moet er als volgt uitzien:

    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. Controleer of het GPU-knooppunt is toegevoegd en dat de pod wordt uitgevoerd met de kubectl get opdracht:

    kubectl get nodes
    

    De uitvoer moet er als volgt uitzien:

    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
    

De GPU-knooppuntgroep omlaag schalen

Als u de GPU-knooppuntgroep omlaag wilt schalen, verwijdert u uw workloadimplementatie met behulp van de kubectl delete opdracht:

kubectl delete deployment my-gpu-workload

Opmerking

U kunt de knooppuntgroep zo configureren dat deze omlaag wordt geschaald naar nul door de automatische schaalaanpassing van clusters in te schakelen en de min-count in te stellen naar 0 bij het aanmaken van de knooppuntgroep. Voorbeeld:

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

Volgende stappen