All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan auto scaling dengan metrik GPU

Last Updated:Jun 24, 2026

Gunakan Custom Metrics Kubernetes dan Managed Service for Prometheus untuk mengumpulkan metrik GPU dan melakukan auto scale kontainer dengan HPA.Managed Service for Prometheus dan gunakan HPA untuk melakukan auto scale kontainer.

Prasyarat

Node GPU telah ditambahkan ke kluster Anda, atau kluster GPU khusus telah dibuat.

Cara kerja

GPU mempercepat komputasi dalam skenario seperti pelatihan model pembelajaran mendalam dan inferensi. Auto scaling berdasarkan metrik GPU—seperti pemanfaatan dan penggunaan memori—membantu mengoptimalkan biaya.

Secara default, Kubernetes Horizontal Pod Autoscaler (HPA) menggunakan metrik CPU dan memori. Untuk metrik GPU, Prometheus Adapter mengambil data dari Managed Service for Prometheus dan mengeksposnya melalui Custom Metrics API. HPA kemudian melakukan scaling beban kerja berdasarkan pemanfaatan GPU, penggunaan memori, dan indikator lainnya. Diagram berikut menggambarkan proses tersebut.

Langkah 1: Deploy Prometheus dan adapter metrik

  1. Aktifkan pemantauan Prometheus untuk kluster Anda.

    Catatan

    Lewati langkah ini jika Prometheus telah diinstal saat pembuatan kluster.

  2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Operations > Prometheus Monitoring.

  3. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Applications > Helm.

  4. Di panel navigasi kiri, pilih Managed Service for Prometheus > Instances.

  5. Instal dan konfigurasikan ack-alibaba-cloud-metrics-adapter.

    1. Dapatkan URL HTTP API

    1. Masuk ke Konsol ARMS.

    2. Pilih wilayah kluster ACK Anda. Klik instans target.

    3. Pada halaman Settings, di tab Settings, salin alamat jaringan internal dari HTTP API Address (Grafana Read Address).

    2. Konfigurasikan URL Prometheus

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Marketplace > Marketplace.

    2. Pada halaman Marketplace, klik tab App Catalog. Cari dan klik ack-alibaba-cloud-metrics-adapter.

    3. Pada halaman ack-alibaba-cloud-metrics-adapter, klik Deploy.

    4. Pada wizard Basic Information, pilih kluster dan namespace Anda. Klik Next.

    5. Pada wizard Parameters, pilih Chart Version. Di bagian Parameters, atur parameter url ke URL HTTP API yang telah disalin. Klik OK.

Langkah 2: Konfigurasikan aturan adapter

1. Kueri metrik GPU

Untuk daftar metrik GPU yang tersedia, lihat Deskripsi metrik pemantauan.

2. Konfigurasikan aturan adapter

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Dalam daftar Helm, temukan ack-alibaba-cloud-metrics-adapter. Di kolom Actions, klik Update. Tambahkan rules berikut ke bidang custom.

    Klik untuk memperluas aturan

    - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NodeName:
            resource: node
      seriesQuery: DCGM_FI_DEV_GPU_UTIL{} # GPU utilization.
    - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          NodeName:
            resource: node
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_SM_UTIL{} # Container GPU utilization.
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NodeName:
            resource: node
      seriesQuery: DCGM_FI_DEV_FB_USED{} # GPU memory usage.
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          NodeName:
            resource: node
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{} # Container GPU memory usage.
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) / sum(DCGM_CUSTOM_CONTAINER_MEM_ALLOCATED{}) by (<<.GroupBy>>)
      name:
        as: ${1}_GPU_MEM_USED_RATIO
        matches: ^(.*)_MEM_USED
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{NamespaceName!="",PodName!=""}  # Container GPU memory utilization.

    Konfigurasi lengkap setelah menambahkan aturan:

    Chart Url  https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/ack-alibaba-cloud-metrics-adapter-1.3.2.tgz
      adapter:
        rules:
          custom:
          - metricsQuery: sum(&lt;&lt;.Series&gt;&gt;{&lt;&lt;.LabelMatchers&gt;&gt;}) by (&lt;&lt;.GroupBy&gt;&gt;)
            name:
              as: ${1}_bytes_per_second
              matches: ^(.*)_bytes
            resources:
              overrides:
                namespace:
                  resource: namespace
                pod:
                  resource: pod
            seriesQuery: container_memory_working_set_bytes{namespace!="",pod!=""}
          - metricsQuery: sum(rate(&lt;&lt;.Series&gt;&gt;{&lt;&lt;.LabelMatchers&gt;&gt;}[1m])) by (&lt;&lt;.GroupBy&gt;&gt;)
            name:
              as: ${1}_core_per_second
              matches: ^(.*)_seconds_total
            resources:
              overrides:
                namespace:
                  resource: namespace
                pod:
                  resource: pod
            seriesQuery: container_cpu_usage_seconds_total{namespace!="",pod!=""}
          - metricsQuery: &lt;&lt;.Series&gt;&gt;{&lt;&lt;.LabelMatchers&gt;&gt;}
            resources:
              overrides:
                NodeName:
                  resource: node
            seriesQuery: DCGM_FI_DEV_GPU_UTIL{} # GPU utilization.
          - metricsQuery: &lt;&lt;.Series&gt;&gt;{&lt;&lt;.LabelMatchers&gt;&gt;}
            resources:
              overrides:
                NamespaceName:
                  resource: namespace
                NodeName:
                  resource: node
                PodName:
                  resource: pod
            seriesQuery: DCGM_CUSTOM_PROCESS_SM_UTIL{} # Container GPU utilization.
          - metricsQuery: &lt;&lt;.Series&gt;&gt;{&lt;&lt;.LabelMatchers&gt;&gt;}
            resources:
              overrides:
                NodeName:
                  resource: node
            seriesQuery: DCGM_FI_DEV_FB_USED{} # GPU memory usage.
          - metricsQuery: &lt;&lt;.Series&gt;&gt;{&lt;&lt;.LabelMatchers&gt;&gt;}
            resources:
              overrides:
                NamespaceName:
                  resource: namespace
                NodeName:
                  resource: node
                PodName:
                  resource: pod
            seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{} # Container GPU memory usage.
          - metricsQuery: sum(&lt;&lt;.Series&gt;&gt;{&lt;&lt;.LabelMatchers&gt;&gt;})by(&lt;&lt;.GroupBy&gt;&gt;) / sum(DCGM_CUSTOM_CONTAINER_MEM_ALLOCATED{})by(&lt;&lt;.GroupBy&gt;&gt;)
            name:
              as: ${1}_GPU_MEM_USED_RATIO
              matches: ^(.*)_MEM_USED
            resources:
              overrides:
                NamespaceName:
                  resource: namespace
                PodName:
                  resource: pod
            seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{NamespaceName!="",PodName!=""}  # Container GPU memory utilization.
          default: false
        enabled: true
        logLevel: 5

    Verifikasi konfigurasi. Output harus berisi metrik seperti DCGM_FI_DEV_GPU_UTIL, DCGM_CUSTOM_PROCESS_SM_UTIL, DCGM_FI_DEV_FB_USED, dan DCGM_CUSTOM_PROCESS_MEM_USED. Contoh berikut menyoroti DCGM_CUSTOM_PROCESS_SM_UTIL; output aktual Anda mungkin berbeda.

    Klik untuk memperluas contoh output

    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"

    Output yang diharapkan: Array resources berisi metrik DCGM_CUSTOM_PROCESS_SM_UTIL.

    {
      "kind": "APIResourceList",
      "apiVersion": "v1",
      "groupVersion": "custom.metrics.k8s.io/v1beta1",
      "resources": [
        {
          "name": "nodes/DCGM_CUSTOM_PROCESS_SM_UTIL",
          "singularName": "",
          "namespaced": false,
          "kind": "MetricValueList",
          "verbs": [
            "get"
          ]
        },
        {
          "name": "pods/DCGM_CUSTOM_PROCESS_SM_UTIL",
          "singularName": "",
          "namespaced": true,
          "kind": "MetricValueList",
          "verbs": [
            "get"
          ]
        },
        {
          "name": "namespaces/DCGM_CUSTOM_PROCESS_SM_UTIL",
          "singularName": "",
          "namespaced": false,
          "kind": "MetricValueList",
          "verbs": [
            "get"
          ]
        },
        {
          "name": "DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO",
          "singularName": "",
          "namespaced": false,
          "kind": "MetricValueList",
          "verbs": [
            "get"
          ]
        }
      ]
    }

Langkah 3: Implementasikan auto scaling

Uji auto scaling dengan menerapkan layanan inferensi GPU, menjalankan uji stres, dan mengamati perilaku scaling berbasis GPU.

1. Deploy layanan inferensi

  1. Deploy layanan inferensi.

    Klik untuk memperluas detail perintah

    cat <<EOF | kubectl create -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: bert-intent-detection
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: bert-intent-detection
      template:
        metadata:
          labels:
            app: bert-intent-detection
        spec:
          containers:
          - name: bert-container
            image: registry.cn-hangzhou.aliyuncs.com/ai-samples/bert-intent-detection:1.0.1
            ports:
            - containerPort: 80
            resources:
              limits:
                nvidia.com/gpu: 1
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: bert-intent-detection-svc
      labels:
        app: bert-intent-detection
    spec:
      selector:
        app: bert-intent-detection
      ports:
      - protocol: TCP
        name: http
        port: 80
        targetPort: 80
      type: LoadBalancer
    EOF
  2. Periksa status Pod dan Service.

    • Periksa status Pod.

      kubectl get pods -o wide

      Output yang diharapkan:

      NAME                                    READY   STATUS    RESTARTS   AGE     IP           NODE                        NOMINATED NODE   READINESS GATES
      bert-intent-detection-7b486f6bf-f****   1/1     Running   0          3m24s   10.15.1.17   cn-beijing.192.168.94.107   <none>           <none>

      Satu Pod diterapkan pada node GPU 192.168.94.107.

    • Periksa status Service.

      kubectl get svc bert-intent-detection-svc

      Output yang diharapkan:

      NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
      bert-intent-detection-svc   LoadBalancer   172.16.186.159   47.95.XX.XX   80:30118/TCP   5m1s

      Output menunjukkan nama layanan, yang mengonfirmasi bahwa Service berhasil diterapkan.

  3. Masuk ke node GPU 192.168.94.107 melalui SSH dan periksa penggunaan GPU.

    nvidia-smi

    Output yang diharapkan:

    Wed Feb 16 11:48:07 2022
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 450.102.04   Driver Version: 450.102.04   CUDA Version: 11.0     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  Tesla V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
    | N/A   32C    P0    55W / 300W |  15345MiB / 16160MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |    0   N/A  N/A   2305118      C   python                          15343MiB |
    +-----------------------------------------------------------------------------+

    Output menunjukkan layanan inferensi berjalan di GPU. Pemanfaatan GPU adalah 0% karena belum ada permintaan yang diterima.

  4. Verifikasi penerapan layanan inferensi.

    curl -v  "http://47.95.XX.XX/predict?query=Music"

    Output yang diharapkan:

    *   Trying 47.95.XX.XX...
    * TCP_NODELAY set
    * Connected to 47.95.XX.XX (47.95.XX.XX) port 80 (#0)
    > GET /predict?query=Music HTTP/1.1
    > Host: 47.95.XX.XX
    > User-Agent: curl/7.64.1
    > Accept: */*
    >
    * HTTP 1.0, assume close after body
    < HTTP/1.0 200 OK
    < Content-Type: text/html; charset=utf-8
    < Content-Length: 9
    < Server: Werkzeug/1.0.1 Python/3.6.9
    < Date: Wed, 16 Feb 2022 03:52:11 GMT
    <
    * Closing connection 0
    PlayMusic # Intent recognition result.

    Kode status 200 dengan hasil pengenalan maksud mengonfirmasi penerapan yang berhasil.

2. Konfigurasikan HPA

Contoh ini memicu skala keluar ketika pemanfaatan GPU Pod melebihi 20%. Tabel berikut mencantumkan metrik yang didukung HPA.

Metric

Description

Unit

DCGM_FI_DEV_GPU_UTIL

  • Pemanfaatan kartu GPU.

  • Metrik ini hanya berlaku untuk penjadwalan GPU khusus.

    Penting

    Dalam skenario GPU bersama, NVIDIA hanya menyediakan pemanfaatan tingkat kartu, bukan metrik per aplikasi. Menjalankan nvidia-smi di dalam Pod menunjukkan pemanfaatan seluruh kartu.

%

DCGM_FI_DEV_FB_USED

  • Penggunaan memori kartu GPU.

  • Metrik ini hanya berlaku untuk penjadwalan GPU khusus.

MiB

DCGM_CUSTOM_PROCESS_SM_UTIL

Pemanfaatan GPU kontainer.

%

DCGM_CUSTOM_PROCESS_MEM_USED

Penggunaan memori GPU kontainer.

MiB

DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO

Pemanfaatan memori GPU kontainer.

Pemanfaatan memori GPU kontainer = Memori GPU aktual yang digunakan kontainer / Memori GPU yang dialokasikan ke kontainer

%

  1. Deploy HPA.

    Versi kluster ≥ 1.23

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2  # Gunakan konfigurasi HPA autoscaling/v2.
    kind: HorizontalPodAutoscaler
    metadata:
      name: gpu-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: bert-intent-detection
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metric:
            name: DCGM_CUSTOM_PROCESS_SM_UTIL
          target:
            type: Utilization
            averageValue: 20 # Memicu skala keluar ketika pemanfaatan GPU kontainer melebihi 20%.
    EOF

    Versi kluster < 1.23

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2beta1  # Gunakan konfigurasi HPA autoscaling/v2beta1.
    kind: HorizontalPodAutoscaler
    metadata:
      name: gpu-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: bert-intent-detection
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metricName: DCGM_CUSTOM_PROCESS_SM_UTIL # Pemanfaatan GPU Pod.
          targetAverageValue: 20 # Memicu skala keluar ketika pemanfaatan GPU kontainer melebihi 20%.
    EOF
  2. Periksa status HPA.

    kubectl get hpa

    Output yang diharapkan:

    NAME      REFERENCE                          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    gpu-hpa   Deployment/bert-intent-detection   0/20      1         10        1          74s

    TARGETS menunjukkan 0/20, artinya pemanfaatan GPU saat ini adalah 0. Auto scaling dipicu ketika pemanfaatan melebihi 20%.

3. Uji auto scaling

Uji skala keluar

  1. Jalankan uji stres.

    hey -n 10000 -c 200 "http://47.95.XX.XX/predict?query=music"
    Catatan

    HPA menghitung replika yang diinginkan dengan: Replika yang Diinginkan = ceil[Replika Saat Ini * (Metrik Saat Ini / Metrik yang Diinginkan)]. Misalnya, dengan 1 replika pada nilai metrik 23 dan target 20, hasilnya adalah 2 replika.

  2. Saat uji stres berlangsung, amati status HPA dan Pod.

    1. Periksa status HPA.

      kubectl get hpa

      Output yang diharapkan:

      NAME      REFERENCE                          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
      gpu-hpa   Deployment/bert-intent-detection   23/20     1         10        2          7m56s

      TARGETS menunjukkan 23/20. Pemanfaatan GPU melebihi target 20%, sehingga memicu skala keluar.

    2. Periksa status Pod.

      kubectl get pods

      Output yang diharapkan:

      NAME                                    READY   STATUS    RESTARTS   AGE
      bert-intent-detection-7b486f6bf-f****   1/1     Running   0          44m
      bert-intent-detection-7b486f6bf-m****   1/1     Running   0          14s

      Dua Pod sedang berjalan, sesuai dengan target 2.

    Skala keluar dikonfirmasi.

Uji skala-masuk

Setelah uji stres berhenti, pemanfaatan GPU turun di bawah 20% dan skala-masuk dimulai.

  1. Periksa status HPA.

    kubectl get hpa

    Output yang diharapkan:

    NAME      REFERENCE                          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    gpu-hpa   Deployment/bert-intent-detection   0/20      1         10        1          15m

    TARGETS menunjukkan 0/20 , artinya pemanfaatan GPU adalah 0. Setelah sekitar 5 menit, skala-masuk dimulai.

  2. Periksa status Pod.

    kubectl get pods

    Output yang diharapkan:

    NAME                                    READY   STATUS    RESTARTS   AGE
    bert-intent-detection-7b486f6bf-f****   1/1     Running   0          52m

    Satu Pod tersisa, mengonfirmasi skala-masuk.

FAQ

Bagaimana cara memeriksa penggunaan GPU?

Pada tab GPU Monitoring, amati tren pemanfaatan GPU: tren yang meningkat menunjukkan kartu aktif, sedangkan tren datar berarti idle. Untuk melihat tren tersebut:

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Pada halaman Prometheus Monitoring, klik tab GPU Monitoring.