LLM auf L4-GPUs mit Ray bereitstellen

In diesem Leitfaden wird beschrieben, wie Sie große Sprachmodelle (LLM) mit Ray und dem Ray Operator-Add-on mit Google Kubernetes Engine (GKE) bereitstellen. Das Ray-Framework bietet eine End-to-End-KI-/ML-Plattform für Training, Optimierung und Ableitung von ML-Arbeitslasten. Ray Serve ist ein Framework in Ray, mit dem Sie beliebte LLMs von Hugging Face bereitstellen können.

Bevor Sie diesen Leitfaden lesen, sollten Sie mit dem Modell vertraut sein, das Sie in diesem Tutorial bereitstellen möchten. Sie können eines der folgenden Modelle bereitstellen:

Diese Seite richtet sich an Entwickler von maschinellem Lernen (ML) und Plattformadministratoren und ‑betreiber, die ML-Arbeitslasten ermöglichen. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud -Inhalten verweisen, finden Sie unter Häufig verwendete GKE-Nutzerrollen und -Aufgaben.

Der Leitfaden behandelt folgende Schritte:

  1. Autopilot- oder Standard-GKE-Cluster mit aktiviertem Ray-Operator-Add-on erstellen.
  2. RayService-Ressource-Deployment, das ein Large Language Model (LLM) von Hugging Face herunterlädt und bereitstellt.
  3. Chatoberfläche bereitstellen und mit LLMs interagieren.

Hinweise

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diesen Task verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem Befehl gcloud components update ab. In früheren gcloud CLI-Versionen werden die Befehle in diesem Dokument möglicherweise nicht unterstützt.
  • Erstellen Sie ein Hugging Face-Konto, falls Sie noch keines haben.
  • Sie benötigen ein Hugging Face-Token.
  • Sie benötigen Zugriff auf das Hugging Face-Modell, das Sie verwenden möchten. Dies wird in der Regel durch Unterzeichnen einer Vereinbarung und Anfordern des Zugriffs vom Modelleigentümer auf der Hugging Face-Modellseite gewährt.
  • Sie benötigen ein GPU-Kontingent in der Region us-central1. Weitere Informationen finden Sie unter GPU-Kontingent.

Umgebung vorbereiten

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

  2. Klonen Sie das Beispiel-Repository:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    cd kubernetes-engine-samples/ai-ml/gke-ray/rayserve/llm
    export TUTORIAL_HOME=`pwd`
    
  3. Legen Sie die Standardumgebungsvariablen fest:

    gcloud config set project PROJECT_ID
    export PROJECT_ID=$(gcloud config get project)
    export COMPUTE_REGION=us-central1
    export CLUSTER_VERSION=CLUSTER_VERSION
    export HF_TOKEN=HUGGING_FACE_TOKEN
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Google Cloud Projekt-ID.
    • CLUSTER_VERSION ist die zu verwendende GKE-Version. Es muss 1.30.1 oder höher sein.
    • HUGGING_FACE_TOKEN: Ihr Hugging Face-Zugriffstoken.

Cluster mit einem GPU-Knotenpool erstellen

Sie können eine LLM auf L4-GPUs mit Ray in einem GKE Autopilot- oder Standardcluster mit dem Ray Operator-Add‑on bereitstellen. Für eine vollständig verwaltete Kubernetes-Umgebung empfehlen wir üblicherweise die Verwendung eines Autopilot-Clusters. Wählen Sie einen Standardcluster, wenn Ihr Anwendungsfall eine hohe Skalierbarkeit erfordert oder Sie mehr Kontrolle über die Clusterkonfiguration haben möchten. Informationen zum Auswählen des GKE-Betriebsmodus, der für Ihre Arbeitslasten am besten geeignet ist, finden Sie unter GKE-Betriebsmodus auswählen.

Autopilot- oder Standardcluster mit Cloud Shell erstellen:

Autopilot

Autopilot-Cluster mit aktiviertem Ray-Operator-Add-on erstellen:

gcloud container clusters create-auto rayserve-cluster \
    --enable-ray-operator \
    --cluster-version=${CLUSTER_VERSION} \
    --location=${COMPUTE_REGION}

Standard

Standardcluster mit aktiviertem Ray-Operator-Add-on erstellen:

gcloud container clusters create rayserve-cluster \
    --addons=RayOperator \
    --cluster-version=${CLUSTER_VERSION} \
    --machine-type=g2-standard-24 \
    --location=${COMPUTE_ZONE} \
    --num-nodes=2 \
    --accelerator type=nvidia-l4,count=2,gpu-driver-version=latest

Kubernetes-Secret für Hugging Face-Anmeldedaten erstellen

Erstellen Sie in Cloud Shell ein Kubernetes-Secret:

  1. Konfigurieren Sie kubectl für die Kommunikation mit Ihrem Cluster:

    gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${COMPUTE_REGION}
    
  2. Erstellen Sie ein Kubernetes-Secret, das das Hugging Face-Token enthält:

    kubectl create secret generic hf-secret \
      --from-literal=hf_api_token=${HF_TOKEN} \
      --dry-run=client -o yaml | kubectl apply -f -
    

LLM-Modell bereitstellen

Das GitHub-Repository, das Sie geklont haben, enthält ein Verzeichnis für jedes Modell mit einer RayService-Konfiguration. Die Konfiguration der einzelnen Modelle umfasst die folgenden Komponenten:

  • Ray Serve-Bereitstellung: Die Ray Serve-Bereitstellung, die Ressourcenkonfiguration und Laufzeitabhängigkeiten umfasst.
  • Modell: Die Hugging Face-Modell-ID.
  • Ray-Cluster: Der zugrunde liegende Ray-Cluster und die pro Komponente erforderlichen Ressourcen, einschließlich Head- und Worker-Pods.

Gemma 2B IT

  1. Modell bereitstellen:

    kubectl apply -f gemma-2b-it/
    
  2. Warten Sie, bis die RayService-Ressource bereit ist:

    kubectl get rayservice gemma-2b-it -o yaml
    

    Die Ausgabe sieht in etwa so aus:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    In dieser Ausgabe gibt status: RUNNING an, dass die RayService-Ressource bereit ist.

  3. Prüfen Sie, ob GKE den Dienst für die Ray Serve-Anwendung erstellt hat:

    kubectl get service gemma-2b-it-serve-svc
    

    Die Ausgabe sieht in etwa so aus:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    gemma-2b-it-serve-svc   ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Gemma 7B IT

  1. Modell bereitstellen:

    kubectl apply -f gemma-7b-it/
    
  2. Warten Sie, bis die RayService-Ressource bereit ist:

    kubectl get rayservice gemma-7b-it -o yaml
    

    Die Ausgabe sieht in etwa so aus:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    In dieser Ausgabe gibt status: RUNNING an, dass die RayService-Ressource bereit ist.

  3. Prüfen Sie, ob GKE den Dienst für die Ray Serve-Anwendung erstellt hat:

    kubectl get service gemma-7b-it-serve-svc
    

    Die Ausgabe sieht in etwa so aus:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    gemma-7b-it-serve-svc   ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Llama 2 7B

  1. Modell bereitstellen:

    kubectl apply -f llama-2-7b/
    
  2. Warten Sie, bis die RayService-Ressource bereit ist:

    kubectl get rayservice llama-2-7b -o yaml
    

    Die Ausgabe sieht in etwa so aus:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    In dieser Ausgabe gibt status: RUNNING an, dass die RayService-Ressource bereit ist.

  3. Prüfen Sie, ob GKE den Dienst für die Ray Serve-Anwendung erstellt hat:

    kubectl get service llama-2-7b-serve-svc
    

    Die Ausgabe sieht in etwa so aus:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    llama-2-7b-serve-svc    ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Llama 3 8B

  1. Modell bereitstellen:

    kubectl apply -f llama-3-8b/
    
  2. Warten Sie, bis die RayService-Ressource bereit ist:

    kubectl get rayservice llama-3-8b -o yaml
    

    Die Ausgabe sieht in etwa so aus:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    In dieser Ausgabe gibt status: RUNNING an, dass die RayService-Ressource bereit ist.

  3. Prüfen Sie, ob GKE den Dienst für die Ray Serve-Anwendung erstellt hat:

    kubectl get service llama-3-8b-serve-svc
    

    Die Ausgabe sieht in etwa so aus:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    llama-3-8b-serve-svc    ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Mistral 7B

  1. Modell bereitstellen:

    kubectl apply -f mistral-7b/
    
  2. Warten Sie, bis die RayService-Ressource bereit ist:

    kubectl get rayservice mistral-7b -o yaml
    

    Die Ausgabe sieht in etwa so aus:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    In dieser Ausgabe gibt status: RUNNING an, dass die RayService-Ressource bereit ist.

  3. Prüfen Sie, ob GKE den Dienst für die Ray Serve-Anwendung erstellt hat:

    kubectl get service mistral-7b-serve-svc
    

    Die Ausgabe sieht in etwa so aus:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    mistral-7b-serve-svc    ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Modell bereitstellen

Die Modelle Llama2 7B und Llama3 8B verwenden die OpenAI API-Chatspezifikation. Die anderen Modelle unterstützen nur die Textgenerierung, bei der Text auf Grundlage eines Prompts generiert wird.

Portweiterleitung einrichten

Richten Sie die Portweiterleitung an den Server für die Inferenzausführung ein:

Gemma 2B IT

kubectl port-forward svc/gemma-2b-it-serve-svc 8000:8000

Gemma 7B IT

kubectl port-forward svc/gemma-7b-it-serve-svc 8000:8000

Llama2 7B

kubectl port-forward svc/llama-7b-serve-svc 8000:8000

Llama 3 8B

kubectl port-forward svc/llama-3-8b-serve-svc 8000:8000

Mistral 7B

kubectl port-forward svc/mistral-7b-serve-svc 8000:8000

Mithilfe von curl mit dem Modell interagieren

Mit curl mit Ihrem Modell chatten:

Gemma 2B IT

In einer neuen Terminalsitzung:

curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'

Gemma 7B IT

In einer neuen Terminalsitzung:

curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'

Llama2 7B

In einer neuen Terminalsitzung:

curl http://localhost:8000/v1/chat/completions     -H "Content-Type: application/json"     -d '{
      "model": "meta-llama/Llama-2-7b-chat-hf",
      "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What are the top 5 most popular programming languages? Please be brief."}
      ],
      "temperature": 0.7
    }'

Llama 3 8B

In einer neuen Terminalsitzung:

curl http://localhost:8000/v1/chat/completions     -H "Content-Type: application/json"     -d '{
      "model": "meta-llama/Meta-Llama-3-8B-Instruct",
      "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What are the top 5 most popular programming languages? Please be brief."}
      ],
      "temperature": 0.7
    }'

Mistral 7B

In einer neuen Terminalsitzung:

curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'

Die von Ihnen bereitgestellten Modelle speichern keinen Verlauf, sodass alle Nachrichten und Antworten an das Modell zurückgesendet werden müssen, um die Illusion eines Dialogs zu ermöglichen. Im folgenden Beispiel sehen Sie, wie Sie mit dem Modell Llama 3 8B einen interaktiven Dialog erstellen können:

Erstellen Sie mit curl einen Dialog mit dem Modell:

curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
      "model": "meta-llama/Meta-Llama-3-8B-Instruct",
      "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What are the top 5 most popular programming languages? Please be brief."},
        {"role": "assistant", "content": " \n1. Java\n2. Python\n3. C++\n4. C#\n5. JavaScript"},
        {"role": "user", "content": "Can you give me a brief description?"}
      ],
      "temperature": 0.7
}'

Die Ausgabe sieht in etwa so aus:

{
  "id": "cmpl-3cb18c16406644d291e93fff65d16e41",
  "object": "chat.completion",
  "created": 1719035491,
  "model": "meta-llama/Meta-Llama-3-8B-Instruct",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Here's a brief description of each:\n\n1. **Java**: A versatile language for building enterprise-level applications, Android apps, and web applications.\n2. **Python**: A popular language for data science, machine learning, web development, and scripting, known for its simplicity and ease of use.\n3. **C++**: A high-performance language for building operating systems, games, and other high-performance applications, with a focus on efficiency and control.\n4. **C#**: A modern, object-oriented language for building Windows desktop and mobile applications, as well as web applications using .NET.\n5. **JavaScript**: A versatile language for client-side scripting on the web, commonly used for creating interactive web pages, web applications, and mobile apps.\n\nNote: These descriptions are brief and don't do justice to the full capabilities and uses of each language."
      },
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null
    }
  ],
  "usage": {
    "prompt_tokens": 73,
    "total_tokens": 245,
    "completion_tokens": 172
  }
}

Optional: Verbindung zur Chatoberfläche herstellen

Mit Gradio können Sie Webanwendungen erstellen, mit denen Sie mit Ihrem Modell interagieren können. Gradio ist eine Python-Bibliothek mit einem ChatInterface-Wrapper, der Benutzeroberflächen für Chatbots erstellt. Bei Llama 2 7B und Llama 3 7B haben Sie Gradio beim Bereitstellen des LLM-Modells installiert.

  1. Richten Sie die Portweiterleitung zum gradio-Dienst ein:

    kubectl port-forward service/gradio 8080:8080 &
    
  2. Öffnen Sie http://localhost:8080 in Ihrem Browser, um mit dem Modell zu chatten.

Mehrere Modelle mit dem Modell-Multiplexverfahren bereitstellen

Beim Modell-Multiplexverfahren werden mehrere Modelle innerhalb desselben Ray-Clusters bereitgestellt. Sie können Traffic mithilfe von Anfrageheadern oder durch Load-Balancing an bestimmte Modelle weiterleiten.

In diesem Beispiel erstellen Sie über das Multiplexverfahren eine Ray Serve-Anwendung mit zwei Modellen: Gemma 7B IT und Llama 3 8B.

  1. Stellen Sie die RayService-Ressource bereit:

    kubectl apply -f model-multiplexing/
    
  2. Warten Sie, bis die RayService-Ressource bereit ist:

    kubectl get rayservice model-multiplexing -o yaml
    

    Die Ausgabe sieht in etwa so aus:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T14:00:41Z"
            serveDeploymentStatuses:
              MutliModelDeployment:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
              VLLMDeployment_1:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
            status: RUNNING
    

    In dieser Ausgabe gibt status: RUNNING an, dass die RayService-Ressource bereit ist.

  3. Prüfen Sie, ob GKE den Kubernetes-Dienst für die RayServe-Anwendung erstellt hat:

    kubectl get service model-multiplexing-serve-svc
    

    Die Ausgabe sieht in etwa so aus:

    NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    model-multiplexing-serve-svc   ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    
  4. Richten Sie die Portweiterleitung an die Ray Serve-Anwendung ein:

    kubectl port-forward svc/model-multiplexing-serve-svc 8000:8000
    
  5. Senden Sie eine Anfrage an das Gemma 7B IT-Modell:

    curl -X POST http://localhost:8000/ -H "Content-Type: application/json" --header "serve_multiplexed_model_id: google/gemma-7b-it" -d '{"prompt": "What are the top 5 most popular programming languages? Please be brief.", "max_tokens": 200}'
    

    Die Ausgabe sieht in etwa so aus:

    {"text": ["What are the top 5 most popular programming languages? Please be brief.\n\n1. JavaScript\n2. Java\n3. C++\n4. Python\n5. C#"]}
    
  6. Senden Sie eine Anfrage an das Llama 3 8B-Modell:

    curl -X POST http://localhost:8000/ -H "Content-Type: application/json" --header "serve_multiplexed_model_id: meta-llama/Meta-Llama-3-8B-Instruct" -d '{"prompt": "What are the top 5 most popular programming languages? Please be brief.", "max_tokens": 200}'
    

    Die Ausgabe sieht in etwa so aus:

    {"text": ["What are the top 5 most popular programming languages? Please be brief. Here are your top 5 most popular programming languages, based on the TIOBE Index, a widely used measure of the popularity of programming languages.\r\n\r\n1. **Java**: Used in Android app development, web development, and enterprise software development.\r\n2. **Python**: A versatile language used in data science, machine learning, web development, and automation.\r\n3. **C++**: A high-performance language used in game development, system programming, and high-performance computing.\r\n4. **C#**: Used in Windows and web application development, game development, and enterprise software development.\r\n5. **JavaScript**: Used in web development, mobile app development, and server-side programming with technologies like Node.js.\r\n\r\nSource: TIOBE Index (2022).\r\n\r\nThese rankings can vary depending on the source and methodology used, but this gives you a general idea of the most popular programming languages."]}
    
  7. Senden Sie eine Anfrage an ein zufälliges Modell, indem Sie den Header serve_multiplexed_model_id ausschließen:

    curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Please be brief.", "max_tokens": 200}'
    

    Die Ausgabe ist eine der Ausgaben aus den vorherigen Schritten.

Mehrere Modelle mit der Modellkomposition zusammenführen

Bei der Modellkomposition werden mehrere Modelle in einer einzigen Anwendung zusammengeführt. Mit der Modellkomposition können Sie Eingaben und Ausgaben über mehrere LLMs hinweg verketten und Ihre Modelle als einzelne Anwendung skalieren.

In diesem Beispiel kombinieren Sie zwei Modelle, Gemma 7B IT und Llama 3 8B, in einer einzigen Anwendung. Das erste Modell ist das Assistant-Modell, das Fragen beantwortet, die im Prompt gestellt werden. Das zweite Modell ist das Zusammenfassungsmodell. Die Ausgabe des Assistant-Modells wird an die Eingabe des Zusammenfassungsmodells angehängt. Das Endergebnis ist die zusammengefasste Version der Antwort des Assistant-Modells.

  1. Stellen Sie die RayService-Ressource bereit:

    kubectl apply -f model-composition/
    
  2. Warten Sie, bis die RayService-Ressource bereit ist:

    kubectl get rayservice model-composition -o yaml
    

    Die Ausgabe sieht in etwa so aus:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T14:00:41Z"
            serveDeploymentStatuses:
              MutliModelDeployment:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
              VLLMDeployment_1:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
            status: RUNNING
    

    In dieser Ausgabe gibt status: RUNNING an, dass die RayService-Ressource bereit ist.

  3. Prüfen Sie, ob GKE den Dienst für die Ray Serve-Anwendung erstellt hat:

    kubectl get service model-composition-serve-svc
    

    Die Ausgabe sieht in etwa so aus:

    NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    model-composition-serve-svc    ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    
  4. Senden Sie eine Anfrage an das Modell:

    curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What is the most popular programming language for machine learning and why?", "max_tokens": 1000}'
    
  5. Die Ausgabe sieht in etwa so aus:

    {"text": ["\n\n**Sure, here is a summary in a single sentence:**\n\nThe most popular programming language for machine learning is Python due to its ease of use, extensive libraries, and growing community."]}
    

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 Ressourcen löschen

Wenn Sie ein vorhandenes Projekt verwendet haben und es nicht löschen möchten, können Sie die einzelnen Ressourcen löschen.

  1. Löschen Sie den Cluster:

    gcloud container clusters delete rayserve-cluster
    

Nächste Schritte