In dieser Anleitung wird beschrieben, wie Sie ein Large Language Model (LLM) mit Tensor Processing Units (TPUs) in Google Kubernetes Engine (GKE) mit dem Ray Operator-Add-on und dem vLLM-Bereitstellungs-Framework bereitstellen.
In dieser Anleitung können Sie LLM-Modelle auf TPU v5e oder TPU Trillium (v6e) bereitstellen:
- Llama 3 8B instruct auf einer Single-Host-TPU v5e.
- Mistral 7B instruct v0.3 auf einer TPU v5e mit einem Host.
- Llama 3.1 70B auf einer einzelnen Host-TPU Trillium (v6e).
Dieser Leitfaden richtet sich an Kunden von generativer KI, neue und bestehende GKE-Nutzer, ML-Entwickler, MLOps-Entwickler (DevOps) oder Plattformadministratoren, die daran interessiert sind, Funktionen zur Kubernetes-Containerorchestrierung für die Bereitstellung von Modellen mit Ray auf TPUs mit vLLM zu nutzen.
Hintergrund
In diesem Abschnitt werden die in diesem Leitfaden verwendeten Schlüsseltechnologien beschrieben.
Verwalteter Kubernetes-Dienst von GKE
Google Cloud bietet eine Vielzahl von Diensten, darunter GKE, der sich gut für die Bereitstellung und Verwaltung von KI-/ML-Arbeitslasten eignet. GKE ist ein verwalteter Kubernetes-Dienst, der die Bereitstellung, Skalierung und Verwaltung von Containeranwendungen vereinfacht. GKE bietet die erforderliche Infrastruktur, einschließlich skalierbarer Ressourcen, verteiltes Computing und effiziente Netzwerke, um die Rechenanforderungen von LLMs zu bewältigen.
Weitere Informationen zu wichtigen Kubernetes-Konzepten finden Sie unter Informationen zu Kubernetes. Weitere Informationen zu GKE und dazu, wie Sie damit Kubernetes skalieren, automatisieren und verwalten können, finden Sie in der GKE-Übersicht.
Ray Operator
Das Ray Operator-Add-on in GKE bietet eine End-to-End-KI-/ML-Plattform für die Bereitstellung, das Training und die Optimierung von ML-Arbeitslasten. In dieser Anleitung verwenden Sie Ray Serve, ein Framework in Ray, um beliebte LLMs von Hugging Face bereitzustellen.
TPUs
TPUs sind von Google speziell entwickelte anwendungsspezifische integrierte Schaltungen (Application-Specific Integrated Circuits, ASICs), die verwendet werden, um das maschinelle Lernen und die KI-Modelle zu beschleunigen, die mit Frameworks wie folgenden erstellt wurden:TensorFlow, PyTorch und JAX.
In dieser Anleitung wird beschrieben, wie Sie LLM-Modelle auf TPU v5e- oder TPU Trillium-Knoten (v6e) bereitstellen. Dabei werden TPU-Topologien basierend auf den Anforderungen der einzelnen Modelle für die Bereitstellung von Prompts mit niedriger Latenz konfiguriert.
vLLM
vLLM ist ein hoch optimiertes Open-Source-LLM-Bereitstellungs-Framework, das den Bereitstellungsdurchsatz auf TPUs über Funktionen wie die Folgenden beschleunigen kann:
- Optimierte Transformer-Implementierung mit PagedAttention
- Kontinuierliche Batchverarbeitung zur Verbesserung des allgemeinen Bereitstellungsdurchsatzes
- Tensor-Parallelität und verteilte Bereitstellung auf mehreren GPUs
Weitere Informationen finden Sie in der vLLM-Dokumentation.
Ziele
Diese Anleitung umfasst die folgenden Schritte:
- Erstellen Sie einen GKE-Cluster mit einem TPU-Knotenpool.
- Stellen Sie eine benutzerdefinierte RayCluster-Ressource mit einem TPU-Slice mit einem Host bereit. In GKE wird die benutzerdefinierte RayCluster-Ressource als Kubernetes-Pods bereitgestellt.
- LLM bereitstellen
- Mit den Modellen interagieren
Optional können Sie die folgenden Ressourcen und Techniken für die Modellbereitstellung konfigurieren, die vom Ray Serve-Framework unterstützt werden:
- Stellen Sie eine benutzerdefinierte RayService-Ressource bereit.
- Mehrere Modelle mit der Modellkomposition zusammenführen.
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 updateab. 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. Diesen Zugriff erhalten Sie in der Regel, indem Sie eine Vereinbarung unterzeichnen und auf der Hugging Face-Modellseite Zugriff vom Modelleigentümer anfordern.
- Prüfen Sie, ob Sie die folgenden IAM-Rollen haben:
roles/container.adminroles/iam.serviceAccountAdminroles/container.clusterAdminroles/artifactregistry.writer
Umgebung vorbereiten
Prüfen Sie, ob Sie in Ihrem Google Cloud -Projekt ein ausreichendes Kontingent für eine TPU v5e mit einem einzelnen Host oder eine TPU Trillium (v6e) mit einem einzelnen Host haben. Informationen zum Verwalten Ihres Kontingents finden Sie unter TPU-Kontingente.
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-samplesWechseln Sie zum Arbeitsverzeichnis:
cd ai-ml/gke-ray/rayserve/llmLegen Sie die Standardumgebungsvariablen für die Erstellung des GKE-Cluster fest:
Llama-3-8B-Instruct
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="meta-llama/Meta-Llama-3-8B-Instruct" export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svcErsetzen Sie Folgendes:
HUGGING_FACE_TOKEN: Ihr Hugging Face-Zugriffstoken.REGION: Die Region, in der Sie TPU-Kontingent haben. Prüfen Sie, ob die TPU-Version, die Sie verwenden möchten, in dieser Region verfügbar ist. Weitere Informationen finden Sie unter TPU-Verfügbarkeit in GKE.ZONE: Die Zone mit verfügbarem TPU-Kontingent.VLLM_IMAGE: Das vLLM-TPU-Image. Sie können das öffentlichedocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1-Image verwenden oder ein eigenes TPU-Image erstellen.
Mistral-7B
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="mistralai/Mistral-7B-Instruct-v0.3" export TOKENIZER_MODE=mistral export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svcErsetzen Sie Folgendes:
HUGGING_FACE_TOKEN: Ihr Hugging Face-Zugriffstoken.REGION: Die Region, in der Sie TPU-Kontingent haben. Prüfen Sie, ob die TPU-Version, die Sie verwenden möchten, in dieser Region verfügbar ist. Weitere Informationen finden Sie unter TPU-Verfügbarkeit in GKE.ZONE: Die Zone mit verfügbarem TPU-Kontingent.VLLM_IMAGE: Das vLLM-TPU-Image. Sie können das öffentlichedocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1-Image verwenden oder ein eigenes TPU-Image erstellen.
Llama 3.1 70B
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="meta-llama/Llama-3.1-70B" export MAX_MODEL_LEN=8192 export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svcErsetzen Sie Folgendes:
HUGGING_FACE_TOKEN: Ihr Hugging Face-Zugriffstoken.REGION: Die Region, in der Sie TPU-Kontingent haben. Prüfen Sie, ob die TPU-Version, die Sie verwenden möchten, in dieser Region verfügbar ist. Weitere Informationen finden Sie unter TPU-Verfügbarkeit in GKE.ZONE: Die Zone mit verfügbarem TPU-Kontingent.VLLM_IMAGE: Das vLLM-TPU-Image. Sie können das öffentlichedocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1-Image verwenden oder ein eigenes TPU-Image erstellen.
Rufen Sie das vLLM-Container-Image ab:
sudo usermod -aG docker ${USER} newgrp docker docker pull ${VLLM_IMAGE}
Cluster erstellen
Sie können eine LLM auf TPUs mit Ray in einem GKE Autopilot- oder Standardcluster mit dem Ray Operator-Add-on bereitstellen.
Verwenden Sie einen Autopilot-Cluster für eine vollständig verwaltete Kubernetes-Umgebung. 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
GKE Autopilot-Cluster mit aktiviertem Ray-Operator-Add-on erstellen:
gcloud container clusters create-auto ${CLUSTER_NAME} \ --enable-ray-operator \ --release-channel=rapid \ --location=${COMPUTE_REGION}
Standard
Standardcluster mit aktiviertem Ray-Operator-Add-on erstellen:
gcloud container clusters create ${CLUSTER_NAME} \ --release-channel=rapid \ --location=${COMPUTE_ZONE} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --machine-type="n1-standard-4" \ --addons=RayOperator,GcsFuseCsiDriverSo erstellen Sie einen TPU-Slice-Knotenpool mit einem Host:
Llama-3-8B-Instruct
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-8t \ --num-nodes=1GKE erstellt einen TPU v5e-Knotenpool mit dem Maschinentyp
ct5lp-hightpu-8t.Mistral-7B
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-8t \ --num-nodes=1GKE erstellt einen TPU v5e-Knotenpool mit dem Maschinentyp
ct5lp-hightpu-8t.Llama 3.1 70B
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-8t \ --num-nodes=1GKE erstellt einen TPU v6e-Knotenpool mit dem Maschinentyp
ct6e-standard-8t.
kubectl für die Kommunikation mit Ihrem Cluster konfigurieren
Führen Sie den folgenden Befehl aus, um kubectl für die Kommunikation mit Ihrem Cluster zu konfigurieren:
Autopilot
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_REGION}
Standard
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_ZONE}
Kubernetes-Secret für Hugging Face-Anmeldedaten erstellen
Führen Sie den folgenden Befehl aus, um ein Kubernetes-Secret zu erstellen, 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 --namespace ${NAMESPACE} apply -f -
Cloud Storage-Bucket erstellen
Um die Startzeit der vLLM-Bereitstellung zu verkürzen und den erforderlichen Speicherplatz pro Knoten zu minimieren, verwenden Sie den Cloud Storage FUSE CSI-Treiber, um das heruntergeladene Modell und den Kompilierungscache auf den Ray-Knoten bereitzustellen.
Führen Sie in Cloud Shell den folgenden Befehl aus:
gcloud storage buckets create gs://${GSBUCKET} \
--uniform-bucket-level-access
Mit diesem Befehl wird ein Cloud Storage-Bucket zum Speichern der Modelldateien erstellt, die Sie von Hugging Face herunterladen.
Kubernetes-Dienstkonto für den Zugriff auf den Bucket einrichten
Erstellen Sie das Kubernetes-Dienstkonto:
kubectl create serviceaccount ${KSA_NAME} \ --namespace ${NAMESPACE}Gewähren Sie dem Kubernetes-Dienstkonto Lese-/Schreibzugriff auf den Cloud Storage-Bucket:
gcloud storage buckets add-iam-policy-binding gs://${GSBUCKET} \ --member "principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${NAMESPACE}/sa/${KSA_NAME}" \ --role "roles/storage.objectUser"GKE erstellt die folgenden Ressourcen für das LLM:
- Ein Cloud Storage-Bucket zum Speichern des heruntergeladenen Modells und des Kompilierungscache. Ein Cloud Storage FUSE-CSI-Treiber liest den Inhalt des Buckets.
- Volumes mit aktiviertem Datei-Caching und die Funktion Paralleler Download von Cloud Storage FUSE.
Best Practice: Verwenden Sie einen Dateicache, der von
tmpfsoderHyperdisk / Persistent Diskunterstützt wird, je nach erwarteter Größe der Modellinhalte, z. B. Gewichtsdateien. In dieser Anleitung verwenden Sie einen durch RAM unterstützten Cloud Storage FUSE-Dateicache.
Benutzerdefinierte RayCluster-Ressource bereitstellen
Stellen Sie eine benutzerdefinierte RayCluster-Ressource bereit, die in der Regel aus einem System-Pod und mehreren Worker-Pods besteht.
Llama-3-8B-Instruct
Erstellen Sie die benutzerdefinierte RayCluster-Ressource, um das auf Anweisungen abgestimmte Llama 3-Modell mit 8 Milliarden Parametern bereitzustellen. Führen Sie dazu die folgenden Schritte aus:
Prüfen Sie das
ray-cluster.tpu-v5e-singlehost.yaml-Manifest:Wenden Sie das Manifest an:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -Mit dem Befehl
envsubstwerden die Umgebungsvariablen im Manifest ersetzt.
GKE erstellt eine benutzerdefinierte RayCluster-Ressource mit einem workergroup, das einen TPU v5e-Einzelhost in einer 2x4-Topologie enthält.
Mistral-7B
Erstellen Sie die benutzerdefinierte RayCluster-Ressource, um das Mistral-7B-Modell bereitzustellen. Gehen Sie dazu so vor:
Prüfen Sie das
ray-cluster.tpu-v5e-singlehost.yaml-Manifest:Wenden Sie das Manifest an:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -Mit dem Befehl
envsubstwerden die Umgebungsvariablen im Manifest ersetzt.
GKE erstellt eine benutzerdefinierte RayCluster-Ressource mit einem workergroup, das einen TPU v5e-Einzelhost in einer 2x4-Topologie enthält.
Llama 3.1 70B
Erstellen Sie die benutzerdefinierte RayCluster-Ressource, um das Modell Llama 3.1 70B bereitzustellen. Führen Sie dazu die folgenden Schritte aus:
Prüfen Sie das
ray-cluster.tpu-v6e-singlehost.yaml-Manifest:Wenden Sie das Manifest an:
envsubst < tpu/ray-cluster.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -Mit dem Befehl
envsubstwerden die Umgebungsvariablen im Manifest ersetzt.
GKE erstellt eine benutzerdefinierte RayCluster-Ressource mit einem workergroup, das einen TPU v6e-Einzelhost in einer 2x4-Topologie enthält.
Verbindung zur benutzerdefinierten RayCluster-Ressource herstellen
Nachdem die benutzerdefinierte RayCluster-Ressource erstellt wurde, können Sie eine Verbindung zur RayCluster-Ressource herstellen und mit der Bereitstellung des Modells beginnen.
Prüfen Sie, ob GKE den RayCluster-Dienst erstellt hat:
kubectl --namespace ${NAMESPACE} get raycluster/vllm-tpu \ --output wideDie Ausgabe sieht etwa so aus:
NAME DESIRED WORKERS AVAILABLE WORKERS CPUS MEMORY GPUS TPUS STATUS AGE HEAD POD IP HEAD SERVICE IP vllm-tpu 1 1 ### ###G 0 8 ready ### ###.###.###.### ###.###.###.###Warten Sie, bis
STATUSden Wertreadyhat und in den SpaltenHEAD POD IPundHEAD SERVICE IPeine IP-Adresse angezeigt wird.Richten Sie
port-forwarding-Sitzungen zum Ray-Head ein:pkill -f "kubectl .* port-forward .* 8265:8265" pkill -f "kubectl .* port-forward .* 10001:10001" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null & kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 10001:10001 2>&1 >/dev/null &Prüfen Sie, ob der Ray-Client eine Verbindung zur benutzerdefinierten Remote-RayCluster-Ressource herstellen kann:
docker run --net=host -it ${VLLM_IMAGE} \ ray list nodes --address http://localhost:8265Die Ausgabe sieht etwa so aus:
======== List: YYYY-MM-DD HH:MM:SS.NNNNNN ======== Stats: ------------------------------ Total: 2 Table: ------------------------------ NODE_ID NODE_IP IS_HEAD_NODE STATE STATE_MESSAGE NODE_NAME RESOURCES_TOTAL LABELS 0 XXXXXXXXXX ###.###.###.### True ALIVE ###.###.###.### CPU: 2.0 ray.io/node_id: XXXXXXXXXX memory: #.### GiB node:###.###.###.###: 1.0 node:__internal_head__: 1.0 object_store_memory: #.### GiB 1 XXXXXXXXXX ###.###.###.### False ALIVE ###.###.###.### CPU: 100.0 ray.io/node_id: XXXXXXXXXX TPU: 8.0 TPU-v#e-8-head: 1.0 accelerator_type:TPU-V#E: 1.0 memory: ###.### GiB node:###.###.###.###: 1.0 object_store_memory: ##.### GiB tpu-group-0: 1.0
Modell mit vLLM bereitstellen
So stellen Sie ein bestimmtes Modell mit vLLM bereit:
Llama-3-8B-Instruct
docker run \
--env MODEL_ID=${MODEL_ID} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MODEL_ID": "meta-llama/Meta-Llama-3-8B-Instruct"}}'
Mistral-7B
docker run \
--env MODEL_ID=${MODEL_ID} \
--env TOKENIZER_MODE=${TOKENIZER_MODE} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MODEL_ID": "mistralai/Mistral-7B-Instruct-v0.3", "TOKENIZER_MODE": "mistral"}}'
Llama 3.1 70B
docker run \
--env MAX_MODEL_LEN=${MAX_MODEL_LEN} \
--env MODEL_ID=${MODEL_ID} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MAX_MODEL_LEN": "8192", "MODEL_ID": "meta-llama/Meta-Llama-3.1-70B"}}'
Ray-Dashboard aufrufen
Sie können Ihre Ray Serve-Bereitstellung und relevante Logs im Ray-Dashboard aufrufen.
- Klicken Sie oben rechts in der Cloud Shell-Taskleiste auf die Schaltfläche
Webvorschau.
- Klicken Sie auf Port ändern und legen Sie die Portnummer auf
8265fest. - Klicken Sie auf Ändern und Vorschau.
- Klicken Sie im Ray-Dashboard auf den Tab Bereitstellen.
Sobald die Bereitstellung des Modells den Status HEALTHY hat, kann das Modell mit der Verarbeitung von Eingaben beginnen.
Modell bereitstellen
In diesem Leitfaden werden Modelle vorgestellt, die die Textgenerierung unterstützen. Mit dieser Technik können Textinhalte aus einem Prompt erstellt werden.
Llama-3-8B-Instruct
Richten Sie die Portweiterleitung an den Server ein:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &Senden Sie einen Prompt an den Serve-Endpunkt:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Mistral-7B
Richten Sie die Portweiterleitung an den Server ein:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &Senden Sie einen Prompt an den Serve-Endpunkt:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Llama 3.1 70B
Richten Sie die Portweiterleitung an den Server ein:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &Senden Sie einen Prompt an den Serve-Endpunkt:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Zusätzliche Konfiguration
Optional können Sie die folgenden Ressourcen und Techniken für die Modellbereitstellung konfigurieren, die vom Ray Serve-Framework unterstützt werden:
- Benutzerdefinierte RayService-Ressource bereitstellen In den vorherigen Schritten dieser Anleitung verwenden Sie RayCluster anstelle von RayService. Wir empfehlen RayService für Produktionsumgebungen.
- Mehrere Modelle mit der Modellkomposition zusammenführen Konfigurieren Sie das Multiplexverfahren und die Modellkomposition, die vom Ray Serve-Framework unterstützt werden. Mit der Modellkomposition können Sie Eingaben und Ausgaben über mehrere LLMs hinweg verketten und Ihre Modelle als einzelne Anwendung skalieren.
- Eigenes TPU-Image erstellen und bereitstellen Wir empfehlen diese Option, wenn Sie eine detailliertere Kontrolle über den Inhalt Ihres Docker-Images benötigen.
RayService bereitstellen
Sie können dieselben Modelle aus dieser Anleitung mit einer benutzerdefinierten RayService-Ressource bereitstellen.
Löschen Sie die benutzerdefinierte RayCluster-Ressource, die Sie in dieser Anleitung erstellt haben:
kubectl --namespace ${NAMESPACE} delete raycluster/vllm-tpuErstellen Sie die benutzerdefinierte RayService-Ressource, um ein Modell bereitzustellen:
Llama-3-8B-Instruct
Prüfen Sie das
ray-service.tpu-v5e-singlehost.yaml-Manifest:Wenden Sie das Manifest an:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -Mit dem Befehl
envsubstwerden die Umgebungsvariablen im Manifest ersetzt.GKE erstellt einen RayService mit einem
workergroup, der einen TPU v5e-Einzelhost in einer2x4-Topologie enthält.
Mistral-7B
Prüfen Sie das
ray-service.tpu-v5e-singlehost.yaml-Manifest:Wenden Sie das Manifest an:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -Mit dem Befehl
envsubstwerden die Umgebungsvariablen im Manifest ersetzt.GKE erstellt einen RayService mit einem
workergroup, der einen TPU v5e-Einzelhost in einer2x4-Topologie enthält.
Llama 3.1 70B
Prüfen Sie das
ray-service.tpu-v6e-singlehost.yaml-Manifest:Wenden Sie das Manifest an:
envsubst < tpu/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -Mit dem Befehl
envsubstwerden die Umgebungsvariablen im Manifest ersetzt.
GKE erstellt eine benutzerdefinierte RayCluster-Ressource, in der die Ray Serve-Anwendung bereitgestellt wird, und die nachfolgende benutzerdefinierte RayService-Ressource wird erstellt.
Prüfen Sie den Status der RayService-Ressource:
kubectl --namespace ${NAMESPACE} get rayservices/vllm-tpuWarten Sie, bis sich der Dienststatus in
Runningändert:NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 1Rufen Sie den Namen des RayCluster-Head-Dienstes ab:
SERVICE_NAME=$(kubectl --namespace=${NAMESPACE} get rayservices/vllm-tpu \ --template={{.status.activeServiceStatus.rayClusterStatus.head.serviceName}})Stellen Sie
port-forwarding-Sitzungen zum Ray-Head her, um das Ray-Dashboard aufzurufen:pkill -f "kubectl .* port-forward .* 8265:8265" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null &Bereinigen Sie die RayService-Ressource:
kubectl --namespace ${NAMESPACE} delete rayservice/vllm-tpu
Mehrere Modelle mit der Modellkomposition zusammenführen
Bei der Modellkomposition werden mehrere Modelle zu einer einzigen Anwendung zusammengefasst.
In diesem Abschnitt verwenden Sie einen GKE-Cluster, um zwei Modelle, Llama 3 8B IT und Gemma 7B IT, in einer einzigen Anwendung zusammenzufassen:
- 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.
So erhalten Sie Zugriff auf das Gemma-Modell:
- Melden Sie sich in der Kaggle-Plattform an, unterzeichnen Sie die Lizenz-Einwilligungsvereinbarung und rufen Sie ein Kaggle API-Token ab. In dieser Anleitung verwenden Sie ein Kubernetes Secret für die Kaggle-Anmeldedaten.
- Rufen Sie die Seite zur Modelleinwilligung auf Kaggle.com auf.
- Melden Sie sich bei Kaggle an, falls Sie dies noch nicht getan haben.
- Klicken Sie auf Zugriffsanfrage.
- Wählen Sie im Abschnitt Konto zur Einwilligung die Option Über Kaggle-Konto verifizieren aus, um Ihr Kaggle-Konto für das Erteilen der Einwilligung zu verwenden.
- Akzeptieren Sie die Nutzungsbedingungen des Modells.
Richten Sie Ihre Umgebung ein:
export ASSIST_MODEL_ID=meta-llama/Meta-Llama-3-8B-Instruct export SUMMARIZER_MODEL_ID=google/gemma-7b-itErstellen Sie für Standard-Cluster einen zusätzlichen TPU-Slice-Knotenpool mit einem Host:
gcloud container node-pools create tpu-2 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=MACHINE_TYPE \ --num-nodes=1Ersetzen Sie
MACHINE_TYPEdurch einen der folgenden Maschinentypen:ct5lp-hightpu-8tzum Bereitstellen von TPU v5e.ct6e-standard-8tzum Bereitstellen von TPU v6e.
In Autopilot-Clustern werden die erforderlichen Knoten automatisch bereitgestellt.
Stellen Sie die RayService-Ressource basierend auf der TPU-Version bereit, die Sie verwenden möchten:
TPU v5e
Prüfen Sie das
ray-service.tpu-v5e-singlehost.yaml-Manifest:Wenden Sie das Manifest an:
envsubst < model-composition/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
TPU v6e
Prüfen Sie das
ray-service.tpu-v6e-singlehost.yaml-Manifest:Wenden Sie das Manifest an:
envsubst < model-composition/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Warten Sie, bis sich der Status der RayService-Ressource in
Runningändert:kubectl --namespace ${NAMESPACE} get rayservice/vllm-tpuDie Ausgabe sieht etwa so aus:
NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 2In dieser Ausgabe gibt der Status
RUNNINGan, dass die RayService-Ressource bereit ist.Prüfen Sie, ob GKE den Dienst für die Ray Serve-Anwendung erstellt hat:
kubectl --namespace ${NAMESPACE} get service/vllm-tpu-serve-svcDie Ausgabe sieht etwa so aus:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vllm-tpu-serve-svc ClusterIP ###.###.###.### <none> 8000/TCP ###Richten Sie
port-forwarding-Sitzungen zum Ray-Head ein:pkill -f "kubectl .* port-forward .* 8265:8265" pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/vllm-tpu-serve-svc 8265:8265 2>&1 >/dev/null & kubectl --namespace ${NAMESPACE} port-forward service/vllm-tpu-serve-svc 8000:8000 2>&1 >/dev/null &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 etwa so aus:
{"text": [" used in various data science projects, including building machine learning models, preprocessing data, and visualizing results.\n\nSure, here is a single sentence summarizing the text:\n\nPython is the most popular programming language for machine learning and is widely used in data science projects, encompassing model building, data preprocessing, and visualization."]}
TPU-Image erstellen und bereitstellen
In dieser Anleitung werden gehostete TPU-Images von vLLM verwendet. vLLM bietet ein Dockerfile.tpu-Image, das vLLM auf dem erforderlichen PyTorch XLA-Image mit TPU-Abhängigkeiten aufbaut. Sie können aber auch Ihr eigenes TPU-Image erstellen und bereitstellen, um mehr Kontrolle über den Inhalt Ihres Docker-Images zu haben.
Erstellen Sie ein Docker-Repository zum Speichern der Container-Images für diese Anleitung:
gcloud artifacts repositories create vllm-tpu --repository-format=docker --location=${COMPUTE_REGION} && \ gcloud auth configure-docker ${COMPUTE_REGION}-docker.pkg.devKlonen Sie das vLLM-Repository:
git clone https://github.com/vllm-project/vllm.git cd vllmErstellen Sie das Image:
docker build -f ./docker/Dockerfile.tpu . -t vllm-tpuTaggen Sie das TPU-Image mit dem Namen Ihrer Artifact Registry:
export VLLM_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/vllm-tpu/vllm-tpu:TAG docker tag vllm-tpu ${VLLM_IMAGE}Ersetzen Sie
TAGdurch den Namen des Tags, das Sie definieren möchten. Wenn Sie kein Tag angeben, wendet Docker das Standard-Tag „latest“ an.Übertragen Sie das Image per Push an Artifact Registry.
docker push ${VLLM_IMAGE}
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 die benutzerdefinierte RayCluster-Ressource:
kubectl --namespace ${NAMESPACE} delete rayclusters vllm-tpuLöschen Sie den Cloud Storage-Bucket:
gcloud storage rm -r gs://${GSBUCKET}Löschen Sie das Artifact Registry-Repository:
gcloud artifacts repositories delete vllm-tpu \ --location=${COMPUTE_REGION}Löschen Sie den Cluster:
gcloud container clusters delete ${CLUSTER_NAME} \ --location=LOCATIONErsetzen Sie
LOCATIONdurch eine der folgenden Umgebungsvariablen:- Verwenden Sie für Autopilot-Cluster
COMPUTE_REGION. - Verwenden Sie für Standardcluster
COMPUTE_ZONE.
- Verwenden Sie für Autopilot-Cluster
Projekt löschen
Wenn Sie die Anleitung in einem neuen Google Cloud -Projekt bereitgestellt haben und das Projekt nicht mehr benötigen, löschen Sie es mit den folgenden Schritten:
- 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.
Nächste Schritte
- Erfahren Sie, wie Sie optimierte KI-/ML-Arbeitslasten über Funktionen zur GKE-Plattformorchestrierung ausführen.
- Beispielcode in GitHub
- Hier erfahren Sie, wie Sie Messwerte für Ray-Cluster, die in GKE ausgeführt werden, erfassen und ansehen.