Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Configure auto scaling with GPU metrics

Última actualización: Sep 29, 2026

Utilice Kubernetes Custom Metrics y Managed Service for Prometheus para recopilar métricas de GPU y escalar automáticamente los contenedores con HPA .

Requisitos previos

Un GPU node is added to your cluster o un dedicated GPU cluster is created.

Cómo funciona

Las GPU aceleran la computación en escenarios como el entrenamiento de modelos de aprendizaje profundo y la inference. El escalamiento automático basado en métricas de GPU, como la utilización y la memoria, ayuda a optimizar los costos.

Kubernetes Horizontal Pod Autoscaler (HPA) usa las métricas de CPU y memoria de forma predeterminada. Para las métricas de GPU, Prometheus Adapter obtiene los datos de Managed Service for Prometheus y los expone mediante la Custom Metrics API. Después, HPA escala las cargas de trabajo según la utilización de GPU, el uso de memoria y otros indicadores. A continuación se muestra un diagrama que ilustra el proceso.

image

Paso 1: Desplegar Prometheus y el adaptador de métricas

  1. Enable Prometheus monitoring para su clúster.

    Nota

    Omita este paso si instaló Prometheus durante la creación del clúster.

  2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Operations > Prometheus Monitoring.

  3. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Applications > Helm.

  4. En el panel de navegación izquierdo, elija Managed Service for Prometheus > Instances.

  5. Instale y configure ack-alibaba-cloud-metrics-adapter.

    1. Obtener la URL de la API HTTP

    1. Inicie sesión en la consola de ARMS.

    2. Seleccione la región de su clúster de ACK. Haga clic en la instancia de destino.

    3. En la página Settings, dentro de la pestaña Settings, copie la dirección de red interna del campo HTTP API Address (Grafana Read Address).

    2. Configurar la URL de Prometheus

    1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Marketplace > Marketplace.

    2. En la página Marketplace, haga clic en la pestaña App Catalog. Busque ack-alibaba-cloud-metrics-adapter y haga clic en esta opción.

    3. En la página ack-alibaba-cloud-metrics-adapter, haga clic en Deploy.

    4. En el asistente Basic Information, seleccione su clúster y espacio de nombres. Haga clic en Next.

    5. En el asistente Parameters, seleccione una Chart Version. En la sección Parameters, establezca el parámetro url con la URL de la API HTTP que copió. Haga clic en OK.

Paso 2: Configurar las reglas del adaptador

1. Consultar las métricas de GPU

Para conocer las métricas de GPU disponibles, consulte Monitoring metric descriptions.

2. Configurar las reglas del adaptador

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la lista de Helm, busque ack-alibaba-cloud-metrics-adapter. En la columna Actions, haga clic en Update. Agregue las siguientes rules al campo custom.

    Haga clic para expandir las reglas

    - 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.

    Configuración completa después de agregar las reglas:

    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

    Compruebe la configuración. La salida debe incluir métricas como DCGM_FI_DEV_GPU_UTIL, DCGM_CUSTOM_PROCESS_SM_UTIL, DCGM_FI_DEV_FB_USED y DCGM_CUSTOM_PROCESS_MEM_USED. El siguiente ejemplo resalta DCGM_CUSTOM_PROCESS_SM_UTIL; su salida real puede variar.

    Haga clic para expandir el ejemplo de salida

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

    Salida esperada: la matriz resources contiene las métricas 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"
          ]
        }
      ]
    }

Paso 3: Implementar el escalamiento automático

Pruebe el escalamiento automático mediante el despliegue de un servicio de inference de GPU, la ejecución de una prueba de estrés y la observación del comportamiento de escalamiento basado en GPU.

1. Desplegar el servicio de inference

  1. Despliegue el servicio de inference.

    Haga clic para expandir los detalles del comando

    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. Compruebe el estado del Pod y del Service.

    • Compruebe el estado del Pod.

      kubectl get pods -o wide

      Salida esperada:

      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>

      Se desplegó un Pod en el nodo de GPU 192.168.94.107.

    • Compruebe el estado del Service.

      kubectl get svc bert-intent-detection-svc

      Salida esperada:

      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

      La salida muestra el nombre del servicio, lo que confirma que el Service se desplegó correctamente.

  3. Inicie sesión en el nodo de GPU 192.168.94.107 mediante SSH y compruebe el uso de la GPU.

    nvidia-smi

    Salida esperada:

    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 |
    +-----------------------------------------------------------------------------+

    La salida muestra el servicio de inference ejecutándose en la GPU. La utilización de la GPU es del 0 % porque aún no se han recibido solicitudes.

  4. Compruebe el despliegue del servicio de inference.

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

    Salida esperada:

    *   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.

    Un código de estado 200 con un resultado de reconocimiento de intención confirma que el despliegue se completó correctamente.

2. Configurar el HPA

Este ejemplo activa el escalado horizontal cuando la utilización de GPU del Pod supera el 20 %. La siguiente tabla muestra las métricas compatibles con HPA.

Métrica

Descripción

Unidad

DCGM_FI_DEV_GPU_UTIL

  • Utilización de la tarjeta GPU.

  • Esta métrica solo aplica para la programación dedicada de GPU.

    Importante

    En escenarios de GPU compartida, NVIDIA proporciona únicamente la utilización a nivel de tarjeta, no métricas por aplicación. Al ejecutar nvidia-smi dentro de un Pod, se muestra la utilización de toda la tarjeta.

%

DCGM_FI_DEV_FB_USED

  • Uso de memoria de la tarjeta GPU.

  • Esta métrica solo aplica para la programación dedicada de GPU.

MiB

DCGM_CUSTOM_PROCESS_SM_UTIL

Utilización de GPU del contenedor.

%

DCGM_CUSTOM_PROCESS_MEM_USED

Uso de memoria de GPU del contenedor.

MiB

DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO

Utilización de memoria de GPU del contenedor.

Container GPU memory utilization = Actual GPU memory used by the container / GPU memory allocated to the container

%

  1. Despliegue el HPA.

    Versión del clúster ≥ 1.23

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2  # Use the autoscaling/v2 HPA configuration.
    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 # Triggers a scale-out when the container's GPU utilization exceeds 20%.
    EOF

    Versión del clúster < 1.23

    cat <<EOF | kubectl create -f -
    apiVersion: autoscaling/v2beta1  # Use the autoscaling/v2beta1 HPA configuration.
    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 # GPU utilization of the Pod.
          targetAverageValue: 20 # Triggers a scale-out when the container's GPU utilization exceeds 20%.
    EOF
  2. Compruebe el estado del HPA.

    kubectl get hpa

    Salida esperada:

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

    TARGETS muestra 0/20, lo que significa que la utilización actual de GPU es 0. El escalamiento automático se activa cuando la utilización supera 20.

3. Probar el escalamiento automático

Probar el escalado horizontal

  1. Ejecute una prueba de estrés.

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

    HPA calcula las réplicas deseadas con la fórmula: Desired Replicas = ceil[Current Replicas * (Current Metric / Desired Metric)]. Por ejemplo, con 1 réplica, un valor de métrica de 23 y un objetivo de 20, el resultado es 2 réplicas.

  2. Durante la prueba de estrés, observe el estado del HPA y de los Pods.

    1. Compruebe el estado del HPA.

      kubectl get hpa

      Salida esperada:

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

      TARGETS muestra 23/20. La utilización de GPU supera el objetivo del 20 %, lo que activa el escalado horizontal.

    2. Compruebe el estado de los Pods.

      kubectl get pods

      Salida esperada:

      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

      Hay dos Pods ejecutándose, lo que coincide con el objetivo de 2.

    El escalado horizontal queda confirmado.

Probar el reescalado horizontal

Cuando la prueba de estrés se detiene, la utilización de GPU baja del 20 % y comienza el reescalado horizontal.

  1. Compruebe el estado del HPA.

    kubectl get hpa

    Salida esperada:

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

    TARGETS muestra 0/20 , lo que significa que la utilización de GPU es 0. Después de unos 5 minutos, comienza el reescalado horizontal.

  2. Compruebe el estado de los Pods.

    kubectl get pods

    Salida esperada:

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

    Solo queda un Pod, lo que confirma el reescalado horizontal.

Preguntas frecuentes

¿Cómo comprobar el uso de la GPU?

En la pestaña GPU Monitoring, observe las tendencias de utilización de GPU: una tendencia ascendente indica que la tarjeta está activa, mientras que una línea plana significa que está inactiva. Para consultar la tendencia, siga estos pasos:

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la página Prometheus Monitoring, haga clic en la pestaña GPU Monitoring.