In diesem Leitfaden erfahren Sie, wie Sie ein Large Language Model (LLM) mit Tensor Processing Units (TPUs) in der Google Kubernetes Engine (GKE) mit JetStream über PyTorch bereitstellen. In dieser Anleitung laden Sie Modellgewichte in Cloud Storage herunter und stellen sie in einem GKE-Autopilot- oder Standard-Cluster mit einem Container bereit, in dem JetStream ausgeführt wird.
Wenn Sie beim Bereitstellen Ihres Modells in JetStream die Skalierbarkeit, Robustheit und Kosteneffizienz der Kubernetes-Features benötigen, ist dieser Leitfaden ein guter Ausgangspunkt.
Dieser Leitfaden richtet sich an Kunden von generativer KI, die PyTorch verwenden, neue oder bestehende Nutzer von GKE, ML-Entwickler, MLOps-Entwickler (DevOps) oder Plattformadministratoren, die daran interessiert sind, Kubernetes-Container-Orchestrierungsfunktionen zu nutzen, um LLMs bereitzustellen.
Hintergrund
Wenn Sie ein LLM mit TPUs in GKE mit JetStream bereitstellen, können Sie eine robuste, produktionsreife Bereitstellungslösung mit allen Vorteilen von verwaltetem Kubernetes erstellen, einschließlich Kosteneffizienz, Skalierbarkeit und höherer Verfügbarkeit. In diesem Abschnitt werden die in dieser Anleitung verwendeten Schlüsseltechnologien beschrieben.
TPUs
TPUs sind von Google speziell entwickelte anwendungsspezifische integrierte Schaltungen (Application-Specific Integrated Circuits, ASICs), die verwendet werden, um das maschinelle Lernen und die KI-Modelle zu beschleunigen, die mit Frameworks wie folgenden erstellt wurden:TensorFlow, PyTorch und JAX.
Bevor Sie TPUs in GKE verwenden, sollten Sie den folgenden Lernpfad durcharbeiten:
- Lernen Sie mehr über die aktuelle Verfügbarkeit von TPU-Versionen unter Cloud TPU-Systemarchitektur.
- TPUs in GKE
In dieser Anleitung wird das Bereitstellen verschiedener LLM-Modelle beschrieben. GKE stellt das Modell auf TPUv5e-Knoten mit einem einzelnen Host bereit. Dabei werden TPU-Topologien basierend auf den Modellanforderungen für die Bereitstellung von Eingabeaufforderungen mit niedriger Latenz konfiguriert.
JetStream
JetStream ist ein von Google entwickeltes Open-Source-Framework zur Bereitstellung von Inferenzen. JetStream ermöglicht leistungsstarke, durchsatzintensive und speicheroptimierte Inferenz auf TPUs und GPUs. JetStream bietet erweiterte Leistungsoptimierungen, einschließlich kontinuierlicher Batchverarbeitung, KV-Cache-Optimierungen und Quantisierungstechniken, um die LLM-Bereitstellung zu erleichtern. JetStream ermöglicht die PyTorch/XLA- und JAX-TPU-Bereitstellung, um eine optimale Leistung zu erzielen.
Kontinuierliche Batchverarbeitung
Beim kontinuierlichen Batching werden eingehende Inferenzanfragen dynamisch in Batches gruppiert, um die Latenz zu reduzieren und den Durchsatz zu erhöhen.
KV-Cache-Quantisierung
Bei der KV-Cache-Quantisierung wird der Schlüssel/Wert-Cache komprimiert, der in Aufmerksamkeitsmechanismen verwendet wird, wodurch die Arbeitsspeicheranforderungen reduziert werden.
Int8-Gewichtsquantisierung
Bei der Quantisierung von Int8-Gewichten wird die Genauigkeit der Modellgewichte von 32-Bit-Gleitkommazahlen auf 8-Bit-Ganzzahlen reduziert. Dies führt zu einer schnelleren Berechnung und einer geringeren Speichernutzung.
Weitere Informationen zu diesen Optimierungen finden Sie in den Projekt-Repositories JetStream PyTorch und JetStream MaxText.
PyTorch
PyTorch ist ein Open-Source-Framework für maschinelles Lernen, das von Meta entwickelt wurde und jetzt zur Linux Foundation gehört. PyTorch bietet Hochleistungsfunktionen wie Tensorberechnung und Deep-Learning-Netzwerke.
Lernziele
- Bereiten Sie einen GKE Autopilot- oder Standardcluster mit der empfohlenen TPU-Topologie anhand der Modelleigenschaften vor.
- JetStream-Komponenten in GKE bereitstellen
- Rufen Sie Ihr Modell ab und veröffentlichen Sie es.
- Stellen Sie das veröffentlichte Modell bereit und interagieren Sie damit.
Architektur
In diesem Abschnitt wird die in dieser Anleitung verwendete GKE-Architektur beschrieben. Die Architektur umfasst einen GKE Autopilot- oder Standardcluster, der TPUs bereitstellt und JetStream-Komponenten zum Bereitstellen und Bereitstellen der Modelle hostet.
Das folgende Diagramm zeigt die Komponenten dieser Architektur:
Diese Architektur umfasst die folgenden Komponenten:
- Regionaler GKE-Autopilot- oder Standard-Cluster.
- Zwei TPU-Slice-Knotenpools mit einem Host, die die JetStream-Bereitstellung hosten.
- Die Dienstkomponente verteilt eingehenden Traffic auf alle
JetStream HTTP
-Replikate. JetStream HTTP
ist ein HTTP-Server, der Anfragen als Wrapper für das erforderliche Format von JetStream akzeptiert und an den GRPC-Client von JetStream sendet.JetStream-PyTorch
ist ein JetStream-Server, der Inferenzen mit kontinuierlicher Batchverarbeitung ausführt.
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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
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.
- For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
IAM aufrufen - Wählen Sie das Projekt aus.
- Klicken Sie auf Zugriff erlauben.
-
Geben Sie im Feld Neue Hauptkonten Ihre Nutzer-ID ein. Dies ist in der Regel die E-Mail-Adresse eines Google-Kontos.
- Wählen Sie in der Liste Rolle auswählen eine Rolle aus.
- Wenn Sie weitere Rollen hinzufügen möchten, klicken Sie auf Weitere Rolle hinzufügen und fügen Sie weitere Rollen hinzu.
- Klicken Sie auf Speichern.
-
- Prüfen Sie, ob Sie ein ausreichendes Kontingent für acht TPU v5e PodSlice Lite-Chips haben. In dieser Anleitung verwenden Sie On-Demand-Instanzen.
- Erstellen Sie ein Hugging Face-Token, falls Sie noch keines haben.
Zugriff auf das Modell erhalten
Zugriff auf verschiedene Modelle bei Hugging Face für die Bereitstellung in GKE erhalten
Gemma 7B-it
Für den Zugriff auf das Gemma-Modell für die Bereitstellung in GKE müssen Sie zuerst die Lizenzeinwilligungsvereinbarung unterzeichnen.
- Rufen Sie die Seite zur Einwilligung des Gemma-Modells auf Hugging Face auf.
- Melden Sie sich bei Hugging Face an, falls Sie dies noch nicht getan haben.
- Lesen und akzeptieren Sie die Nutzungsbedingungen des Modells.
Llama 3 8B
Wenn Sie Zugriff auf das Llama 3-Modell für die Bereitstellung in GKE erhalten möchten, müssen Sie zuerst die Lizenzeinwilligungsvereinbarung unterzeichnen.
- Rufen Sie die Seite zur Einwilligung des Llama 3-Modells auf Hugging Face auf.
- Melden Sie sich bei Hugging Face an, falls Sie dies noch nicht getan haben.
- Lesen und akzeptieren Sie die Nutzungsbedingungen des Modells.
Umgebung vorbereiten
In dieser Anleitung verwenden Sie Cloud Shell zum Verwalten von Ressourcen, die inGoogle Cloudgehostet werden. Die Software, die Sie für diese Anleitung benötigen, ist in Cloud Shell vorinstalliert, einschließlich kubectl
und
gcloud CLI.
So richten Sie Ihre Umgebung mit Cloud Shell ein:
Starten Sie in der Google Cloud -Konsole eine Cloud Shell-Sitzung. Klicken Sie dazu in der Google Cloud -Konsole auf Cloud Shell aktivieren. Dadurch wird im unteren Bereich der Google Cloud -Konsole eine Sitzung gestartet.
Legen Sie die Standardumgebungsvariablen fest:
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CLUSTER_NAME=CLUSTER_NAME export BUCKET_NAME=BUCKET_NAME export REGION=REGION export LOCATION=LOCATION export CLUSTER_VERSION=CLUSTER_VERSION
Ersetzen Sie die folgenden Werte:
PROJECT_ID
: Ihre Google Cloud Projekt-ID.CLUSTER_NAME
: der Name Ihres GKE-Clusters.BUCKET_NAME
: Der Name Ihres Cloud Storage-Buckets. Sie müssen das Präfixgs://
nicht angeben.REGION
: Die Region, in der sich der GKE-Cluster, der Cloud Storage-Bucket und die TPU-Knoten befinden. Die Region enthält Zonen, in denen TPU v5e-Maschinentypen verfügbar sind, z. B.us-west1
,us-west4
,us-central1
,us-east1
,us-east5
odereurope-west4
. Achten Sie bei Autopilot-Clustern darauf, dass Sie für die ausgewählte Region genügend zonale TPU v5e-Ressourcen haben.- (Nur Standardcluster)
LOCATION
: Die Zone, in der die TPU-Ressourcen verfügbar sind (z. B.us-west4-a
). Bei Autopilot-Clustern müssen Sie nicht die Zone angeben, sondern nur die Region. CLUSTER_VERSION
: Die GKE-Version, die den gewünschten Maschinentyp unterstützen muss. Die GKE-Standardversion ist für Ihre Ziel-TPU möglicherweise nicht verfügbar. Eine Liste der für TPU-Maschinentypen verfügbaren GKE-Mindestversionen finden Sie unter TPU-Verfügbarkeit in GKE.
Google Cloud -Ressourcen erstellen und konfigurieren
Folgen Sie dieser Anleitung, um die erforderlichen Ressourcen zu erstellen.
GKE-Cluster erstellen
Sie können Gemma auf GPUs in einem TPUs-Cluster im Autopilot- oder Standardmodus bereitstellen. Für eine vollständig verwaltete Kubernetes-Umgebung empfehlen wir die Verwendung eines Autopilot-Clusters. Informationen zum Auswählen des GKE-Betriebsmodus, der für Ihre Arbeitslasten am besten geeignet ist, finden Sie unter GKE-Betriebsmodus auswählen.
Autopilot
GKE-Autopilot-Cluster erstellen:
gcloud container clusters create-auto CLUSTER_NAME \
--project=PROJECT_ID \
--region=REGION \
--cluster-version=CLUSTER_VERSION
Standard
Einen regionalen GKE Standard-Cluster erstellen, der Workload Identity-Föderation für GKE verwendet:
gcloud container clusters create CLUSTER_NAME \ --enable-ip-alias \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --cluster-version=CLUSTER_VERSION \ --workload-pool=PROJECT_ID.svc.id.goog \ --location=REGION
Die Erstellung eines Clusters kann einige Minuten dauern.
Erstellen Sie einen TPU v5e-Knotenpool mit einer
2x4
-Topologie und zwei Knoten:gcloud container node-pools create tpu-nodepool \ --cluster=CLUSTER_NAME \ --machine-type=ct5lp-hightpu-8t \ --project=PROJECT_ID \ --num-nodes=2 \ --region=REGION \ --node-locations=LOCATION
Cloud Storage-Bucket erstellen
Erstellen Sie einen Cloud Storage-Bucket zum Speichern des konvertierten Checkpoints:
gcloud storage buckets create gs://BUCKET_NAME --location=REGION
Hugging Face-CLI-Token in Cloud Shell generieren
Generieren Sie ein neues Hugging Face-Token, falls Sie noch keines haben:
- Klicken Sie auf Profil > Einstellungen > Zugriffstokens.
- Klicken Sie auf Neues Token.
- Geben Sie einen Namen Ihrer Wahl und eine Rolle von mindestens
Read
an. - Klicken Sie auf Generate Token (Token generieren).
- Bearbeiten Sie die Berechtigungen für Ihr Zugriffstoken, um Lesezugriff auf das Hugging Face-Repository Ihres Modells zu erhalten.
- Kopieren Sie das Token in die Zwischenablage.
Kubernetes-Secret für Hugging Face-Anmeldedaten erstellen
Gehen Sie in Cloud Shell so vor:
Konfigurieren Sie
kubectl
für die Kommunikation mit Ihrem Cluster:gcloud container clusters get-credentials CLUSTER_NAME --location=REGION
Erstellen Sie ein Secret zum Speichern der Hugging Face-Anmeldedaten:
kubectl create secret generic huggingface-secret \ --from-literal=HUGGINGFACE_TOKEN=HUGGINGFACE_TOKEN
Ersetzen Sie
HUGGINGFACE_TOKEN
durch Ihr Hugging Face-Token.
Arbeitslastzugriff mit Identitätsföderation von Arbeitslasten für GKE konfigurieren
Weisen Sie der Anwendung ein Kubernetes-ServiceAccount zu und konfigurieren Sie dieses Kubernetes-Dienstkonto als IAM-Dienstkonto.
Erstellen Sie ein IAM-Dienstkonto für Ihre Anwendung:
gcloud iam service-accounts create wi-jetstream
Fügen Sie eine IAM-Richtlinienbindung für Ihr IAM-Dienstkonto hinzu, um Cloud Storage zu verwalten:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:wi-jetstream@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/storage.objectUser gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:wi-jetstream@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/storage.insightsCollectorService
Erlauben Sie dem Kubernetes-ServiceAccount, die Identität des IAM-Dienstkontos zu übernehmen. Fügen Sie dazu eine IAM-Richtlinienbindung zwischen den beiden Dienstkonten hinzu. Durch diese Bindung kann das Kubernetes-Dienstkonto als IAM-Dienstkonto verwendet werden.
gcloud iam service-accounts add-iam-policy-binding wi-jetstream@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
Kennzeichnen Sie das Kubernetes-Dienstkonto mit der E-Mail-Adresse des IAM-Dienstkontos:
kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=wi-jetstream@PROJECT_ID.iam.gserviceaccount.com
JetStream bereitstellen
Stellen Sie den JetStream-Container für die Bereitstellung Ihres Modells bereit:
Speichern Sie das folgende Manifest als jetstream-pytorch-deployment.yaml
:
Gemma 7B-it
Llama 3 8B
Das Manifest legt die folgenden wichtigen Attribute fest:
model_id
: Der Modellname von Hugging Face (google/gemma-7b-it
,meta-llama/Meta-Llama-3-8B
) (siehe unterstützte Modelle).override_batch_size
: die Batchgröße für Decodierung pro Gerät, wobei ein TPU-Chip einem Gerät entspricht. Der Standardwert ist30
.working_dir
: Das Arbeitsverzeichnis, in dem sich der Modell-Prüfpunkt befindet oder gespeichert wird. Da der Cloud Storage-Bucket auf Ihrem Knoten bereitgestellt ist, kann Ihre Arbeitslast auf Checkpoints untergs://BUCKET_NAME/pytorch/org/repo
zugreifen. Der JetStream-PyTorch-Server lädt die Modellgewichte bei der ersten Verwendung von Hugging Face in das Arbeitsverzeichnis herunter. Das Laden eines 7B- oder 8B-Modells dauert einige Minuten. Bei nachfolgenden Bereitstellungen lädt der JetStream-PyTorch-Server die Modellgewichte aus dem Arbeitsverzeichnis, was weniger Zeit in Anspruch nimmt. Achten Sie bei bereits vorhandenen Checkpoints darauf, dass im Arbeitsverzeichnis dieselbe Pfadkonvention verwendet wird.enable_model_warmup
: Mit dieser Einstellung wird das Modell nach dem Starten des Modellservers aufgewärmt. Der Standardwert istFalse
.
Optional können Sie die folgenden Eigenschaften festlegen:
max_input_length
: die maximale Eingabesequenzlänge. Der Standardwert ist1024
.max_output_length
: Die maximale Länge der Dekodierung der Ausgabe. Standardmäßig ist dieser Wert1024
.quantize_weights
: ob der Checkpoint quantisiert ist. Dieser Wert ist standardmäßig0
. Legen Sie ihn auf 1 fest, um dieint8
-Quantisierung zu aktivieren.internal_jax_compilation_cache
: das Verzeichnis für den JAX-Kompilierungscache. Standardmäßig ist dieser Wert auf~/jax_cache
festgelegt. Legen Sie ihn aufgs://BUCKET_NAME/jax_cache
fest, um den Remote-Cache zu verwenden.
Im Manifest ist eine Startprüfung konfiguriert, damit der Modellserver nach dem Laden des Modells und dem Abschluss der Aufwärmphase mit Ready
gekennzeichnet wird. Aktivitäts- und Bereitschaftsprüfungen werden konfiguriert, um den Zustand des Modellservers zu prüfen.
Ersetzen Sie
BUCKET_NAME
durch den zuvor erstellten GSBucket:sed -i "s|BUCKET_NAME|BUCKET_NAME|g" jetstream-pytorch-deployment.yaml
Wenden Sie das Manifest an:
kubectl apply -f jetstream-pytorch-deployment.yaml
Bereitstellung prüfen:
kubectl get deployment
Die Ausgabe sieht in etwa so aus:
NAME READY UP-TO-DATE AVAILABLE AGE jetstream-pytorch-server 0/2 2 0 ##s
Bei Autopilot-Clustern kann es einige Minuten dauern, bis die erforderlichen TPU-Ressourcen bereitgestellt werden.
Prüfen Sie anhand der JetStream-PyTorch-Server-Logs, ob die Modellgewichte geladen und das Modell vorgewärmt wurde. Es kann einige Minuten dauern, bis der Server diesen Vorgang abgeschlossen hat.
kubectl logs deploy/jetstream-pytorch-server -f -c jetstream-pytorch-server
Die Ausgabe sieht in etwa so aus:
Started jetstream_server.... 2024-04-12 04:33:37,128 - root - INFO - ---------Generate params 0 loaded.---------
Prüfen Sie, ob die Bereitstellung bereit ist:
kubectl get deployment
Die Ausgabe sieht in etwa so aus:
NAME READY UP-TO-DATE AVAILABLE AGE jetstream-pytorch-server 2/2 2 2 ##s
Es kann einige Minuten dauern, bis der
healthcheck
-Endpunkt registriert ist.
Modell bereitstellen
In diesem Abschnitt interagieren Sie mit dem Modell.
Portweiterleitung einrichten
Sie können auf das JetStream-Deployment über den ClusterIP-Dienst zugreifen, den Sie im vorherigen Schritt erstellt haben. Die ClusterIP-Dienste sind nur innerhalb des Clusters erreichbar. Führen Sie daher die folgenden Schritte aus, um von außerhalb des Clusters auf den Dienst zuzugreifen:
Führen Sie den folgenden Befehl aus, um eine Portweiterleitungssitzung einzurichten:
kubectl port-forward svc/jetstream-svc 8000:8000
Mithilfe von curl mit dem Modell interagieren
Prüfen Sie, ob Sie auf den JetStream-HTTP-Server zugreifen können. Öffnen Sie dazu ein neues Terminal und führen Sie den folgenden Befehl aus:
curl --request POST \ --header "Content-type: application/json" \ -s \ localhost:8000/generate \ --data \ '{ "prompt": "What are the top 5 programming languages", "max_tokens": 200 }'
Die erste Anfrage kann aufgrund der Aufwärmphase des Modells einige Sekunden dauern. Die Ausgabe sieht in etwa so aus:
{ "response": " for data science in 2023?\n\n**1. Python:**\n- Widely used for data science due to its readability, extensive libraries (pandas, scikit-learn), and integration with other tools.\n- High demand for Python programmers in data science roles.\n\n**2. R:**\n- Popular choice for data analysis and visualization, particularly in academia and research.\n- Extensive libraries for statistical modeling and data wrangling.\n\n**3. Java:**\n- Enterprise-grade platform for data science, with strong performance and scalability.\n- Widely used in data mining and big data analytics.\n\n**4. SQL:**\n- Essential for data querying and manipulation, especially in relational databases.\n- Used for data analysis and visualization in various industries.\n\n**5. Scala:**\n- Scalable and efficient for big data processing and machine learning models.\n- Popular in data science for its parallelism and integration with Spark and Spark MLlib." }
Sie haben Folgendes getan:
- JetStream-PyTorch-Modellserver mit TPUs in GKE bereitgestellt
- Prüfpunkt bei
gs://BUCKET_NAME/pytorch/org/repo
erstellt - Das Modell wurde bereitgestellt und es wurde mit ihm interagiert.
Probleme beheben
- Wenn Sie die
Empty reply from server
-Meldung erhalten, hat der Container möglicherweise die Modelldaten noch nicht ganz heruntergeladen. Prüfen Sie die Logs des Pods noch einmal auf dieConnected
-Meldung, die angibt, dass das Modell einsatzbereit ist. - Wenn
Connection refused
angezeigt wird, prüfen Sie, ob die Portweiterleitung aktiv ist.
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Bereitgestellte Ressourcen löschen
Führen Sie die folgenden Befehle aus und folgen Sie den Eingabeaufforderungen, um zu vermeiden, dass Ihrem Google Cloud -Konto die in dieser Anleitung erstellten Ressourcen in Rechnung gestellt werden:
gcloud container clusters delete CLUSTER_NAME --region=REGION
gcloud iam service-accounts delete wi-jetstream@PROJECT_ID.iam.gserviceaccount.com
gcloud storage rm --recursive gs://BUCKET_NAME
Nächste Schritte
- Erfahren Sie, wie Sie Gemma-Modelle in GKE ausführen und wie Sie optimierte KI-/ML-Arbeitslasten mit GKE-Plattformorchestrierungsfunktionen ausführen.
- Mehr über TPUs in GKE erfahren
- GitHub-Repository von JetStream ansehen
- Erfahren Sie mehr über den Vertex AI Model Garden.