Udostępnij za pośrednictwem


Automatyczne skalowanie obciążeń procesora GPU w usłudze AKS przy użyciu metryk DCGM i KEDA

W tym artykule dowiesz się, jak automatycznie skalować obciążenia procesora GPU w usłudze Azure Kubernetes Service (AKS) przy użyciu metryk procesora GPU zebranych przez eksportera NVIDIA Data Center GPU Manager (DCGM). Te metryki są udostępniane za pośrednictwem usługi Azure Managed Prometheus i używane przez platformę Kubernetes Event-Driven autoskalowanie (KEDA) w celu automatycznego skalowania obciążeń na podstawie wykorzystania procesora GPU w czasie rzeczywistym. To rozwiązanie pomaga zoptymalizować użycie zasobów procesora GPU i kontrolować koszty operacyjne, dynamicznie dostosowując skalę aplikacji w odpowiedzi na zapotrzebowanie na obciążenia.

Wymagania wstępne

Przed kontynuowaniem upewnij się, że klaster usługi AKS jest skonfigurowany przy użyciu następujących elementów:

W tym momencie powinieneś mieć:

Tworzenie nowego modułu skalowania KEDA przy użyciu metryk eksportera NVIDIA DCGM

Aby utworzyć moduł skalowania KEDA, potrzebne są dwa składniki:

  1. Punkt końcowy zapytania Prometheus.
  2. Tożsamość zarządzana przypisana przez użytkownika.

Pobierz punkt końcowy zapytania zarządzanego przez Azure Prometheusa

  1. Tę wartość można znaleźć w sekcji Przegląd obszaru roboczego usługi Azure Monitor dołączonego do klastra usługi AKS w witrynie Azure Portal.

    Zrzut ekranu przedstawiający zarządzany punkt końcowy zapytania Prometheus.

  2. Wyeksportuj punkt końcowy zapytania zarządzanego rozwiązania Prometheus platformy Azure do zmiennej środowiskowej:

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

Pobieranie tożsamości zarządzanej przypisanej przez użytkownika

Tożsamość zarządzana przypisana przez użytkownika została wcześniej utworzona po wykonaniu kroków integracji usługi KEDA. W razie potrzeby załaduj ponownie tę wartość za pomocą polecenia az identity show.

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

Tworzenie manifestu narzędzia skalowania KEDA

Ten manifest tworzy TriggerAuthentication i ScaledObject do skalowania automatycznego na podstawie wykorzystania GPU mierzonego przez metrykę DCGM_FI_DEV_GPU_UTIL.

Uwaga / Notatka

W tym przykładzie użyto DCGM_FI_DEV_GPU_UTIL metryki, która mierzy użycie procesora GPU. Inne metryki są również dostępne od eksportera DCGM w zależności od wymagań związanych z obciążeniem. Pełną listę dostępnych metryk można znaleźć w dokumentacji eksportera NVIDIA DCGM.

(No changes needed) Opis
metricName Określa metrykę GPU do monitorowania. DCGM_FI_DEV_GPU_UTIL raportuje procent czasu, w jaki procesor GPU aktywnie przetwarza obciążenia. Ta wartość zazwyczaj waha się od 0 do 100.
query Zapytanie PromQL, które oblicza średnie wykorzystanie GPU we wszystkich podach we wdrożeniu my-gpu-workload. Dzięki temu decyzje dotyczące skalowania są oparte na ogólnym użyciu procesora GPU, a nie na pojedynczym zasobniku.
threshold Docelowy średni procent wykorzystania procesora GPU, który wyzwala skalowanie. Jeśli średnia przekracza 5%, skalownik zwiększa liczbę replik zasobników.
activationThreshold Minimalne średnie wykorzystanie procesora GPU wymagane do aktywowania skalowania. Jeśli użycie jest poniżej 2%, akcje skalowania nie zostaną wykonane, uniemożliwiając niepotrzebne skalowanie w okresach niskiej aktywności.
  1. Utwórz następujący manifest KEDA:

    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. Zastosuj ten manifest przy użyciu kubectl apply polecenia :

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

Testowanie nowych możliwości skalowania

  1. Utwórz przykładowe obciążenie, które zużywa zasoby procesora GPU w klastrze usługi AKS. Możesz zacząć od następującego przykładu:

    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. Zastosuj ten manifest wdrożenia przy użyciu kubectl apply polecenia :

    kubectl apply -f my-gpu-workload.yaml
    

    Uwaga / Notatka

    Jeśli węzły GPU nie są obecnie dostępne, pod będzie w stanie Pending do momentu uruchomienia węzła, co spowoduje wyświetlenie następującego komunikatu:

    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.
    

    Narzędzie do automatycznego skalowania klastra zostanie ostatecznie uruchomione i aprowizuje nowy węzeł GPU.

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

    Uwaga / Notatka

    W zależności od rozmiaru aprowizowanej jednostki SKU procesora GPU aprowizacja węzłów może potrwać kilka minut.

  3. Aby sprawdzić postęp, użyj polecenia kubectl describe do sprawdzenia zdarzeń narzędzia Horizontal Pod Autoscaler (HPA).

    kubectl describe hpa my-gpu-workload
    

    Dane wyjściowe powinny wyglądać następująco:

    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. Upewnij się, że węzeł GPU został dodany i pod jest uruchomiony za pomocą polecenia kubectl get.

    kubectl get nodes
    

    Dane wyjściowe powinny wyglądać następująco:

    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
    

Zmniejszenie puli węzłów GPU

Aby zmniejszyć rozmiar puli węzłów GPU, usuń wdrożenie obciążenia przy użyciu polecenia kubectl delete.

kubectl delete deployment my-gpu-workload

Uwaga / Notatka

Pulę węzłów można skonfigurować tak, aby skalowała się w dół do zera, włączając klastrowe automatyczne skalowanie i ustawiając min-count na 0 podczas tworzenia puli węzłów. Przykład:

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

Dalsze kroki