全部产品
Search
文档中心

Container Service for Kubernetes:Aktifkan penskalaan otomatis berdasarkan metrik GPU

更新时间:Jul 06, 2025

Kubernetes mendukung penskalaan otomatis berdasarkan metrik khusus. Kubernetes dapat bekerja dengan Managed Service for Prometheus untuk mengimplementasikan penskalaan otomatis berdasarkan metrik GPU. Topik ini menjelaskan cara menerapkan Managed Service for Prometheus untuk memantau aplikasi dan memberikan contoh cara melihat metrik GPU yang dikumpulkan oleh Managed Service for Prometheus, serta mengaktifkan penskalaan otomatis pod berdasarkan metrik GPU.

Prasyarat

Sebuah ACK cluster dengan node yang dipercepat GPU atau ACK dedicated cluster dengan node yang dipercepat GPU telah dibuat.

Pengenalan

Komputasi yang dipercepat GPU banyak digunakan dalam skenario komputasi berperforma tinggi, seperti pelatihan model pembelajaran mendalam dan inferensi. Untuk mengurangi biaya sumber daya, Anda dapat mengaktifkan penskalaan klaster otomatis berdasarkan metrik GPU, seperti pemanfaatan GPU dan penggunaan memori GPU.

Kubernetes menyediakan data CPU dan memori sebagai metrik default untuk Horizontal Pod Autoscaler (HPA). Untuk skenario yang lebih kompleks, seperti penskalaan otomatis berdasarkan metrik GPU, Anda dapat menggunakan adaptor Prometheus untuk menyesuaikan metrik GPU yang dikumpulkan oleh Prometheus dan menggunakan API metrik khusus untuk mendefinisikan metrik khusus untuk HPA. Ini memungkinkan Anda untuk mengaktifkan penskalaan elastis berdasarkan penggunaan GPU dan memori. Gambar berikut menunjukkan cara kerja penskalaan otomatis berdasarkan metrik GPU.

Langkah 1: Terapkan Managed Service for Prometheus dan ack-alibaba-cloud-metrics-adapter

  1. Aktifkan Managed Service for Prometheus.

    Catatan

    Anda dapat memilih Aktifkan Managed Service for Prometheus saat membuat klaster. Ini menghemat kebutuhan untuk menginstal Managed Service for Prometheus setelah klaster dibuat.

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

    A. Obtain the HTTP API endpoint

    1. Masuk ke Konsol ARMS.

    2. Di panel navigasi di sebelah kiri, pilih Managed Service for Prometheus > Instances.

    3. Di bilah navigasi atas, pilih wilayah tempat ACK cluster Anda diterapkan. Kemudian, klik nama instance Prometheus yang digunakan oleh klaster Anda untuk masuk ke halaman detail instance.

    4. Pada halaman Settings, klik tab Settings, dan salin endpoint internal di bagian HTTP API URL.

    B. Configure the Prometheus URL

    1. Masuk ke Konsol ACK. Di panel navigasi di sebelah kiri, pilih Marketplace > Marketplace.

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

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

    4. Pada halaman wizard Basic Information, pilih klaster dan namespace, lalu klik Next.

    5. Pada halaman wizard Parameters, pilih versi bagan dari daftar drop-down Chart Version, atur URL Prometheus di bagian Parameters ke endpoint API HTTP yang Anda peroleh, lalu klik OK.

Langkah 2: Konfigurasikan aturan untuk ack-alibaba-cloud-metrics-adapter

a. Kueri metrik GPU

Kueri metrik GPU. Untuk informasi lebih lanjut, lihat Pengenalan metrik.

b. Konfigurasikan aturan untuk ack-alibaba-cloud-metrics-adapter

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

  2. Pada halaman Clusters, temukan klaster yang Anda inginkan dan klik namanya. Di panel navigasi di sebelah kiri, pilih Applications > Helm.

  3. Pada halaman Helm, klik Update di kolom Actions dari ack-alibaba-cloud-metrics-adapter. Tambahkan rules berikut di bawah custom.

    Tampilkan kode sampel

    - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NodeName:
            resource: node
      seriesQuery: DCGM_FI_DEV_GPU_UTIL{} # Metrik ini menunjukkan pemanfaatan GPU.
    - metricsQuery: avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          NodeName:
            resource: node
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_SM_UTIL{} # Metrik ini menunjukkan pemanfaatan GPU pod.
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NodeName:
            resource: node
      seriesQuery: DCGM_FI_DEV_FB_USED{} # Metrik ini menunjukkan jumlah memori GPU yang digunakan.
    - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
      resources:
        overrides:
          NamespaceName:
            resource: namespace
          NodeName:
            resource: node
          PodName:
            resource: pod
      seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{} # Metrik ini menunjukkan penggunaan memori GPU pod.
    - 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!=""}  # Metrik ini menunjukkan pemanfaatan memori GPU.

    Gambar berikut memberikan contohnya.

    1690252651140-f693f03a-0f9e-4a6a-8772-b7abe9b2912a.png

    Jalankan perintah berikut. Jika output mencakup DCGM_FI_DEV_GPU_UTIL, DCGM_CUSTOM_PROCESS_SM_UTIL, DCGM_FI_DEV_FB_USED, dan DCGM_CUSTOM_PROCESS_MEM_USED, aturan telah dikonfigurasi. Pada contoh berikut, DCGM_CUSTOM_PROCESS_SM_UTIL ditampilkan di output.

    Tampilkan kode sampel

    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
    {
    	[
        ...
    		{
          "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: Aktifkan penskalaan otomatis berdasarkan metrik GPU

Contoh berikut menunjukkan cara menerapkan layanan inferensi model pada node yang dipercepat GPU dan melakukan uji stres pada node untuk memeriksa apakah penskalaan otomatis dapat dilakukan berdasarkan metrik GPU.

a. Terapkan layanan inferensi

  1. Jalankan perintah berikut untuk menerapkan layanan inferensi:

    Tampilkan kode sampel

    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. Kueri status pod dan Service.

    • Jalankan perintah berikut untuk memeriksa 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>

      Output menunjukkan bahwa hanya satu pod yang diterapkan pada node yang dipercepat GPU 192.168.94.107.

    • Jalankan perintah berikut untuk memeriksa 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

      Jika output menampilkan nama Service, Service telah diterapkan.

  3. Masuk ke node 192.168.94.107 menggunakan SSH dan jalankan perintah berikut untuk memeriksa pemanfaatan 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 bahwa layanan inferensi sedang berjalan pada node yang dipercepat GPU. Pemanfaatan GPU adalah 0 karena tidak ada permintaan yang dikirim ke layanan.

  4. Jalankan perintah berikut untuk mengirim permintaan ke layanan inferensi dan memeriksa apakah layanan telah diterapkan:

    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 # Hasil kueri.

    Jika kode status HTTP 200 dan hasil kueri dikembalikan, layanan inferensi telah diterapkan.

b. Konfigurasikan HPA

Contoh berikut menjelaskan cara memicu penskalaan otomatis ketika pemanfaatan GPU pod melebihi 20%. Tabel berikut menjelaskan metrik yang didukung oleh HPA.

Metrik

Deskripsi

Satuan

DCGM_FI_DEV_GPU_UTIL

  • Pemanfaatan GPU.

  • Metrik ini hanya tersedia untuk GPU yang dijadwalkan dalam mode eksklusif.

    Penting

    Jika GPU dibagikan di antara beberapa pod, hanya pemanfaatan GPU yang dikembalikan setelah Anda menjalankan perintah nvidia-smi di salah satu pod. Hal ini karena NVIDIA tidak menyediakan informasi tentang pemanfaatan GPU pod.

%

DCGM_FI_DEV_FB_USED

  • Jumlah memori GPU yang digunakan.

  • Metrik ini hanya tersedia untuk GPU yang dijadwalkan dalam mode eksklusif.

MiB

DCGM_CUSTOM_PROCESS_SM_UTIL

Pemanfaatan GPU pod.

%

DCGM_CUSTOM_PROCESS_MEM_USED

Jumlah memori GPU yang digunakan oleh pod.

MiB

DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO

Pemanfaatan memori GPU pod.

Pemanfaatan memori GPU pod = Memori GPU saat ini yang digunakan oleh pod (Used)/Memori GPU saat ini yang dialokasikan ke pod (Allocated)

%

  1. Jalankan perintah berikut untuk menerapkan HPA:

    Cluster yang menjalankan Kubernetes 1.23 atau lebih baru

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2  # Gunakan konfigurasi HPA untuk versi API 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 # Jika pemanfaatan GPU melebihi 20%, pod akan diskalakan keluar.
    EOF

    Cluster yang menjalankan versi Kubernetes lebih lama dari 1.23

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2beta1  # Gunakan konfigurasi HPA untuk versi API 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 # Jika pemanfaatan GPU melebihi 20%, pod akan diskalakan keluar.
    EOF
  2. Jalankan perintah berikut untuk memeriksa 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

    Output yang diharapkan menunjukkan bahwa TARGETS menampilkan 0/20. Pemanfaatan GPU saat ini adalah 0. Ketika pemanfaatan GPU melebihi 20%, pod akan diskalakan keluar.

c. Uji penskalaan otomatis pada layanan inferensi

Uji aktivitas penskalaan keluar

  1. Jalankan perintah berikut untuk melakukan uji stres:

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

    Rumus berikut digunakan untuk menghitung jumlah pod yang diharapkan setelah penskalaan otomatis: Jumlah pod yang diharapkan = ceil [Jumlah pod saat ini × (Pemanfaatan GPU saat ini/Pemanfaatan GPU yang diharapkan)]. Sebagai contoh, jika jumlah pod saat ini adalah 1, pemanfaatan GPU saat ini adalah 23, pemanfaatan GPU yang diharapkan adalah 20, jumlah pod yang diharapkan setelah penskalaan otomatis adalah 2.

  2. Selama uji stres, jalankan perintah berikut untuk memeriksa status HPA dan pod:

    1. Jalankan perintah berikut untuk memeriksa 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

      Output menunjukkan bahwa nilai di kolom TARGETS adalah 23/20. Pemanfaatan GPU saat ini melebihi ambang batas 20%. Dalam hal ini, penskalaan otomatis dipicu dan klaster ACK mulai menambah pod.

    2. Jalankan perintah berikut untuk memeriksa 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

      Output menunjukkan bahwa dua pod sedang berjalan. Nilai ini sama dengan jumlah pod yang diharapkan berdasarkan rumus sebelumnya.

    Output yang dikembalikan oleh HPA dan pod menunjukkan bahwa pod telah diskalakan keluar.

Uji aktivitas penskalaan masuk

Ketika uji stres berhenti dan pemanfaatan GPU turun di bawah 20%, klaster ACK mulai mengurangi pod.

  1. Jalankan perintah berikut untuk memeriksa 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

    Output menunjukkan bahwa nilai di kolom TARGETS adalah 0/20. Pemanfaatan GPU saat ini turun menjadi 0. Klaster ACK mulai mengurangi pod setelah sekitar 5 menit.

  2. Jalankan perintah berikut untuk memeriksa status pod:

    kubectl get pods

    Output yang diharapkan:

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

    Output menunjukkan bahwa jumlah pod adalah 1. Ini berarti pod telah diskalakan masuk.

FAQ

Bagaimana cara memastikan apakah GPU digunakan?

Anda dapat memeriksa apakah ada perubahan dalam pemanfaatan GPU di tab GPU Monitoring. Jika pemanfaatan GPU meningkat, GPU digunakan. Jika tidak ada perubahan dalam pemanfaatan GPU, tidak ada GPU yang digunakan. Untuk melakukannya, ikuti langkah-langkah berikut:

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

  2. Pada halaman Clusters, temukan klaster yang Anda inginkan dan klik namanya. Di panel sisi kiri, pilih Operations > Prometheus Monitoring.

  3. Pada halaman Prometheus Monitoring, klik tab GPU Monitoring dan lihat perubahan dalam pemanfaatan GPU.