LLMs in GKE mit einer kostenoptimierten und hoch verfügbaren GPU-Bereitstellungsstrategie bereitstellen


In diesem Leitfaden erfahren Sie, wie Sie die Kosten für Arbeitslasten zum Bereitstellen von LLMs in GKE optimieren. In dieser Anleitung wird eine Kombination aus Flex-Start, Spot-VMs und benutzerdefinierten Profilen für Compute-Klassen für kostengünstige Inferenz verwendet.

In dieser Anleitung wird Mixtral 8x7b als Beispiel-LLM verwendet, das Sie bereitstellen können.

Dieser Leitfaden richtet sich an ML-Entwickler (Machine Learning), Plattformadministratoren und ‑operatoren sowie an Daten- und KI-Spezialisten, die daran interessiert sind, Kubernetes-Container-Orchestrierungsfunktionen zum Bereitstellen von LLMs zu nutzen. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud Inhalten verweisen, finden Sie unter Häufig verwendete GKE Enterprise-Nutzerrollen und -Aufgaben.

Flex-Start-Preise

Flex-Start wird empfohlen, wenn für Ihre Arbeitslast dynamisch bereitgestellte Ressourcen nach Bedarf für bis zu sieben Tage mit kurzfristigen Reservierungen, ohne komplexes Kontingentmanagement und kostengünstigen Zugriff erforderlich sind. Flex-Start basiert auf dem Dynamic Workload Scheduler und wird gemäß der Preisgestaltung für den Dynamic Workload Scheduler abgerechnet:

  • Rabattiert (bis zu 53%) für vCPUs, GPUs und TPUs.
  • Sie zahlen nur für die tatsächliche Nutzung.

Hintergrund

In diesem Abschnitt werden die verfügbaren Techniken beschrieben, mit denen Sie basierend auf den Anforderungen Ihrer KI-/ML-Arbeitslasten Rechenressourcen, einschließlich GPU-Beschleunigern, erhalten können. Diese Verfahren werden in GKE als Strategien für die Beschaffung von Beschleunigern bezeichnet.

GPUs

Mit Grafikprozessoren (GPUs) können Sie bestimmte Arbeitslasten wie maschinelles Lernen und Datenverarbeitung beschleunigen. GKE bietet Knoten, die mit diesen leistungsstarken GPUs ausgestattet sind, um die Leistung von Aufgaben für maschinelles Lernen und Datenverarbeitung zu optimieren. GKE bietet eine Reihe von Maschinentypoptionen für die Knotenkonfiguration, einschließlich Maschinentypen mit NVIDIA H100-, A100- und L4-GPUs.

Weitere Informationen finden Sie unter GPUs in GKE.

Bereitstellungsmodus „Flex-Start“

Der Bereitstellungsmodus „Flex-Start“ basiert auf dem Dynamic Workload Scheduler. Bei diesem GPU-Nutzungstyp wird Ihre GPU-Anfrage in GKE beibehalten und Ressourcen werden automatisch bereitgestellt, wenn Kapazität verfügbar wird. Erwägen Sie die Verwendung von Flex-Start für Arbeitslasten, die für einen begrenzten Zeitraum von bis zu sieben Tagen GPU-Kapazität benötigen und kein festes Startdatum haben. Weitere Informationen finden Sie unter flex-start.

Spot-VMs

Sie können GPUs mit Spot-VMs verwenden, wenn Ihre Arbeitslasten häufige Knotenunterbrechungen tolerieren können. Bei Verwendung von Spot-VMs oder Flex-Start reduziert sich der Preis für die Ausführung von GPUs. Die Verwendung von Spot-VMs in Kombination mit Flex-Start bietet eine Fallback-Option, wenn die Spot-VM-Kapazität nicht verfügbar ist.

Weitere Informationen finden Sie unter Spot-VMs mit GPU-Knotenpools verwenden.

Benutzerdefinierte Compute-Klassen

Sie können GPUs mit benutzerdefinierten Compute-Klassen anfordern. Mit benutzerdefinierten Compute-Klassen können Sie eine Hierarchie von Knotenkonfigurationen für GKE definieren, die bei Entscheidungen zur Knotenskalierung priorisiert werden sollen, damit Arbeitslasten auf der von Ihnen ausgewählten Hardware ausgeführt werden. Weitere Informationen finden Sie unter Benutzerdefinierte Compute-Klassen.

Hinweise

  • Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • Make sure that you have the following role or roles on the project:

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Zu IAM
    2. Wählen Sie das Projekt aus.
    3. Klicken Sie auf Zugriff erlauben.
    4. Geben Sie im Feld Neue Hauptkonten Ihre Nutzer-ID ein. Dies ist in der Regel die E-Mail-Adresse eines Google-Kontos.

    5. Wählen Sie in der Liste Rolle auswählen eine Rolle aus.
    6. Wenn Sie weitere Rollen hinzufügen möchten, klicken Sie auf Weitere Rolle hinzufügen und fügen Sie weitere Rollen hinzu.
    7. Klicken Sie auf Speichern.

Zugriff auf das Modell erhalten

Falls noch nicht geschehen, generieren Sie ein neues Hugging Face-Token:

  1. Klicken Sie auf Profil > Einstellungen > Zugriffstokens.
  2. Wählen Sie Neues Token aus.
  3. Geben Sie einen Namen Ihrer Wahl und eine Rolle von mindestens Read an.
  4. Wählen Sie Token generieren aus.

Benutzerdefiniertes Compute-Klassenprofil erstellen

In diesem Abschnitt erstellen Sie ein benutzerdefiniertes Profil für die Compute-Klasse. In benutzerdefinierten Profilen für Rechenklassen werden die Typen und Beziehungen zwischen mehreren Rechenressourcen definiert, die von Ihrer Arbeitslast verwendet werden.

  1. Starten Sie in der Google Cloud Console eine Cloud Shell-Sitzung. Klicken Sie dazu in der Google Cloud Console auf Symbol für die Cloud Shell-Aktivierung Cloud Shell aktivieren. Im unteren Bereich der Google Cloud -Konsole wird eine Sitzung geöffnet.
  2. Erstellen Sie eine dws-flex-start.yaml-Manifestdatei:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: dws-model-inference-class
    spec:
      priorities:
        - machineType: g2-standard-24
          spot: true
        - machineType: g2-standard-24
          flexStart:
            enabled: true
            nodeRecycling:
              leadTimeSeconds: 3600
      nodePoolAutoCreation:
        enabled: true
    
  3. Wenden Sie das dws-flex-start.yaml-Manifest an:

    kubectl apply -f dws-flex-start.yaml
    

GKE stellt g2-standard-24-Maschinen mit L4-Beschleunigern bereit. GKE verwendet Compute-Klassen, um Spot-VMs zu priorisieren und Flex-Start an zweiter Stelle zu platzieren.

LLM-Arbeitslast bereitstellen

  1. Erstellen Sie mit dem folgenden Befehl ein Kubernetes-Secret, das das Hugging Face-Token enthält:

    kubectl create secret generic model-inference-secret \
        --from-literal=HUGGING_FACE_TOKEN=HUGGING_FACE_TOKEN \
        --dry-run=client -o yaml | kubectl apply -f -
    

    Ersetzen Sie HUGGING_FACE_TOKEN durch Ihr Hugging Face-Zugriffstoken.

  2. Erstellen Sie eine Datei mit dem Namen mixtral-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: inference-mixtral-ccc
    spec:
      nodeSelector:
        cloud.google.com/compute-class: dws-model-inference-class
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          containers:
          - name: llm
            image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311
            resources:
              requests:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
              limits:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
            env:
            - name: MODEL_ID
              value: mistralai/Mixtral-8x7B-Instruct-v0.1
            - name: NUM_SHARD
              value: "2"
            - name: PORT
              value: "8080"
            - name: QUANTIZE
              value: bitsandbytes-nf4
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: model-inference-secret
                  key: HUGGING_FACE_TOKEN
            volumeMounts:
              - mountPath: /dev/shm
                name: dshm
              - mountPath: /tmp
                name: ephemeral-volume
          volumes:
            - name: dshm
              emptyDir:
                  medium: Memory
            - name: ephemeral-volume
              ephemeral:
                volumeClaimTemplate:
                  metadata:
                    labels:
                      type: ephemeral
                  spec:
                    accessModes: ["ReadWriteOnce"]
                    storageClassName: "premium-rwo"
                    resources:
                      requests:
                        storage: 100Gi
    

    In diesem Manifest ist das Feld mountPath auf /tmp festgelegt, da dies der Pfad ist, auf den die Umgebungsvariable HF_HOME im Deep Learning Container (DLC) für Text Generation Inference (TGI) festgelegt ist, anstelle des Standardpfads /data, der im TGI-Standard-Image festgelegt ist. Das heruntergeladene Modell wird in diesem Verzeichnis gespeichert.

  3. Modell bereitstellen:

    kubectl apply -f  mixtral-deployment.yaml
    

    GKE plant einen neuen Pod für die Bereitstellung, wodurch der Autoscaler für Knotenpools einen zweiten Knoten hinzufügt, bevor das zweite Replikat des Modells bereitgestellt wird.

  4. Prüfen Sie den Status des Modells:

    watch kubectl get deploy inference-mixtral-ccc
    

    Wenn das Modell erfolgreich bereitgestellt wurde, sieht die Ausgabe in etwa so aus:

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    inference-mixtral-ccc  1/1     1            1           10m
    

    Drücken Sie CTRL + C, um die Smartwatch zu beenden.

  5. So rufen Sie die von GKE bereitgestellten Knotenpools auf:

    kubectl get nodes -L cloud.google.com/gke-nodepool
    

    Die Ausgabe sieht etwa so aus:

      NAME                                                  STATUS   ROLES    AGE   VERSION               GKE-NODEPOOL
      gke-flex-na-nap-g2-standard--0723b782-fg7v   Ready    <none>   10m   v1.32.3-gke.1152000   nap-g2-standard-24-spot-gpu2-1gbdlbxz
      gke-flex-nap-zo-default-pool-09f6fe53-fzm8   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-lv2v   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-pq6m   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
    

    Der Name des erstellten Knotenpools gibt den Maschinentyp an. In diesem Fall hat GKE Spot-VMs bereitgestellt.

Mit dem Modell über curl interagieren

In diesem Abschnitt wird gezeigt, wie Sie einen einfachen Inferenztest durchführen können, um Ihr bereitgestelltes Modell zu prüfen.

  1. Richten Sie die Portweiterleitung zum Modell ein:

    kubectl port-forward service/llm-service 8080:8080
    

    Die Ausgabe sieht etwa so aus:

    Forwarding from 127.0.0.1:8080 -> 8080
    
  2. Chatten Sie in einer neuen Terminalsitzung mit Ihrem Modell, indem Sie curl verwenden:

    curl http://localhost:8080/v1/completions \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{
        "model": "mixtral-8x7b-instruct-gptq",
        "prompt": "<s>[INST]Who was the first president of the United States?[/INST]",
        "max_tokens": 40}'
    

    Die Ausgabe sieht dann ungefähr so aus:

    George Washington was a Founding Father and the first president of the United States, serving from 1789 to 1797.
    

Bereinigen

Damit Ihrem Google Cloud -Konto die auf dieser Seite verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen, das die Ressourcen enthält, oder das Projekt beibehalten und die einzelnen Ressourcen löschen.

Projekt löschen

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Einzelne Ressource löschen

  1. Löschen Sie die Kubernetes-Ressourcen, die Sie anhand dieser Anleitung erstellt haben:

    kubectl delete deployment inference-mixtral-ccc
    kubectl delete service llm-service
    kubectl delete computeclass dws-model-inference-class
    kubectl delete secret model-inference-secret
    
  2. Löschen Sie den Cluster:

    gcloud container clusters delete CLUSTER_NAME
    

Nächste Schritte