Configura el ajuste de escala automático para cargas de trabajo de LLM en GPU con Google Kubernetes Engine (GKE)


En esta página, se muestra cómo configurar tu infraestructura de ajuste de escala automático mediante Horizontal Pod Autoscaler (HPA) de GKE para implementar el modelo de lenguaje grande (LLM) de Gemma con el framework de entrega de la interfaz de generación de texto (TGI) de Hugging Face.

Si deseas obtener más información sobre cómo seleccionar métricas para el ajuste de escala automático, consulta Prácticas recomendadas para el ajuste de escala automático de cargas de trabajo de LLM con GPU en GKE.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Ajusta la escala automáticamente con métricas del servidor

Puedes usar las métricas de rendimiento específicas de la carga de trabajo que emite el servidor de inferencia de TGI para dirigir el ajuste de escala automático de los Pods. Para obtener más información sobre estas métricas, consulta Métricas del servidor.

Para configurar el ajuste de escala automático de las métricas personalizadas con las métricas del servidor, sigue estos pasos:

  1. Exporta las métricas del servidor TGI a Cloud Monitoring. Usas Google Cloud Managed Service para Prometheus, que simplifica la implementación y la configuración de tu colector de Prometheus. Google Cloud Managed Service para Prometheus está habilitado de forma predeterminada en tu clúster de GKE. También puedes habilitarlo manualmente.

    En el siguiente manifiesto de ejemplo, se muestra cómo configurar tu definición de recursos PodMonitoring a fin de dirigir a Google Cloud Managed Service para Prometheus para que recopile métricas de tus Pods en intervalos recurrentes 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. Instala el adaptador de métricas personalizadas de Stackdriver. Este adaptador hace que la métrica personalizada que exportaste a Monitoring sea visible para el controlador de HPA. Si deseas obtener más detalles, consulta Ajuste de escala automático horizontal de Pods en la documentación de Google Cloud Managed Service para Prometheus.

    En el siguiente comando de ejemplo, se muestra cómo instalar el adaptador:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
  3. Configura el recurso de HPA basado en métricas personalizadas. Implementa un recurso de HPA que se base en tu métrica personalizada preferida. Si deseas obtener más detalles, consulta Ajuste de escala automático horizontal de Pods en la documentación de Google Cloud Managed Service para Prometheus.

    Selecciona una de estas pestañas para ver ejemplos de cómo configurar el recurso HorizontalPodAutoscaler en el manifiesto:

    En este ejemplo, se usan las métricas del servidor TGI tgi_queue_size, que representan la cantidad de solicitudes en la cola.

    A fin de determinar el umbral de tamaño correcto de la cola para HPA, consulta Prácticas recomendadas para el ajuste de escala automático de las cargas de trabajo de inferencia de LLM con GPU.

    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

    En este ejemplo, se usa la métrica del servidor TGI tgi_batch_size, que representa la cantidad de solicitudes en el lote actual.

    A fin de determinar el umbral de tamaño correcto del lote para HPA, consulta Prácticas recomendadas para el ajuste de escala automático de las cargas de trabajo de inferencia de LLM con GPU.

    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

Ajusta automáticamente la escala con métricas de GPU

Puedes usar las métricas de uso y rendimiento que emite la GPU para dirigir el ajuste de escala automático de tus Pods. Para obtener más información sobre estas métricas, consulta Métricas de GPU.

Para configurar el ajuste de escala automático de métricas personalizadas con métricas de GPU, sigue estos pasos:

  1. Exporta las métricas de GPU a Cloud Monitoring. Si tu clúster de GKE tiene habilitadas las métricas del sistema, envía de forma automática la métrica de uso de GPU a Cloud Monitoring a través de la métrica del sistema container/accelerator/duty_cycle, cada 60 segundos.

    En el siguiente manifiesto de ejemplo, se muestra cómo configurar tu definición de recursos PodMonitoring para transferir métricas desde la carga de trabajo de 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

    En el código, asegúrate de cambiar el nombre de la métrica de DCGM para usarlo en HPA a minúsculas. Esto se debe a que hay un problema conocido en el que HPA no funciona con nombres de métricas externas en mayúsculas.

  2. Instala el adaptador de métricas personalizadas de Stackdriver. Este adaptador hace que la métrica personalizada que exportaste a Monitoring sea visible para el controlador de HPA. Si deseas obtener más detalles, consulta Ajuste de escala automático horizontal de Pods en la documentación de Google Cloud Managed Service para Prometheus.

    En el siguiente comando de ejemplo, se muestra cómo ejecutar esta instalación:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
  3. Configura el recurso de HPA basado en métricas personalizadas. Implementa un recurso de HPA en función de tu métrica personalizada preferida. Si deseas obtener más detalles, consulta Ajuste de escala automático horizontal de Pods en la documentación de Google Cloud Managed Service para Prometheus.

    • Identifica un objetivo de valor promedio para que HPA active el ajuste de escala automático. Puedes hacerlo de forma experimental; Por ejemplo, generar una carga cada vez mayor en tu servidor y observar dónde alcanza su pico de uso de GPU. Ten en cuenta la tolerancia del HPA, que se establece de forma predeterminada en un rango de no acción de 0.1 alrededor del valor objetivo para disminuir la oscilación.
    • Te recomendamos que uses la herramienta locust-load-inference para realizar pruebas. También puedes crear un panel personalizado de Cloud Monitoring para visualizar el comportamiento de la métrica.

    Selecciona una de estas pestañas para ver un ejemplo de cómo configurar el recurso HorizontalPodAutoscaler en el manifiesto:

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

¿Qué sigue?