Configurare la scalabilità automatica per i carichi di lavoro LLM su GPU con Google Kubernetes Engine (GKE)


Questa pagina mostra come configurare l'infrastruttura di scalabilità automatica utilizzando Horizontal Pod Autoscaler (HPA) di GKE per eseguire il deployment del modello linguistico di grandi dimensioni (LLM) Gemma con il framework di pubblicazione Text Generation Interface (TGI) di Hugging Face.

Per saperne di più sulla selezione delle metriche per la scalabilità automatica, consulta Best practice per la scalabilità automatica dei carichi di lavoro LLM con GPU su GKE.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.

Scalabilità automatica utilizzando le metriche del server

Puoi utilizzare le metriche di rendimento specifiche del workload emesse dal server di inferenza TGI per indirizzare la scalabilità automatica per i tuoi pod. Per scoprire di più su queste metriche, consulta Metriche del server.

Per configurare la scalabilità automatica delle metriche personalizzate con le metriche del server:

  1. Esporta le metriche dal server TGI a Cloud Monitoring. Utilizzi Google Cloud Managed Service per Prometheus, che semplifica il deployment e la configurazione del raccoglitore Prometheus. Google Cloud Managed Service per Prometheus è abilitato per impostazione predefinita nel tuo cluster GKE; puoi anche abilitarlo manualmente.

    Il seguente manifest di esempio mostra come configurare la definizione della risorsa PodMonitoring per indicare a Google Cloud Managed Service per Prometheus di eseguire lo scraping delle metriche dai tuoi pod a intervalli ricorrenti di 15 secondi:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: gemma-pod-monitoring
    spec:
      selector:
        matchLabels:
          app: gemma-server
      endpoints:
      - port: 8000
        interval: 15s
    
  2. Installa l'adattatore Stackdriver delle metriche personalizzate. Questo adattatore rende la metrica personalizzata che hai esportato in Monitoring visibile al controller HPA. Per maggiori dettagli, vedi Scalabilità automatica orizzontale dei pod nella documentazione di Google Cloud Managed Service per Prometheus.

    Il seguente comando di esempio mostra come installare l'adattatore:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. Configura la risorsa HPA basata su metrica personalizzata personalizzate. Esegui il deployment di una risorsa HPA basata sulla metrica personalizzata che preferisci. Per maggiori dettagli, vedi Scalabilità automatica orizzontale dei pod nella documentazione di Google Cloud Managed Service per Prometheus.

    Seleziona una di queste schede per visualizzare esempi di come configurare la risorsa HorizontalPodAutoscaler nel manifest:

    Dimensione della coda

    Questo esempio utilizza le metriche del server tgi_queue_size TGI, che rappresentano il numero di richieste nella coda.

    Per determinare la soglia di dimensione della coda corretta per HPA, consulta Best practice per il autoscaling dei carichi di lavoro di inferenza 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
    

    Dimensione del batch

    Questo esempio utilizza la metrica del server tgi_batch_size TGI, che rappresenta il numero di richieste nel batch corrente.

    Per determinare la soglia delle dimensioni del batch corretta per HPA, consulta Best practice per il autoscaling dei carichi di lavoro di inferenza 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
    

Scalabilità automatica utilizzando le metriche GPU

Puoi utilizzare le metriche di utilizzo e rendimento emesse dalla GPU per indirizzare lo scalabilità automatica per i tuoi pod. Per saperne di più su queste metriche, consulta Metriche GPU.

Per configurare la scalabilità automatica basata su metriche personalizzate con le metriche della GPU:

  1. Esporta le metriche della GPU in Cloud Monitoring. Se il tuo cluster GKE ha attivato le metriche di sistema, invia automaticamente la metrica di utilizzo della GPU a Cloud Monitoring tramite la metrica di sistema container/accelerator/duty_cycle ogni 60 secondi.

    Il seguente manifest di esempio mostra come configurare la definizione della risorsa PodMonitoring per importare le metriche dal carico di lavoro NVIDIA DCGM:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: nvidia-dcgm-exporter-for-hpa
      namespace: gke-managed-system
      labels:
        app.kubernetes.io/name: nvidia-dcgm-exporter
        app.kubernetes.io/part-of: google-cloud-managed-prometheus
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: gke-managed-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
    

    Nel codice, assicurati di convertire in minuscolo il nome della metrica DCGM da utilizzare in HPA. Questo perché esiste un problema noto per cui HPA non funziona con i nomi delle metriche esterne in maiuscolo. Per i cluster che non utilizzano un esportatore DCGM gestito, assicurati che metadata.namespace e spec.selector.matchLabels dell'HPA corrispondano esattamente alla configurazione dell'esportatore DCGM.Questo allineamento preciso è fondamentale per l'individuazione e l'interrogazione delle metrica personalizzata da parte dell'HPA.

  2. Installa l'adattatore Stackdriver delle metriche personalizzate. Questo adattatore rende la metrica personalizzata che hai esportato in Monitoring visibile al controller HPA. Per maggiori dettagli, vedi Scalabilità automatica orizzontale dei pod nella documentazione di Google Cloud Managed Service per Prometheus.

    Il seguente comando di esempio mostra come eseguire questa installazione:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. Configura la risorsa HPA basata su metrica personalizzata personalizzate. Esegui il deployment di una risorsa HPA in base alla metrica personalizzata che preferisci. Per maggiori dettagli, vedi Scalabilità automatica orizzontale dei pod nella documentazione di Google Cloud Managed Service per Prometheus.

    • Identifica un target di valore medio per HPA per attivare la scalabilità automatica. Puoi farlo in modo sperimentale, ad esempio generando un carico crescente sul server e osservando dove raggiunge il picco di utilizzo della GPU. Tieni presente la tolleranza HPA, che per impostazione predefinita è un intervallo di nessuna azione di 0,1 intorno al valore target per smorzare l'oscillazione.
    • Per i test, ti consigliamo di utilizzare lo strumento di inferenza del carico di locust. Puoi anche creare una dashboard personalizzata di Cloud Monitoring per visualizzare il comportamento della metrica.

    Seleziona una di queste schede per visualizzare un esempio di come configurare la risorsa HorizontalPodAutoscaler nel manifest:

    Ciclo di servizio (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 di servizio (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
    

Passaggi successivi