Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Configure auto scaling with GPU metrics

Última atualização: Jun 27, 2026

Utilize as Custom Metrics do Kubernetes e o Managed Service for Prometheus para coletar métricas de GPU e dimensionar containers automaticamente com o HPA.Managed Service for Prometheus e use HPA para dimensionar os containers automaticamente.

Pré-requisitos

Um nó de GPU foi adicionado ao seu cluster ou um cluster dedicado de GPU foi criado.

Como funciona

As GPUs aceleram a computação em cenários como treinamento e inferência de modelos de deep learning. O dimensionamento automático baseado em métricas de GPU, como utilização e memória, ajuda a otimizar custos.

O Horizontal Pod Autoscaler (HPA) do Kubernetes utiliza métricas de CPU e memória por padrão. Para métricas de GPU, o Prometheus Adapter busca dados no Managed Service for Prometheus e os expõe por meio da Custom Metrics API. Em seguida, o HPA dimensiona as cargas de trabalho com base na utilização da GPU, uso de memória e outros indicadores. O diagrama a seguir ilustra o processo.

Etapa 1: Implantar o Prometheus e o adaptador de métricas

  1. Ative o monitoramento do Prometheus para o seu cluster.

    Nota

    Pule esta etapa se o Prometheus já tiver sido instalado durante a criação do cluster.

  2. Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em Operations > Prometheus Monitoring.

  3. Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em Applications > Helm.

  4. No painel de navegação à esquerda, escolha Managed Service for Prometheus > Instances.

  5. Instale e configure o ack-alibaba-cloud-metrics-adapter.

    1. Obter a URL da API HTTP

    1. Faça login no console do ARMS.

    2. Selecione a região do seu cluster ACK. Clique em instância desejada.

    3. Na página Settings, na aba Settings, copie o endereço de rede interna do campo HTTP API Address (Grafana Read Address).

    2. Configurar a URL do Prometheus

    1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Marketplace > Marketplace.

    2. Na página Marketplace, clique em aba App Catalog. Pesquise por ack-alibaba-cloud-metrics-adapter e clique em ele.

    3. Na página do ack-alibaba-cloud-metrics-adapter, clique em Deploy.

    4. No assistente de Basic Information, selecione seu cluster e namespace. Clique em Next.

    5. No assistente de Parameters, selecione uma Chart Version. Na seção Parameters, defina o parâmetro url como a URL da API HTTP copiada. Clique em OK.

Etapa 2: Configure regras do adaptador

1. Visualize métricas de GPU

Para ver as métricas de GPU disponíveis, consulte Descrições das métricas de monitoramento.

2. Configure regras do adaptador

  1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na lista do Helm, localize o ack-alibaba-cloud-metrics-adapter. Na coluna Actions, clique em Update. Adicione as seguintes rules ao campo custom.

    Clique em expandir as regras

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

    Configuração completa após adicionar as regras:

    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

    Verifique a configuração. A saída deve conter métricas como DCGM_FI_DEV_GPU_UTIL, DCGM_CUSTOM_PROCESS_SM_UTIL, DCGM_FI_DEV_FB_USED e DCGM_CUSTOM_PROCESS_MEM_USED. O exemplo a seguir destaca DCGM_CUSTOM_PROCESS_SM_UTIL; sua saída real pode variar.

    Clique em expandir o exemplo de saída

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

    Saída esperada: O array resources contém 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"
          ]
        }
      ]
    }

Etapa 3: Implementar o dimensionamento automático

Teste o dimensionamento automático implantando um serviço de inferência de GPU, executando um teste de estresse e observando o comportamento de dimensionamento baseado em GPU.

1. Implantar o serviço de inferência

  1. Implante o serviço de inferência.

    Clique em expandir os detalhes do 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. Verifique o status do Pod e do Service.

    • Verifique o status do Pod.

      kubectl get pods -o wide

      Saída 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>

      Um Pod está implantado no nó de GPU 192.168.94.107.

    • Verifique o status do Service.

      kubectl get svc bert-intent-detection-svc

      Saída 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

      A saída exibe o nome do serviço, confirmando que o Service foi implantado com sucesso.

  3. Acesse o nó de GPU 192.168.94.107 via SSH e verifique o uso da GPU.

    nvidia-smi

    Saída 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 |
    +-----------------------------------------------------------------------------+

    A saída mostra o serviço de inferência em execução na GPU. A utilização da GPU é de 0% porque nenhuma requisição foi recebida ainda.

  4. Valide a implantação do serviço de inferência.

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

    Saída 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.

    Um código de status 200 com um resultado de reconhecimento de intenção confirma a implantação bem-sucedida.

2. Configure o HPA

Este exemplo aciona o scale-out quando a utilização da GPU do Pod ultrapassa 20%. A tabela a seguir lista as métricas suportadas pelo HPA.

Métrica

Descrição

Unidade

DCGM_FI_DEV_GPU_UTIL

  • Utilização da placa GPU.

  • Esta métrica aplica-se apenas ao agendamento dedicado de GPU.

    Importante

    Em cenários de GPU compartilhada, a NVIDIA fornece apenas a utilização no nível da placa, não métricas por aplicação. Execute nvidia-smi dentro de um Pod mostra a utilização de toda a placa.

%

DCGM_FI_DEV_FB_USED

  • Uso de memória da placa GPU.

  • Esta métrica aplica-se apenas ao agendamento dedicado de GPU.

MiB

DCGM_CUSTOM_PROCESS_SM_UTIL

Utilização da GPU pelo container.

%

DCGM_CUSTOM_PROCESS_MEM_USED

Uso de memória da GPU pelo container.

MiB

DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO

Taxa de utilização de memória da GPU pelo container.

Utilização de memória da GPU pelo container = Memória GPU real usada pelo container / Memória GPU alocada para o container

%

  1. Implante o HPA.

    Versão do cluster ≥ 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

    Versão do cluster < 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. Verifique o status do HPA.

    kubectl get hpa

    Saída esperada:

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

    TARGETS exibe 0/20, indicando que a utilização atual da GPU é 0. O dimensionamento automático é acionado quando a utilização excede 20%.

3. Testar o dimensionamento automático

Testar scale-out

  1. Execute um teste de estresse.

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

    O HPA calcula as réplicas desejadas com: Desired Replicas = ceil[Current Replicas * (Current Metric / Desired Metric)]. Por exemplo, com 1 réplica, valor da métrica 23 e alvo 20, o resultado é 2 réplicas.

  2. Durante o teste de estresse, observe o status do HPA e dos Pods.

    1. Verifique o status do HPA.

      kubectl get hpa

      Saída esperada:

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

      TARGETS exibe 23/20. A utilização da GPU excedeu a meta de 20%, acionando o scale-out.

    2. Verifique o status do Pod.

      kubectl get pods

      Saída 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

      Dois Pods estão em execução, correspondendo ao alvo de 2.

    Scale-out confirmado.

Testar scale-in

Após o término do teste de estresse, a utilização da GPU cai abaixo de 20% e o scale-in começa.

  1. Verifique o status do HPA.

    kubectl get hpa

    Saída esperada:

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

    TARGETS exibe 0/20 , indicando que a utilização da GPU é 0. Após cerca de 5 minutos, o scale-in começa.

  2. Verifique o status do Pod.

    kubectl get pods

    Saída esperada:

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

    Apenas um Pod permanece, confirmando o scale-in.

FAQ

Como verificar o uso da GPU?

Na aba GPU Monitoring, observe as tendências de utilização da GPU: uma tendência crescente indica uma placa ativa, enquanto uma tendência plana significa ociosidade. Para visualizar a tendência:

  1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Prometheus Monitoring, clique em aba GPU Monitoring.