Modell mit einer einzelnen GPU in GKE bereitstellen


In dieser Anleitung wird beschrieben, wie Sie ein einfaches Modell mit GPUs im Modus von Google Kubernetes Engine (GKE) bereitstellen. In dieser Anleitung wird ein GKE-Cluster erstellt, der eine einzelne L4 Tensor Core-GPU verwendet und die GKE-Infrastruktur für die Onlineinferenz vorbereitet. In dieser Anleitung werden zwei der am häufigsten verwendeten Frameworks für die Onlinebereitstellung verwendet:

Lernziele

Diese Anleitung richtet sich an Infrastrukturentwickler, MLOps-Entwickler, DevOps-Entwickler oder Clusteradministratoren, die ein vortrainiertes ML-Modell in einem GKE-Cluster hosten möchten.

Diese Anleitung umfasst die folgenden Schritte:

  1. GKE Autopilot- oder Standardcluster erstellen
  2. Cloud Storage-Bucket konfigurieren, in dem sich das vortrainierte Modell befindet
  3. Stellen Sie das ausgewählte Online-Inferenz-Framework bereit.
  4. Stellen Sie eine Testanfrage an den bereitgestellten Dienst.

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

  • 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

  1. 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.
  2. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

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

  4. Enable the GKE API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

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

  7. Enable the GKE API.

    Enable the API

Standardeinstellungen für die Google Cloud CLI festlegen

  1. Starten Sie in der Google Cloud Console eine Cloud Shell-Instanz:
    Cloud Shell öffnen

  2. Laden 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
    
  3. 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 zu verwendenden Beschleunigertyp unterstützt, z. B. us-central1 für L4-GPU.
  4. 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
    

GKE-Cluster erstellen

Sie können Modelle auf einer einzelnen GPU in einem GKE-Cluster im Autopilot- oder Standardmodus 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

  1. Führen Sie den folgenden Befehl aus, um einen GKE Standard-Cluster 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.

  2. 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.

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:

  1. Erstellen Sie ein Google Cloud-Dienstkonto.
  2. Erstellen Sie ein Kubernetes-Dienstkonto in Ihrem Cluster.
  3. Binden Sie das Kubernetes-Dienstkonto an das Google Cloud-Dienstkonto.

Google Cloud-Dienstkonto erstellen

  1. Wechseln Sie in der Google Cloud Console zur Seite Dienstkonto erstellen:

    Zur Seite „Dienstkonto erstellen“

  2. Geben Sie im Feld Dienstkonto-ID gke-ai-sa ein.

  3. Klicken Sie auf Erstellen und fortfahren.

  4. Wählen Sie in der Liste Rolle die Rolle Cloud Storage > Storage Insights Collector Service aus.

  5. Klicken Sie auf Weitere Rolle hinzufügen.

  6. Wählen Sie in der Liste Rolle auswählen die Rolle Cloud Storage > Storage Object Admin aus.

  7. Klicken Sie auf Weiter und dann auf Fertig.

Kubernetes-Dienstkonto in Ihrem Cluster erstellen

Gehen Sie in Cloud Shell so vor:

  1. Erstellen Sie einen Kubernetes-Namespace:

    kubectl create namespace gke-ai-namespace
    
  2. 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:

  1. Fügen Sie dem Google Cloud-Dienstkonto 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 Cloud bereit.

  2. 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

  1. Kopieren Sie in Cloud Shell das vortrainierte ML-Modell in den Cloud Storage-Bucket:

    gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
    
  2. Stellen Sie das Framework auf Kubernetes bereit:

    envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. 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
    
  4. Dienste für den Zugriff auf die Bereitstellung bereitstellen

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
    
  5. 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.

  6. Ü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

  1. Kopieren Sie in Cloud Shell das vortrainierte ML-Modell in den Cloud Storage-Bucket:

    gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
    
  2. Stellen Sie das Framework auf Kubernetes bereit:

    envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. 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
    
  4. Dienste für den Zugriff auf die Bereitstellung bereitstellen

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
    
  5. 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.

  6. Überprü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

  1. Erstellen Sie eine virtuelle Python-Umgebung in Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Installieren Sie die erforderlichen Python-Pakete:

    pip install -r src/client/triton-requirements.txt
    
  3. 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 in src/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

  1. Erstellen Sie eine virtuelle Python-Umgebung in Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Installieren Sie die erforderlichen Python-Pakete:

    pip install -r src/client/tfserve-requirements.txt
    
  3. 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 zwischen 0 und 9. Sie können die in src/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

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-Ressourcen löschen
  • Google Cloud-Projekt beibehalten: GKE-Cluster und die Google Cloud-Ressourcen löschen
  • Projekt löschen

Kubernetes-Ressourcen im Cluster und die Google Cloud-Ressourcen löschen

  1. 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
  1. Löschen Sie den Cloud Storage-Bucket:

    1. Rufen Sie die Seite Buckets auf.

      Buckets aufrufen

    2. Aktivieren Sie das Kästchen für PROJECT_ID-gke-bucket.

    3. Klicken Sie auf Löschen.

    4. Geben Sie DELETE ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.

  2. Löschen Sie das Google Cloud-Dienstkonto:

    1. Rufen Sie die Seite Dienstkonten auf:

      Zur Seite „Dienstkonten“

    2. Wählen Sie Ihr Projekt aus.

    3. Aktivieren Sie das Kästchen für gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Klicken Sie auf Löschen.

    5. Klicken Sie zur Bestätigung noch einmal auf Löschen.

GKE-Cluster und Google Cloud-Ressourcen löschen

  1. Löschen Sie den GKE-Cluster:

    1. Rufen Sie die Seite Cluster auf:

      Zu den Clustern

    2. Aktivieren Sie das Kästchen für online-serving-cluster.

    3. Klicken Sie auf Löschen.

    4. Geben Sie online-serving-cluster ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.

  2. Löschen Sie den Cloud Storage-Bucket:

    1. Rufen Sie die Seite Buckets auf.

      Buckets aufrufen

    2. Aktivieren Sie das Kästchen für PROJECT_ID-gke-bucket.

    3. Klicken Sie auf Löschen.

    4. Geben Sie DELETE ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.

  3. Löschen Sie das Google Cloud-Dienstkonto:

    1. Rufen Sie die Seite Dienstkonten auf:

      Zur Seite „Dienstkonten“

    2. Wählen Sie Ihr Projekt aus.

    3. Aktivieren Sie das Kästchen für gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Klicken Sie auf Löschen.

    5. Klicken Sie zur Bestätigung noch einmal auf 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.

Nächste Schritte