Bagikan melalui


Otomatisasi Skala Beban Kerja GPU di AKS Menggunakan Metrik DCGM dan KEDA

Dalam artikel ini, Anda mempelajari cara menskalakan beban kerja GPU secara otomatis pada Azure Kubernetes Service (AKS) dengan menggunakan metrik GPU yang dikumpulkan oleh pengekspor NVIDIA Data Center GPU Manager (DCGM). Metrik ini diekspos melalui Azure Managed Prometheus dan digunakan oleh Kubernetes Event-Driven Autoscaling (KEDA) untuk secara otomatis menskalakan beban kerja berdasarkan pemanfaatan GPU real time. Solusi ini membantu mengoptimalkan penggunaan sumber daya GPU dan mengontrol biaya operasional dengan menyesuaikan skala aplikasi secara dinamis sebagai respons terhadap permintaan beban kerja.

Prasyarat

  • Azure CLI versi 2.60.0 atau yang lebih baru. Jalankan az --version untuk menemukan versinya. Jika Anda perlu menginstal atau memperbarui, lihat Install Azure CLI.
  • Helm versi 3.17.0 atau yang lebih baru terinstal.
  • kubectl versi 1.28.9 atau yang lebih baru terinstal.
  • Kuota GPU NVIDIA di langganan Azure Anda. Contoh ini menggunakan Standard_NC40ads_H100_v5 SKU, tetapi SKU VM NVIDIA H100 lainnya juga didukung.

Sebelum melanjutkan, pastikan kluster AKS Anda dikonfigurasi dengan yang berikut:

Pada titik ini, Anda harus memiliki:

Buat skaler KEDA baru dengan metrik dari pengekspor NVIDIA DCGM

Untuk membuat scaler KEDA, Anda memerlukan dua komponen:

  1. Titik akhir kueri Prometheus.
  2. Identitas Terkelola yang Ditetapkan Pengguna.

Mengambil titik akhir kueri Azure Managed Prometheus

  1. Anda dapat menemukan nilai ini di bagian Gambaran Umum ruang kerja Azure Monitor yang dilampirkan ke kluster AKS Anda di portal Microsoft Azure.

    Cuplikan layar Titik Akhir Kueri Prometheus Terkelola.

  2. Ekspor titik akhir kueri Azure Managed Prometheus ke variabel lingkungan:

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

Mengambil Identitas Terkelola yang Ditetapkan Pengguna

Identitas Terkelola yang Ditetapkan Pengguna sebelumnya dibuat mengikuti langkah-langkah integrasi KEDA. Jika diperlukan, muat ulang nilai ini dengan az identity show perintah :

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

Buat manifes penskala KEDA

Manifes ini membuat TriggerAuthentication dan ScaledObject untuk penskalaan otomatis berdasarkan pemanfaatan GPU yang diukur oleh metrik DCGM_FI_DEV_GPU_UTIL.

Nota

Contoh ini menggunakan DCGM_FI_DEV_GPU_UTIL metrik, yang mengukur pemanfaatan GPU. Metrik lain juga tersedia dari pengekspor DCGM tergantung pada persyaratan beban kerja Anda. Untuk daftar lengkap metrik yang tersedia, lihat dokumentasi Pengekspor NVIDIA DCGM.

Lapangan Deskripsi
metricName Menentukan metrik GPU untuk dipantau. DCGM_FI_DEV_GPU_UTIL melaporkan persentase waktu GPU secara aktif memproses beban kerja. Nilai ini biasanya berkisar antara 0 hingga 100.
query Kueri PromQL yang menghitung penggunaan GPU rata-rata di semua pod dalam deployment my-gpu-workload. Ini memastikan keputusan penskalakan didasarkan pada penggunaan GPU secara keseluruhan, bukan satu pod pun.
threshold Persentase pemanfaatan GPU rata-rata target yang memicu penskalaan. Jika rata-rata melebihi 5%, scaler akan meningkatkan jumlah replika pod.
activationThreshold Pemanfaatan GPU rata-rata minimum yang diperlukan untuk mengaktifkan penskalaan. Jika pemanfaatan di bawah 2%, tindakan penskalaan tidak akan terjadi, mencegah penskalaan yang tidak perlu selama periode aktivitas rendah.
  1. Buat manifes KEDA berikut:

    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. Terapkan manifes ini menggunakan kubectl apply perintah :

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

Menguji kemampuan penskalakan baru

  1. Buat sampel beban kerja yang menggunakan sumber daya GPU di kluster AKS Anda. Anda dapat memulai dengan contoh berikut:

    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. Terapkan manifes penyebaran ini menggunakan perintah kubectl apply

    kubectl apply -f my-gpu-workload.yaml
    

    Nota

    Jika saat ini tidak ada simpul GPU yang tersedia, pod akan tetap dalam keadaan Pending hingga node disediakan, menunjukkan pesan berikut:

    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.
    

    Pada akhirnya, autoscaler kluster akan memulai dan menyediaka node GPU yang baru.

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

    Nota

    Tergantung pada ukuran SKU GPU yang disediakan, penyediaan simpul mungkin memerlukan waktu beberapa menit.

  3. Untuk memverifikasi kemajuan, periksa peristiwa Horizontal Pod Autoscaler (HPA) dengan perintah kubectl describe:

    kubectl describe hpa my-gpu-workload
    

    Output akan terlihat seperti berikut:

    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. Konfirmasikan bahwa simpul GPU telah ditambahkan dan pod berjalan dengan kubectl get perintah :

    kubectl get nodes
    

    Output akan terlihat seperti berikut:

    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
    

Menurunkan skala kumpulan simpul GPU

Untuk menurunkan skala kumpulan simpul GPU, hapus penyebaran beban kerja Anda menggunakan kubectl delete perintah :

kubectl delete deployment my-gpu-workload

Nota

Anda dapat mengonfigurasi kumpulan simpul untuk menurunkan skala ke nol dengan mengaktifkan autoscaler kluster dan mengatur min-count ke 0 pada waktu pembuatan kumpulan simpul. Contohnya:

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

Langkah selanjutnya