Configurar o escalonamento automático para cargas de trabalho LLM em GPUs com o Google Kubernetes Engine (GKE)


Nesta página, mostramos como configurar sua infraestrutura de escalonamento automático usando o Escalonador automático horizontal de pods (HPA) do GKE para implantar o modelo de linguagem grande (LLM) do Gemma com o framework de exibição da Interface de geração de texto (TGI) da Hugging Face.

Para saber mais sobre a seleção de métricas para escalonamento automático, consulte Práticas recomendadas para cargas de trabalho LLM com escalonamento automático com GPUs no GKE.

Antes de começar

Antes de começar, veja se você realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a gcloud CLI anteriormente, instale a versão mais recente executando gcloud components update.

Escalonamento automático usando métricas de servidor

É possível usar as métricas de desempenho específicas da carga de trabalho que são emitidas pelo servidor de inferência TGI para escalonamento automático direto para seus pods. Para saber mais sobre isso, consulte Métricas do servidor.

Para configurar o escalonamento automático de métricas personalizadas com métricas de servidor, siga estas etapas:

  1. Exportar as métricas do servidor TGI para o Cloud Monitoring. Você usa o Google Cloud Managed Service para Prometheus, que simplifica a implantação e a configuração do seu coletor Prometheus. O Google Cloud Managed Service para Prometheus é ativado por padrão nos cluster do GKE. Também é possível ativá-la manualmente.

    O manifesto de exemplo a seguir mostra como configurar a definição do recurso PodMonitoring para direcionar o Google Cloud Managed Service para Prometheus para coletar métricas dos pods em intervalos recorrentes de 15 segundos:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: gemma-pod-monitoring
    spec:
      selector:
        matchLabels:
          app: gemma-server
      endpoints:
      - port: 8000
        interval: 15s
    
  2. Instalar o adaptador de métricas personalizadas do Stackdriver. Com esse adaptador, a métrica personalizada que você exportou para o Monitoring fica visível para o controlador HPA. Para mais detalhes, consulte Escalonamento automático horizontal de pods na documentação do Google Cloud Managed Service para Prometheus.

    O comando de exemplo abaixo mostra como instalar o adaptador:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. Configurar o recurso HPA com base em métricas personalizadas. Implante um recurso HPA baseado na métrica personalizada que preferir. Para mais detalhes, consulte Escalonamento automático horizontal de pods na documentação do Google Cloud Managed Service para Prometheus.

    Selecione uma dessas guias para ver exemplos de como configurar o recurso HorizontalPodAutoscaler no seu manifesto:

    Tamanho da fila

    Este exemplo usa as métricas de servidor TGI tgi_queue_size, que representa o número de solicitações na fila.

    Para determinar o limite correto de tamanho da fila para o HPA, consulte Práticas recomendadas para escalonamento automático de cargas de trabalho de inferência de LLM com GPUs.

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-server
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: Pods
        pods:
          metric:
            name: prometheus.googleapis.com|tgi_queue_size|gauge
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

    Tamanho do lote

    Este exemplo usa a métrica de servidor TGI tgi_batch_size, que representa o número de solicitações do lote atual.

    Para determinar o limite correto de tamanho do lote para o HPA, consulte Práticas recomendadas para escalonamento automático de cargas de trabalho de inferência de LLM com GPUs.

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-server
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: Pods
        pods:
          metric:
            name: prometheus.googleapis.com|tgi_batch_current_size|gauge
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

Escalonamento automático usando métricas da GPU

É possível usar as métricas de uso e desempenho emitidas pela GPU para direcionar o escalonamento automático para seus pods. Para saber mais sobre essas métricas, consulte Métricas da GPU.

Para configurar o escalonamento automático de métricas personalizadas com métricas da GPU, siga estas etapas:

  1. Exportar as métricas da GPU para o Cloud Monitoring. Se o cluster do GKE tem métricas do sistema ativadas, ele envia automaticamente a métrica de utilização da GPU ao Cloud Monitoring usando a métrica do sistema container/accelerator/duty_cycle a cada 60 segundos.

    O manifesto de exemplo a seguir mostra como configurar a definição do recurso PodMonitoring para ingerir métricas da carga de trabalho NVIDIA DCGM:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: nvidia-dcgm-exporter-for-hpa
      namespace: gmp-public
      labels:
        app.kubernetes.io/name: nvidia-dcgm-exporter
        app.kubernetes.io/part-of: google-cloud-managed-prometheus
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: nvidia-dcgm-exporter
      endpoints:
        - port: metrics
          interval: 15s
          metricRelabeling:
            - action: keep
              sourceLabels: [__name__]
            - action: replace
              sourceLabels: [__name__]
              targetLabel: __name__
              regex: DCGM_FI_DEV_GPU_UTIL
              replacement: dcgm_fi_dev_gpu_util
    

    No código, mude o nome da métrica DCGM para uso no HPA para letras minúsculas. Isso ocorre porque há um problema conhecido em que o HPA não funciona com nomes de métricas externas em maiúsculas.

  2. Instalar o adaptador de métricas personalizadas do Stackdriver. Com esse adaptador, a métrica personalizada que você exportou para o Monitoring fica visível para o controlador HPA. Para mais detalhes, consulte Escalonamento automático horizontal de pods na documentação do Google Cloud Managed Service para Prometheus.

    O comando de exemplo a seguir mostra como executar esta instalação:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. Configurar o recurso HPA com base em métricas personalizadas. Implante um recurso HPA baseado na métrica personalizada que preferir. Para mais detalhes, consulte Escalonamento automático horizontal de pods na documentação do Google Cloud Managed Service para Prometheus.

    • Identifique uma meta de valor médio para o HPA acionar o escalonamento automático. Você pode fazer isso de maneira experimental. Por exemplo, gerar carga crescente no servidor e observar o pico de uso da GPU. Esteja atento ao Tolerância de HP: o padrão é um intervalo sem ação de 0,1 ao redor do valor de destino para reduzir a oscilação.
    • Recomendamos o uso da ferramenta locust-load-inference para testes. Também é possível criar um painel personalizado do Cloud Monitoring para visualizar o comportamento da métrica.

    Selecione uma destas guias para ver um exemplo de como configurar o recurso HorizontalPodAutoscaler no seu manifesto:

    Ciclo de trabalho (sistema GKE)

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: External
        external:
          metric:
            name: kubernetes.io|container|accelerator|duty_cycle
            selector:
              matchLabels:
                resource.labels.container_name: inference-server
                resource.labels.namespace_name: default
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

    Ciclo de trabalho (DCGM)

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: External
        external:
          metric:
            name: prometheus.googleapis.com|dcgm_fi_dev_gpu_util|unknown
            selector:
              matchLabels:
                metric.labels.exported_container: inference-server
                metric.labels.exported_namespace: default
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

A seguir