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


In diesem Leitfaden erfahren Sie, wie Sie die Arbeitslastkosten beim Bereitstellen eines Large Language Model (LLM) optimieren. Die GKE-Infrastruktur nutzt eine Kombination aus dem Bereitstellungsmodus „Flex-Start“, Spot-VMs und benutzerdefinierten Profilen für Compute-Klassen, um die Kosten für Arbeitslasten zu optimieren.

In dieser Anleitung wird Mixtral 8x7b als Beispiel für ein LLM verwendet, das Sie bereitstellen können.

Dieser Leitfaden richtet sich an Entwickler für maschinelles Lernen (ML), Plattformadministratoren und ‑operatoren sowie an Daten- und KI-Spezialisten, die Kubernetes-Container-Orchestrierungsfunktionen zum Bereitstellen von LLMs nutzen möchten. 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.

Hintergrund

In diesem Abschnitt werden die verfügbaren Methoden beschrieben, mit denen Sie je nach den Anforderungen Ihrer KI/ML-Arbeitslasten Computing-Ressourcen, einschließlich GPU-Beschleunigern, erhalten können. Diese Verfahren werden in GKE als Strategien zur Verfügbarkeit von Beschleunigern bezeichnet.

GPUs

Mit Grafikprozessoren (GPUs) können Sie bestimmte Arbeitslasten wie maschinelles Lernen und Datenverarbeitung beschleunigen. GKE bietet Knoten mit diesen leistungsstarken GPUs, 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“ ist eine Art der GPU-Reservierung, bei der GKE Ihre GPU-Anfrage beibehält und Ressourcen automatisch bereitstellt, wenn Kapazität verfügbar wird. Verwenden Sie den Bereitstellungsmodus „Flex-Start“ für Arbeitslasten, die eine GPU-Kapazität für einen begrenzten Zeitraum (bis zu sieben Tage) benötigen und kein festes Startdatum haben. Weitere Informationen finden Sie unter Bereitstellungsmodus „flex-start“.

Spot-VMs

Sie können GPUs mit Spot-VMs verwenden, wenn Ihre Arbeitslasten häufige Knotenunterbrechungen tolerieren können. Mit Spot-VMs oder dem Bereitstellungsmodus „Flex-Start“ können Sie die Kosten für die Ausführung von GPUs senken. Die Verwendung von Spot-VMs in Kombination mit dem Bereitstellungsmodus „Flex-Start“ bietet eine Fallback-Option, wenn die Kapazität von Spot-VMs 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 definieren, die von GKE bei Entscheidungen zur Knotenskalaierung priorisiert werden, damit Arbeitslasten auf der 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.

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

Generieren Sie ein neues Hugging Face-Token, falls Sie noch keines haben:

  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 Compute-Klassenprofil. Mit 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 -Konsole eine Cloud Shell-Sitzung. Klicken Sie dazu in der Google Cloud -Konsole auf Symbol für die Cloud Shell-Aktivierung Cloud Shell aktivieren. Im unteren Bereich der Google Cloud Console 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
    

In GKE werden g2-standard-24-Maschinen mit L4-Beschleunigern bereitgestellt. In GKE werden Compute-Klassen verwendet, um Spot-VMs an erster Stelle und den Bereitstellungsmodus mit flexiblem Start an zweiter Stelle zu priorisieren.

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 die Textgenerierungsinference (TGI) festgelegt ist, und nicht der Standardpfad /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 die Bereitstellung eines neuen Pods, wodurch die Knotenpool-Autoskalaierung 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. Knotenpools aufrufen, die von GKE bereitgestellt wurden:

    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 wurden Spot-VMs von GKE bereitgestellt.

Mit curl mit dem Modell interagieren

In diesem Abschnitt wird gezeigt, wie Sie einen einfachen Inferenztest durchführen, 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. Verwenden Sie in einer neuen Terminalsitzung curl, um mit Ihrem Modell zu chatten:

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