Modell mit einer einzelnen GPU in GKE bereitstellen

In dieser Anleitung erfahren Sie, wie Sie ein Large Language Model (LLM) mit GPUs in Google Kubernetes Engine (GKE) mit NVIDIA Triton Inference Server und TensorFlow Serving bereitstellen und verfügbar machen. Dies bietet eine Grundlage für das Verständnis und die Untersuchung der praktischen LLM-Bereitstellung für die Inferenz in einer verwalteten Kubernetes-Umgebung. Sie stellen einen vorgefertigten 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 von maschinellem Lernen (ML), Plattformadministratoren und ‑operatoren 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-Nutzerrollen und ‑Aufgaben.

Machen Sie sich vor dem Lesen dieser Seite mit den folgenden Themen vertraut:

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

  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 mit einem Deployment bereit. 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 -
    
  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 mit einem Deployment bereit. 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 -
    
  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. 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

  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

Modellleistung beobachten

Triton

Um die Modellleistung zu beobachten, können Sie die Triton-Dashboard-Integration in Cloud Monitoring verwenden. In diesem Dashboard können Sie wichtige Leistungsmesswerte wie den Token-Durchsatz, die Anfrage-Latenz und die Fehlerraten einsehen.

Damit Sie das Triton-Dashboard verwenden können, müssen Sie Google Cloud Managed Service for Prometheus in Ihrem GKE-Cluster aktivieren. Damit werden die Messwerte von Triton erfasst. Triton stellt Messwerte standardmäßig im Prometheus-Format bereit. Sie müssen keinen zusätzlichen Exporter installieren.

Anschließend können Sie die Messwerte über das Triton-Dashboard aufrufen. Informationen zum Erheben von Messwerten aus Ihrem Modell mit Google Cloud Managed Service for Prometheus finden Sie in der Cloud Monitoring-Dokumentation unter Triton.

TF-Bereitstellung

Um die Modellleistung zu beobachten, können Sie die TF Serving-Dashboard-Integration in Cloud Monitoring verwenden. In diesem Dashboard können Sie wichtige Leistungsmesswerte wie den Token-Durchsatz, die Anfrage-Latenz und die Fehlerraten einsehen.

Damit Sie das TF Serving-Dashboard verwenden können, müssen Sie Google Cloud Managed Service for Prometheus in Ihrem GKE-Cluster aktivieren. Damit werden die Messwerte von TF Serving erfasst.

Anschließend können Sie die Messwerte über das TF Serving-Dashboard aufrufen. Informationen zum Erheben von Messwerten aus Ihrem Modell mit Google Cloud Managed Service for Prometheus finden Sie in der Cloud Monitoring-Dokumentation unter TF Serving.