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:
- Autopilot- oder Standard-GKE-Cluster mit aktiviertem Ray-Operator-Add-on erstellen.
- RayService-Ressource-Deployment, das ein Large Language Model (LLM) von Hugging Face herunterlädt und bereitstellt.
- 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
Starten Sie in der Google Cloud Console eine Cloud Shell-Instanz:
Cloud Shell öffnenKlonen 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`
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 muss1.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:
Konfigurieren Sie
kubectl
für die Kommunikation mit Ihrem Cluster:gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${COMPUTE_REGION}
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
Modell bereitstellen:
kubectl apply -f gemma-2b-it/
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.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
Modell bereitstellen:
kubectl apply -f gemma-7b-it/
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.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
Modell bereitstellen:
kubectl apply -f llama-2-7b/
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.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
Modell bereitstellen:
kubectl apply -f llama-3-8b/
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.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
Modell bereitstellen:
kubectl apply -f mistral-7b/
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.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.
Richten Sie die Portweiterleitung zum
gradio
-Dienst ein:kubectl port-forward service/gradio 8080:8080 &
Ö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.
Stellen Sie die RayService-Ressource bereit:
kubectl apply -f model-multiplexing/
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.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
Richten Sie die Portweiterleitung an die Ray Serve-Anwendung ein:
kubectl port-forward svc/model-multiplexing-serve-svc 8000:8000
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#"]}
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."]}
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.
Stellen Sie die RayService-Ressource bereit:
kubectl apply -f model-composition/
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.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
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}'
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
- 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.
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.
Löschen Sie den Cluster:
gcloud container clusters delete rayserve-cluster
Nächste Schritte
- Erfahren Sie, wie Sie optimierte KI-/ML-Arbeitslasten über Funktionen zur GKE-Plattformorchestrierung ausführen.
- Modell mit GPUs im GKE Standard-Modus trainieren
- Beispielcode auf GitHub