Autoscaling für LLM-Arbeitslasten auf GPUs mit Google Kubernetes Engine (GKE) konfigurieren

Auf dieser Seite wird gezeigt, wie Sie die Autoscaling-Infrastruktur mit dem GKE Horizontalen Pod-Autoscaler (HPA) einrichten, um das Gemma Large Language Model (LLM) mit dem Serving-Framework der Benutzeroberfläche zur Textgenerierung (TGI) von Hugging Face bereitzustellen.

Weitere Informationen zum Auswählen von Messwerten für das Autoscaling finden Sie unter Best Practices für das Autoscaling von LLM-Arbeitslasten mit GPUs in GKE.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diesen Task verwenden möchten, installieren und dann initialisieren Sie die gcloud CLI. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem gcloud components update Befehl ab. Ältere gcloud CLI-Versionen unterstützen möglicherweise nicht die Ausführung der Befehle in diesem Dokument.

Autoscaling mit Servermesswerten

Sie können die arbeitslastspezifischen Leistungsmesswerte verwenden, die vom TGI-Inferenzserver ausgegeben werden, um das Autoscaling für Ihre Pods auszurichten. Weitere Informationen zu diesen Messwerten finden Sie unter Servermesswerte.

So richten Sie das Autoscaling anhand von benutzerdefinierten Messwerten mit Servermesswerten ein:

  1. Exportieren Sie die Messwerte vom TGI-Server nach Cloud Monitoring. Sie verwenden Google Cloud Managed Service for Prometheus, wodurch die Bereitstellung und Konfiguration Ihres Prometheus Collectors vereinfacht wird. Google Cloud Managed Service for Prometheus ist in Ihrem GKE-Cluster standardmäßig aktiviert. Sie können es auch manuell aktivieren.

    Das folgende Beispielmanifest zeigt, wie Sie die PodMonitoring-Ressourcendefinition einrichten, um Google Cloud Managed Service for Prometheus anzuweisen, Messwerte in wiederkehrenden Intervallen von 15 Sekunden aus Ihren Pods zu erfassen:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: gemma-pod-monitoring
    spec:
      selector:
        matchLabels:
          app: gemma-server
      endpoints:
      - port: 8000
        interval: 15s
    
  2. Installieren Sie den Stackdriver-Adapter für benutzerdefinierte Messwerte. Dieser Adapter macht den benutzerdefinierten Messwert, den Sie nach Monitoring exportiert haben, für den HPA-Controller sichtbar. Weitere Informationen finden Sie unter Horizontales Pod-Autoscaling in der Dokumentation zu Google Cloud Managed Service for Prometheus.

    Der folgende Beispielbefehl zeigt, wie Sie den Adapter installieren:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. Richten Sie die HPA-Ressource für benutzerdefinierte Messwerte ein. Stellen Sie eine HPA-Ressource bereit, die auf Ihrem bevorzugten benutzerdefinierten Messwert basiert. Weitere Informationen finden Sie unter Horizontales Pod-Autoscaling in der Dokumentation zu Google Cloud Managed Service for Prometheus.

    Wählen Sie einen der folgenden Tabs aus, um Beispiele für die Konfiguration der HorizontalPodAutoscaler Ressource in Ihrem Manifest zu sehen:

    Warteschlangengröße

    In diesem Beispiel werden die TGI-Servermesswerte tgi_queue_size verwendet, die die Anzahl der Anfragen in der Warteschlange darstellen.

    Informationen zum Bestimmen des richtigen Schwellenwerts für die Warteschlangengröße für HPA finden Sie unter Best Practices für das Autoscaling von LLM-Inferenzarbeitslasten mit 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
    

    Batchgröße

    In diesem Beispiel wird der TGI-Servermesswert tgi_batch_size verwendet, der die Anzahl der Anfragen im aktuellen Batch darstellt.

    Informationen zum Bestimmen des richtigen Schwellenwerts für die Batchgröße für HPA finden Sie unter Best Practices für das Autoscaling von LLM-Inferenzarbeitslasten mit 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
    

Autoscaling mit GPU-Messwerten

Sie können die von der GPU ausgegebenen Nutzungs- und Leistungsmesswerte verwenden, um das Autoscaling für Ihre Pods auszurichten. Weitere Informationen zu diesen Messwerten finden Sie unter GPU-Messwerte.

So richten Sie das Autoscaling anhand von benutzerdefinierten Messwerten mit GPU-Messwerten ein:

  1. Exportieren Sie die GPU-Messwerte nach Cloud Monitoring. Wenn für Ihren GKE Cluster Systemmesswerte aktiviert sind, wird der Messwert für die GPU-Auslastung alle 60 Sekunden automatisch über den container/accelerator/duty_cycle Systemmesswert an Cloud Monitoring gesendet.

    Das folgende Beispielmanifest zeigt, wie Sie die PodMonitoring-Ressourcendefinition einrichten, um Messwerte aus der NVIDIA DCGM-Arbeitslast zu erfassen:

    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
    

    Stellen Sie sicher, dass Sie im Code den DCGM-Messwertnamen zur Verwendung in HPA in Kleinbuchstaben ändern. Diese Notwendigkeit liegt daran, dass es ein bekanntes Problem gibt, bei dem HPA nicht mit externen Messwertnamen in Großbuchstaben funktioniert. Bei Clustern, die keinen verwalteten DCGM-Exporter verwenden, müssen die metadata.namespace und spec.selector.matchLabels des HPA mit der Konfiguration des DCGM-Exporters übereinstimmen.Diese genaue Übereinstimmung ist entscheidend für die erfolgreiche Erkennung und Abfrage benutzerdefinierter Messwerte durch den HPA.

  2. Installieren Sie den Stackdriver-Adapter für benutzerdefinierte Messwerte. Dieser Adapter macht den benutzerdefinierten Messwert, den Sie nach Monitoring exportiert haben, für den HPA-Controller sichtbar. Weitere Informationen finden Sie unter Horizontales Pod-Autoscaling in der Dokumentation zu Google Cloud Managed Service for Prometheus.

    Der folgende Beispielbefehl zeigt, wie Sie diese Installation ausführen:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. Richten Sie die HPA-Ressource für benutzerdefinierte Messwerte ein. Stellen Sie eine HPA-Ressource bereit, die auf Ihrem bevorzugten benutzerdefinierten Messwert basiert. Weitere Informationen finden Sie unter Horizontales Pod-Autoscaling in der Dokumentation zu Google Cloud Managed Service for Prometheus.

    • Legen Sie ein Ziel für den Durchschnittswert fest, mit dem das Autoscaling ausgelöst werden soll. Sie können dies experimentell tun. Generieren Sie beispielsweise eine zunehmende Last auf Ihrem Server und beobachten Sie, wo die GPU-Auslastung Spitzen aufweist. Achten Sie auf die HPA-Toleranz, die standardmäßig bei einem Nicht-Aktionsbereich von 0,1 um den Zielwert liegt, um Schwankungen zu dämpfene.
    • Wir empfehlen, das Tool locust-load-inference für Tests zu verwenden. Sie können auch ein benutzerdefiniertes Dashboard in Cloud Monitoring erstellen, um das Verhalten des Messwerts zu visualisieren.

    Wählen Sie einen der folgenden Tabs aus, um ein Beispiel für die Konfiguration der HorizontalPodAutoscaler Ressource in Ihrem Manifest zu sehen:

    Arbeitszyklus (GKE-System)

    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
    

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

Nächste Schritte