In dieser Anleitung erfahren Sie, wie Sie ein Large Language Model (LLM) mit GPUs in der Google Kubernetes Engine (GKE) mit dem NVIDIA Triton Inference Server und TensorFlow Serving bereitstellen und ausführen. Dies bildet die Grundlage für das Verständnis und die praktische Bereitstellung von LLMs für die Inferenz in einer verwalteten Kubernetes-Umgebung. Sie stellen einen vorkonfigurierten Container in einem GKE-Cluster mit einer einzelnen L4 Tensor Core-GPU bereit und bereiten die GKE-Infrastruktur für die Onlineinferenz vor.
Diese Anleitung richtet sich an Entwickler für maschinelles Lernen (ML), Plattformadministratoren und ‑bearbeiter sowie an Daten- und KI-Spezialisten, die ein vortrainiertes ML-Modell in einem GKE-Cluster hosten möchten. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die in Google Cloud-Inhalten verwiesen wird, finden Sie unter Häufig verwendete GKE Enterprise-Nutzerrollen und -Aufgaben.
Machen Sie sich vor dem Lesen dieser Seite mit den folgenden Themen vertraut:
Lernziele
- Erstellen Sie einen GKE Autopilot- oder Standard-Cluster.
- Cloud Storage-Bucket konfigurieren, in dem sich das vortrainierte Modell befindet
- Stellen Sie das ausgewählte Online-Inferenz-Framework bereit.
- Stellen Sie eine Testanfrage an den bereitgestellten Dienst.
Kosten
In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloudverwendet:- GKE
- Cloud Storage
- L4-GPU-Beschleuniger
- Ausgehender Traffic
Sie können mithilfe des Preisrechners eine Kostenschätzung für Ihre voraussichtliche Nutzung erstellen.
Nach Abschluss dieser Anleitung können Sie weitere Kosten durch Löschen von erstellten Ressourcen vermeiden. Weitere Informationen finden Sie unter Bereinigen.
Vorbereitung
Projekt einrichten
- 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, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Starten Sie in der Google Cloud Console eine Cloud Shell-Instanz:
Cloud Shell öffnenLaden Sie den Quellcode für diese Beispielanwendung herunter:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
Legen Sie die Standardumgebungsvariablen fest:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION
Ersetzen Sie die folgenden Werte:
- PROJECT_ID: Ihre Google Cloud Projekt-ID.
- COMPUTE_REGION: die Compute Engine-Region, die den Beschleunigertyp unterstützt, den Sie verwenden möchten, z. B.
us-central1
für L4-GPU.
Erstellen Sie in Cloud Shell die folgenden Umgebungsvariablen:
export PROJECT_ID=$(gcloud config get project) export REGION=$(gcloud config get compute/region) export K8S_SA_NAME=gpu-k8s-sa export GSBUCKET=$PROJECT_ID-gke-bucket export MODEL_NAME=mnist export CLUSTER_NAME=online-serving-cluster
Führen Sie den folgenden Befehl aus, um einen GKE-Standardcluster zu erstellen:
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --region=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --addons GcsFuseCsiDriver \ --release-channel=rapid \ --num-nodes=1
Die Erstellung eines Clusters kann einige Minuten dauern.
Führen Sie den folgenden Befehl aus, um den Knotenpool zu erstellen:
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-8 \ --num-nodes=1
GKE erstellt einen einzelnen Knotenpool mit einer L4-GPU für jeden Knoten.
Standardeinstellungen für die Google Cloud CLI festlegen
GKE-Cluster erstellen
Sie können Modelle auf einer einzelnen GPU in einem GKE Autopilot- oder Standardcluster bereitstellen. Für eine vollständig verwaltete Kubernetes-Umgebung empfehlen wir die Verwendung eines Autopilot-Clusters. Mit GKE Autopilot werden die Ressourcen automatisch basierend auf den Modellanfragen skaliert.
Informationen zum Auswählen des GKE-Betriebsmodus, der für Ihre Arbeitslasten am besten geeignet ist, finden Sie unter GKE-Betriebsmodus auswählen.
Autopilot
Führen Sie den folgenden Befehl aus, um einen GKE Autopilot-Cluster zu erstellen:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--region=${REGION} \
--project=${PROJECT_ID} \
--release-channel=rapid
GKE erstellt einen Autopilot-Cluster mit CPU- und GPU-Knoten, wie von den bereitgestellten Arbeitslasten angefordert.
Standard
Cloud Storage-Bucket erstellen
Erstellen Sie einen Cloud Storage-Bucket zum Speichern des vortrainierten Modells, das bereitgestellt werden soll.
Führen Sie in Cloud Shell folgenden Befehl aus:
gcloud storage buckets create gs://$GSBUCKET
Cluster für den Zugriff auf den Bucket mithilfe der Identitätsföderation von Arbeitslasten für GKE konfigurieren
So gewähren Sie dem Cluster Zugriff auf den Cloud Storage-Bucket:
- Erstellen Sie ein Google Cloud Dienstkonto.
- Erstellen Sie ein Kubernetes-Dienstkonto in Ihrem Cluster.
- Binden Sie das Kubernetes-Dienstkonto an das Google Cloud -Dienstkonto.
Dienstkonto Google Cloud erstellen
Rufen Sie in der Google Cloud Console die Seite Dienstkonto erstellen auf:
Geben Sie im Feld Dienstkonto-ID
gke-ai-sa
ein.Klicken Sie auf Erstellen und fortfahren.
Wählen Sie in der Liste Rolle die Rolle Cloud Storage > Storage Insights Collector Service aus.
Klicken Sie auf
Weitere Rolle hinzufügen.Wählen Sie in der Liste Rolle auswählen die Rolle Cloud Storage > Storage Object Admin aus.
Klicken Sie auf Weiter und dann auf Fertig.
Kubernetes-Dienstkonto in Ihrem Cluster erstellen
Gehen Sie in Cloud Shell so vor:
Erstellen Sie einen Kubernetes-Namespace:
kubectl create namespace gke-ai-namespace
Erstellen Sie ein Kubernetes-Dienstkonto im Namespace:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Kubernetes-Dienstkonto an das Google Cloud -Dienstkonto binden
Führen Sie in Cloud Shell die folgenden Befehle aus:
Fügen Sie dem Dienstkonto Google Cloud eine IAM-Bindung hinzu:
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
Das Flag
--member
stellt die vollständige Identität des Kubernetes-Dienstkontos in Google Cloudbereit.Annotieren Sie das Kubernetes-Dienstkonto.
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
Online-Inferenzserver bereitstellen
Jedes Online-Inferenz-Framework erwartet das vortrainierte ML-Modell in einem bestimmten Format. Im folgenden Abschnitt wird gezeigt, wie Sie den Inferenzserver je nach dem gewünschten Framework bereitstellen:
Triton
Kopieren Sie in Cloud Shell das vortrainierte ML-Modell in den Cloud Storage-Bucket:
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
Framework mit einem Deployment bereitstellen Ein Deployment ist ein Kubernetes API-Objekt, mit dem Sie mehrere Replikate von Pods ausführen können, die auf die Knoten in einem Cluster verteilt sind:
envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Prüfen Sie, ob GKE das Framework bereitgestellt hat:
kubectl get deployments --namespace=gke-ai-namespace
Wenn das Framework bereit ist, sieht die Ausgabe in etwa so aus:
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29s
Stellen Sie die Dienste für den Zugriff auf die Bereitstellung bereit:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
Prüfen Sie, ob die externe IP-Adresse zugewiesen ist:
kubectl get services --namespace=gke-ai-namespace
Die Ausgabe sieht in etwa so aus:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m triton-server LoadBalancer 34.118.227.176 35.239.54.228 8000:30866/TCP,8001:31035/TCP,8002:30516/TCP 5m14s
Notieren Sie sich die IP-Adresse für
triton-server
in der Spalte EXTERNAL-IP.Überprüfen Sie, ob der Dienst und die Bereitstellung ordnungsgemäß funktionieren:
curl -v EXTERNAL_IP:8000/v2/health/ready
Die Ausgabe sieht in etwa so aus:
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...
TF-Bereitstellung
Kopieren Sie in Cloud Shell das vortrainierte ML-Modell in den Cloud Storage-Bucket:
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
Framework mit einem Deployment bereitstellen Ein Deployment ist ein Kubernetes API-Objekt, mit dem Sie mehrere Replikate von Pods ausführen können, die auf die Knoten in einem Cluster verteilt sind:
envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Prüfen Sie, ob GKE das Framework bereitgestellt hat:
kubectl get deployments --namespace=gke-ai-namespace
Wenn das Framework bereit ist, sieht die Ausgabe in etwa so aus:
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29s
Stellen Sie die Dienste für den Zugriff auf die Bereitstellung bereit:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
Prüfen Sie, ob die externe IP-Adresse zugewiesen ist:
kubectl get services --namespace=gke-ai-namespace
Die Ausgabe sieht in etwa so aus:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m tfserve-server LoadBalancer 34.118.227.176 35.239.54.228 8500:30003/TCP,8000:32194/TCP 5m14s
Notieren Sie sich die IP-Adresse für
tfserve-server
in der Spalte EXTERNAL-IP.Prüfen Sie, ob der Dienst und die Bereitstellung ordnungsgemäß funktionieren:
curl -v EXTERNAL_IP:8000/v1/models/mnist
Ersetzen Sie dabei
EXTERNAL_IP
durch Ihre externe IP-Adresse.Die Ausgabe sieht in etwa so aus:
... < HTTP/1.1 200 OK < Content-Type: application/json < Date: Thu, 12 Oct 2023 19:01:19 GMT < Content-Length: 154 < { "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }
Modell bereitstellen
Triton
Erstellen Sie eine virtuelle Python-Umgebung in Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activate
Installieren Sie die erforderlichen Python-Pakete:
pip install -r src/client/triton-requirements.txt
Testen Sie den Triton-Inferenzserver durch Laden eines Bildes:
cd src/client python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
Ersetzen Sie Folgendes:
EXTERNAL_IP
: ist Ihre externe IP-Adresse.TEST_IMAGE
: Der Name der Datei, die dem zu testenden Image entspricht. Sie können die insrc/client/images
gespeicherten Images verwenden.
Je nach verwendetem Image sieht die Ausgabe in etwa so aus:
Calling Triton HTTP Service -> Prediction result: 7
TF-Bereitstellung
Erstellen Sie eine virtuelle Python-Umgebung in Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activate
Installieren Sie die erforderlichen Python-Pakete:
pip install -r src/client/tfserve-requirements.txt
TensorFlow Serving mit einigen Bildern testen
cd src/client python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
Ersetzen Sie Folgendes:
EXTERNAL_IP
: ist Ihre externe IP-Adresse.TEST_IMAGE
: Ein Wert zwischen0
und9
. Sie können die insrc/client/images
gespeicherten Images verwenden.
Je nachdem, welches Image Sie verwenden, erhalten Sie eine Ausgabe ähnlich der folgenden:
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
Modellleistung beobachten
Triton
Sie können die Modellleistung mithilfe der Triton-Dashboard-Integration in Cloud Monitoring beobachten. In diesem Dashboard können Sie wichtige Leistungsmesswerte wie Tokendurchsatz, Anfragelatenz und Fehlerraten abrufen.
Wenn Sie das Triton-Dashboard verwenden möchten, müssen Sie Google Cloud Managed Service for Prometheus in Ihrem GKE-Cluster aktivieren. Dieser Dienst erfasst die Messwerte von Triton. Triton stellt standardmäßig Messwerte im Prometheus-Format bereit. Sie müssen keinen zusätzlichen Exporter installieren.
Sie können die Messwerte dann über das Triton-Dashboard aufrufen. Informationen zur Verwendung von Google Cloud Managed Service for Prometheus zum Erfassen von Messwerten aus Ihrem Modell finden Sie in der Cloud Monitoring-Dokumentation unter Triton.TF-Bereitstellung
Sie können die Modellleistung mithilfe der Dashboard-Integration für TF Serving in Cloud Monitoring beobachten. In diesem Dashboard können Sie wichtige Leistungsmesswerte wie Tokendurchsatz, Anfragelatenz und Fehlerraten abrufen.
Wenn Sie das TF Serving-Dashboard verwenden möchten, müssen Sie Google Cloud Managed Service for Prometheus in Ihrem GKE-Cluster aktivieren. Dieser Dienst erfasst die Messwerte von TF Serving.
Sie können die Messwerte dann über das TF Serving-Dashboard aufrufen. Informationen zur Verwendung von Google Cloud Managed Service for Prometheus zum Erfassen von Messwerten aus Ihrem Modell finden Sie in der Cloud Monitoring-Dokumentation unter TF Serving.Bereinigen
Führen Sie einen der folgenden Schritte aus, damit Ihrem Google Cloud -Konto die in dieser Anleitung erstellten Ressourcen nicht in Rechnung gestellt werden:
- GKE-Cluster beibehalten:Kubernetes-Ressourcen im Cluster und die Google Cloud
- Google Cloud -Projekt beibehalten:GKE-Cluster und Google Cloud -Ressourcen löschen
- Projekt löschen
Kubernetes-Ressourcen im Cluster und die Google Cloud -Ressourcen löschen
- Löschen Sie den Kubernetes-Namespace und die bereitgestellten Arbeitslasten:
Triton
kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace
TF-Bereitstellung
kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace
Löschen Sie den Cloud Storage-Bucket:
Rufen Sie die Seite Buckets auf.
Aktivieren Sie das Kästchen für
PROJECT_ID-gke-bucket
.Klicken Sie auf
Löschen.Geben Sie
DELETE
ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.
Löschen Sie das Dienstkonto Google Cloud :
Rufen Sie die Seite Dienstkonten auf:
Wählen Sie Ihr Projekt aus.
Aktivieren Sie das Kästchen für
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
.Klicken Sie auf
Löschen.Klicken Sie zur Bestätigung noch einmal auf Löschen.
GKE-Cluster und Google Cloud -Ressourcen löschen
Löschen Sie den GKE-Cluster:
Rufen Sie die Seite Cluster auf:
Aktivieren Sie das Kästchen für
online-serving-cluster
.Klicken Sie auf
Löschen.Geben Sie
online-serving-cluster
ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.
Löschen Sie den Cloud Storage-Bucket:
Rufen Sie die Seite Buckets auf.
Aktivieren Sie das Kästchen für
PROJECT_ID-gke-bucket
.Klicken Sie auf
Löschen.Geben Sie
DELETE
ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.
Löschen Sie das Dienstkonto Google Cloud :
Rufen Sie die Seite Dienstkonten auf:
Wählen Sie Ihr Projekt aus.
Aktivieren Sie das Kästchen für
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
.Klicken Sie auf
Löschen.Klicken Sie zur Bestätigung noch einmal auf Löschen.
Projekt löschen
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.