Questo tutorial mostra come pubblicare un modello linguistico di grandi dimensioni (LLM) utilizzando le unità di elaborazione tensoriale (TPU) su Google Kubernetes Engine (GKE) con il componente aggiuntivo Ray Operator e il vLLM.
In questo tutorial, puoi pubblicare modelli LLM su TPU v5e o TPU Trillium (v6e) nel seguente modo:
- Llama 3 8B instruct su una TPU v5e a host singolo.
- Mistral 7B instruct v0.3 su una singola TPU v5e.
- Llama 3.1 70B su una TPU Trillium (v6e) a host singolo.
Questa guida è rivolta ai clienti dell'AI generativa, agli utenti nuovi ed esistenti di GKE, agli ingegneri ML, agli ingegneri MLOps (DevOps) o agli amministratori della piattaforma interessati a utilizzare le funzionalità di orchestrazione dei container Kubernetes per pubblicare modelli utilizzando Ray, sulle TPU con vLLM.
Sfondo
Questa sezione descrive le tecnologie chiave utilizzate in questa guida.
Servizio Kubernetes gestito GKE
Google Cloud offre un'ampia gamma di servizi, tra cui GKE, che è ideale per il deployment e la gestione dei carichi di lavoro di AI/ML. GKE è un servizio Kubernetes gestito che semplifica il deployment, la scalabilità e la gestione delle applicazioni containerizzate. GKE fornisce l'infrastruttura necessaria, tra cui risorse scalabili, computing distribuito e networking efficiente, per gestire le esigenze di calcolo degli LLM.
Per saperne di più sui concetti chiave di Kubernetes, consulta la sezione Inizia a scoprire Kubernetes. Per scoprire di più su GKE e su come ti aiuta a scalare, automatizzare e gestire Kubernetes, consulta la panoramica di GKE.
Operatore Ray
Il componente aggiuntivo Ray Operator su GKE fornisce una piattaforma AI/ML end-to-end per l'erogazione, l'addestramento e l'ottimizzazione dei carichi di lavoro di machine learning. In questo tutorial, utilizzerai Ray Serve, un framework in Ray, per distribuire LLM popolari da Hugging Face.
TPU
Le TPU sono circuiti integrati specifici per le applicazioni (ASIC) sviluppati da Google e utilizzati per accelerare i modelli di machine learning e AI creati utilizzando framework come TensorFlow, PyTorch e JAX.
Questo tutorial illustra l'erogazione di modelli LLM su nodi TPU v5e o TPU Trillium (v6e) con topologie TPU configurate in base ai requisiti di ciascun modello per l'erogazione di prompt a bassa latenza.
vLLM
vLLM è un framework di erogazione degli LLM open source altamente ottimizzato che può aumentare la velocità effettiva di erogazione sulle TPU, con funzionalità quali:
- Implementazione ottimizzata di Transformer con PagedAttention
- Batch continuo per migliorare la velocità effettiva complessiva della pubblicazione
- Parallelismo dei tensori e pubblicazione distribuita su più GPU
Per saperne di più, consulta la documentazione di vLLM.
Obiettivi
Questo tutorial illustra i seguenti passaggi:
- Crea un cluster GKE con un pool di nodi TPU.
- Esegui il deployment di una risorsa personalizzata RayCluster con una sezione TPU a host singolo. GKE esegue il deployment della risorsa personalizzata RayCluster come pod Kubernetes.
- Gestisci un LLM.
- Interagisci con i modelli.
Facoltativamente, puoi configurare le seguenti risorse e tecniche di pubblicazione dei modelli supportate dal framework Ray Serve:
- Esegui il deployment di una risorsa personalizzata RayService.
- Componi più modelli con la composizione dei modelli.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima versione
eseguendo
gcloud components update
.
- Crea un account Hugging Face, se non ne hai già uno.
- Assicurati di avere un token Hugging Face.
- Assicurati di avere accesso al modello Hugging Face che vuoi utilizzare. In genere, ottieni questo accesso firmando un contratto e richiedendolo al proprietario del modello nella pagina del modello Hugging Face.
- Assicurati di disporre dei seguenti ruoli IAM:
roles/container.admin
roles/iam.serviceAccountAdmin
roles/container.clusterAdmin
roles/artifactregistry.writer
prepara l'ambiente
Verifica di avere una quota sufficiente nel tuo progetto Google Cloud per una TPU v5e a singolo host o una TPU Trillium (v6e) a singolo host. Per gestire la quota, consulta la pagina Quote TPU.
Nella console Google Cloud , avvia un'istanza Cloud Shell:
Apri Cloud ShellClona il repository di esempio:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samples
Vai alla directory di lavoro:
cd ai-ml/gke-ray/rayserve/llm
Imposta le variabili di ambiente predefinite per la creazione del cluster GKE:
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-svc
Sostituisci quanto segue:
HUGGING_FACE_TOKEN
: il token di accesso a Hugging Face.REGION
: la regione in cui hai una quota TPU. Assicurati che la versione della TPU che vuoi utilizzare sia disponibile in questa regione. Per saperne di più, consulta la sezione Disponibilità di TPU in GKE.ZONE
: la zona con la quota TPU disponibile.VLLM_IMAGE
: l'immagine TPU vLLM. Puoi utilizzare l'immagine pubblicadocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
o creare la tua immagine TPU.
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-svc
Sostituisci quanto segue:
HUGGING_FACE_TOKEN
: il token di accesso a Hugging Face.REGION
: la regione in cui hai una quota TPU. Assicurati che la versione della TPU che vuoi utilizzare sia disponibile in questa regione. Per saperne di più, consulta la sezione Disponibilità di TPU in GKE.ZONE
: la zona con la quota TPU disponibile.VLLM_IMAGE
: l'immagine TPU vLLM. Puoi utilizzare l'immagine pubblicadocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
o creare la tua immagine TPU.
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-svc
Sostituisci quanto segue:
HUGGING_FACE_TOKEN
: il token di accesso a Hugging Face.REGION
: la regione in cui hai una quota TPU. Assicurati che la versione della TPU che vuoi utilizzare sia disponibile in questa regione. Per saperne di più, consulta la sezione Disponibilità di TPU in GKE.ZONE
: la zona con la quota TPU disponibile.VLLM_IMAGE
: l'immagine TPU vLLM. Puoi utilizzare l'immagine pubblicadocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
o creare la tua immagine TPU.
Estrai l'immagine container vLLM:
sudo usermod -aG docker ${USER} newgrp docker docker pull ${VLLM_IMAGE}
Crea un cluster
Puoi pubblicare un LLM su TPU con Ray in un cluster GKE Autopilot o Standard utilizzando il componente aggiuntivo Operatore Ray.
Utilizza un cluster Autopilot per un'esperienza Kubernetes completamente gestita. Per scegliere la modalità operativa GKE più adatta ai tuoi carichi di lavoro, consulta Scegliere una modalità operativa GKE.
Utilizza Cloud Shell per creare un cluster Autopilot o Standard:
Autopilot
Crea un cluster GKE Autopilot con il componente aggiuntivo Ray Operator abilitato:
gcloud container clusters create-auto ${CLUSTER_NAME} \ --enable-ray-operator \ --release-channel=rapid \ --location=${COMPUTE_REGION}
Standard
Crea un cluster standard con il componente aggiuntivo Ray Operator abilitato:
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,GcsFuseCsiDriver
Crea un pool di nodi TPU slice single-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=1
GKE crea un pool di nodi TPU v5e con un tipo di macchina
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=1
GKE crea un pool di nodi TPU v5e con un tipo di macchina
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=1
GKE crea un pool di nodi TPU v6e con un tipo di macchina
ct6e-standard-8t
.
Configura kubectl per comunicare con il cluster
Per configurare kubectl in modo che comunichi con il tuo cluster, esegui questo comando:
Autopilot
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_REGION}
Standard
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_ZONE}
Crea un secret di Kubernetes per le credenziali di Hugging Face
Per creare un secret Kubernetes che contenga il token Hugging Face, esegui il comando seguente:
kubectl create secret generic hf-secret \
--from-literal=hf_api_token=${HF_TOKEN} \
--dry-run=client -o yaml | kubectl --namespace ${NAMESPACE} apply -f -
Crea un bucket Cloud Storage
Per accelerare il tempo di avvio del deployment di vLLM e ridurre al minimo lo spazio su disco richiesto per nodo, utilizza il driver CSI di Cloud Storage FUSE per montare il modello scaricato e la cache di compilazione sui nodi Ray.
In Cloud Shell, esegui questo comando:
gcloud storage buckets create gs://${GSBUCKET} \
--uniform-bucket-level-access
Questo comando crea un bucket Cloud Storage per archiviare i file del modello che scarichi da Hugging Face.
Configura un service account Kubernetes per accedere al bucket
Crea il ServiceAccount Kubernetes:
kubectl create serviceaccount ${KSA_NAME} \ --namespace ${NAMESPACE}
Concedi all'account di servizio Kubernetes l'accesso in lettura/scrittura al bucket Cloud Storage:
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 crea le seguenti risorse per l'LLM:
- Un bucket Cloud Storage per archiviare il modello scaricato e la cache di compilazione. Un driver CSI di Cloud Storage FUSE legge il contenuto del bucket.
- Volumi con la memorizzazione nella cache dei file abilitata e la funzionalità di download parallelo di Cloud Storage FUSE.
Best practice: Utilizza una cache di file supportata da
tmpfs
oHyperdisk / Persistent Disk
a seconda delle dimensioni previste dei contenuti del modello, ad esempio i file di peso. In questo tutorial, utilizzi la cache dei file Cloud Storage FUSE supportata dalla RAM.
Esegui il deployment di una risorsa personalizzata RayCluster
Esegui il deployment di una risorsa personalizzata RayCluster, che in genere è costituita da un pod di sistema e più pod worker.
Llama-3-8B-Instruct
Crea la risorsa personalizzata RayCluster per eseguire il deployment del modello Llama 3 8B ottimizzato per le istruzioni completando i seguenti passaggi:
Controlla il manifest
ray-cluster.tpu-v5e-singlehost.yaml
:Applica il manifest:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Il comando
envsubst
sostituisce le variabili di ambiente nel manifest.
GKE crea una risorsa personalizzata RayCluster con un workergroup
che contiene un host singolo TPU
v5e in una topologia 2x4
.
Mistral-7B
Crea la risorsa personalizzata RayCluster per eseguire il deployment del modello Mistral-7B completando i seguenti passaggi:
Controlla il manifest
ray-cluster.tpu-v5e-singlehost.yaml
:Applica il manifest:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Il comando
envsubst
sostituisce le variabili di ambiente nel manifest.
GKE crea una risorsa personalizzata RayCluster con un workergroup
che contiene un host singolo TPU
v5e in una topologia 2x4
.
Llama 3.1 70B
Crea la risorsa personalizzata RayCluster per eseguire il deployment del modello Llama 3.1 70B completando i seguenti passaggi:
Controlla il manifest
ray-cluster.tpu-v6e-singlehost.yaml
:Applica il manifest:
envsubst < tpu/ray-cluster.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Il comando
envsubst
sostituisce le variabili di ambiente nel manifest.
GKE crea una risorsa personalizzata RayCluster con un workergroup
che contiene una TPU v6e a host singolo in una topologia 2x4
.
Connetti alla risorsa personalizzata RayCluster
Dopo aver creato la risorsa personalizzata RayCluster, puoi connetterti alla risorsa RayCluster e iniziare a pubblicare il modello.
Verifica che GKE abbia creato il servizio RayCluster:
kubectl --namespace ${NAMESPACE} get raycluster/vllm-tpu \ --output wide
L'output è simile al seguente:
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 ### ###.###.###.### ###.###.###.###
Attendi finché
STATUS
non èready
e le colonneHEAD POD IP
eHEAD SERVICE IP
non contengono un indirizzo IP.Stabilisci sessioni
port-forwarding
con la testa di Ray: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 &
Verifica che il client Ray possa connettersi alla risorsa personalizzata RayCluster remota:
docker run --net=host -it ${VLLM_IMAGE} \ ray list nodes --address http://localhost:8265
L'output è simile al seguente:
======== 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
Esegui il deployment del modello con vLLM
Esegui il deployment del modello con vLLM:
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"}}'
Visualizzare la dashboard Ray
Puoi visualizzare il deployment di Ray Serve e i log pertinenti dalla dashboard di Ray.
- Fai clic sul pulsante
Anteprima web, che si trova in alto a destra della barra delle app di Cloud Shell.
- Fai clic su Cambia porta e imposta il numero di porta su
8265
. - Fai clic su Cambia e visualizza anteprima.
- Nella dashboard di Ray, fai clic sulla scheda Pubblica.
Quando il deployment di Serve ha lo stato HEALTHY
, il modello è pronto per iniziare a elaborare gli input.
Pubblica il modello
Questa guida mette in evidenza i modelli che supportano la generazione di testo, una tecnica che consente la creazione di contenuti di testo da un prompt.
Llama-3-8B-Instruct
Configura il port forwarding al server:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Invia un prompt all'endpoint Serve:
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
Configura il port forwarding al server:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Invia un prompt all'endpoint Serve:
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
Configura il port forwarding al server:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Invia un prompt all'endpoint Serve:
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}'
Configurazione aggiuntiva
Facoltativamente, puoi configurare le seguenti risorse e tecniche di pubblicazione dei modelli supportate dal framework Ray Serve:
- Esegui il deployment di una risorsa personalizzata RayService. Nei passaggi precedenti di questo tutorial, utilizzi RayCluster anziché RayService. Consigliamo RayService per gli ambienti di produzione.
- Comporre più modelli con la composizione dei modelli. Configura il multiplexing e la composizione dei modelli supportati dal framework Ray Serve. La composizione dei modelli consente di concatenare input e output in più LLM e scalare i modelli come una singola applicazione.
- Crea ed esegui il deployment della tua immagine TPU. Consigliamo questa opzione se hai bisogno di un controllo più granulare sui contenuti dell'immagine Docker.
Esegui il deployment di un RayService
Puoi eseguire il deployment degli stessi modelli di questo tutorial utilizzando una risorsa personalizzata RayService.
Elimina la risorsa personalizzata RayCluster che hai creato in questo tutorial:
kubectl --namespace ${NAMESPACE} delete raycluster/vllm-tpu
Crea la risorsa personalizzata RayService per eseguire il deployment di un modello:
Llama-3-8B-Instruct
Controlla il manifest
ray-service.tpu-v5e-singlehost.yaml
:Applica il manifest:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Il comando
envsubst
sostituisce le variabili di ambiente nel manifest.GKE crea un RayService con un
workergroup
che contiene un host singolo TPU v5e in una topologia2x4
.
Mistral-7B
Controlla il manifest
ray-service.tpu-v5e-singlehost.yaml
:Applica il manifest:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Il comando
envsubst
sostituisce le variabili di ambiente nel manifest.GKE crea un RayService con un
workergroup
contenente una TPU v5e a host singolo in una topologia2x4
.
Llama 3.1 70B
Controlla il manifest
ray-service.tpu-v6e-singlehost.yaml
:Applica il manifest:
envsubst < tpu/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Il comando
envsubst
sostituisce le variabili di ambiente nel manifest.
GKE crea una risorsa personalizzata RayCluster in cui viene eseguito il deployment dell'applicazione Ray Serve e viene creata la successiva risorsa personalizzata RayService.
Verifica lo stato della risorsa RayService:
kubectl --namespace ${NAMESPACE} get rayservices/vllm-tpu
Attendi che lo stato del servizio cambi in
Running
:NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 1
Recupera il nome del servizio head di RayCluster:
SERVICE_NAME=$(kubectl --namespace=${NAMESPACE} get rayservices/vllm-tpu \ --template={{.status.activeServiceStatus.rayClusterStatus.head.serviceName}})
Stabilisci
port-forwarding
sessioni con la testa di Ray per visualizzare la dashboard Ray:pkill -f "kubectl .* port-forward .* 8265:8265" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null &
Esegui la pulizia della risorsa RayService:
kubectl --namespace ${NAMESPACE} delete rayservice/vllm-tpu
Comporre più modelli con la composizione dei modelli
La composizione del modello è una tecnica per combinare più modelli in un'unica applicazione.
In questa sezione, utilizzi un cluster GKE per comporre due modelli, Llama 3 8B IT e Gemma 7B IT, in un'unica applicazione:
- Il primo modello è il modello di assistente che risponde alle domande poste nel prompt.
- Il secondo modello è il modello di riepilogo. L'output del modello di assistente viene concatenato all'input del modello di riepilogo. Il risultato finale è la versione riassunta della risposta del modello di assistente.
Per accedere al modello Gemma, completa i seguenti passaggi:
- Accedi alla piattaforma Kaggle, firma il contratto di consenso alla licenza e ottieni un token API Kaggle. In questo tutorial utilizzi un secret Kubernetes per le credenziali Kaggle.
- Accedi alla pagina del consenso del modello su Kaggle.com.
- Accedi a Kaggle, se non l'hai ancora fatto.
- Fai clic su Richiedi l'accesso.
- Nella sezione Scegli l'account per il consenso, seleziona Verifica tramite l'account Kaggle per utilizzare il tuo account Kaggle per concedere il consenso.
- Accetta i Termini e condizioni del modello.
Configura l'ambiente:
export ASSIST_MODEL_ID=meta-llama/Meta-Llama-3-8B-Instruct export SUMMARIZER_MODEL_ID=google/gemma-7b-it
Per i cluster Standard, crea un pool di nodi di sezioni TPU single-host aggiuntivo:
gcloud container node-pools create tpu-2 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=MACHINE_TYPE \ --num-nodes=1
Sostituisci
MACHINE_TYPE
con uno dei seguenti tipi di macchina:ct5lp-hightpu-8t
per eseguire il provisioning di TPU v5e.ct6e-standard-8t
per eseguire il provisioning di TPU v6e.
I cluster Autopilot eseguono automaticamente il provisioning dei nodi richiesti.
Esegui il deployment della risorsa RayService in base alla versione della TPU che vuoi utilizzare:
TPU v5e
Controlla il manifest
ray-service.tpu-v5e-singlehost.yaml
:Applica il manifest:
envsubst < model-composition/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
TPU v6e
Controlla il manifest
ray-service.tpu-v6e-singlehost.yaml
:Applica il manifest:
envsubst < model-composition/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Attendi che lo stato della risorsa RayService cambi in
Running
:kubectl --namespace ${NAMESPACE} get rayservice/vllm-tpu
L'output è simile al seguente:
NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 2
In questo output, lo stato
RUNNING
indica che la risorsa RayService è pronta.Verifica che GKE abbia creato il servizio per l'applicazione Ray Serve:
kubectl --namespace ${NAMESPACE} get service/vllm-tpu-serve-svc
L'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vllm-tpu-serve-svc ClusterIP ###.###.###.### <none> 8000/TCP ###
Stabilisci sessioni
port-forwarding
con la testa di Ray: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 &
Invia una richiesta al modello:
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}'
L'output è simile al seguente:
{"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."]}
Crea e implementa l'immagine TPU
Questo tutorial utilizza immagini TPU ospitate da
vLLM. vLLM fornisce un'immagine
Dockerfile.tpu
che crea vLLM sopra l'immagine PyTorch XLA richiesta
che include le dipendenze TPU. Tuttavia, puoi anche creare ed eseguire il deployment della tua
immagine TPU per un controllo più granulare sui contenuti dell'immagine Docker.
Crea un repository Docker per archiviare le immagini container per questa guida:
gcloud artifacts repositories create vllm-tpu --repository-format=docker --location=${COMPUTE_REGION} && \ gcloud auth configure-docker ${COMPUTE_REGION}-docker.pkg.dev
Clona il repository vLLM:
git clone https://github.com/vllm-project/vllm.git cd vllm
Crea l'immagine:
docker build -f ./docker/Dockerfile.tpu . -t vllm-tpu
Tagga l'immagine TPU con il nome di Artifact Registry:
export VLLM_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/vllm-tpu/vllm-tpu:TAG docker tag vllm-tpu ${VLLM_IMAGE}
Sostituisci
TAG
con il nome del tag che vuoi definire. Se non specifichi un tag, Docker applica il tag predefinito latest.Esegui il push dell'immagine in Artifact Registry:
docker push ${VLLM_IMAGE}
Elimina le singole risorse
Se hai utilizzato un progetto esistente e non vuoi eliminarlo, puoi eliminare le singole risorse.
Elimina la risorsa personalizzata RayCluster:
kubectl --namespace ${NAMESPACE} delete rayclusters vllm-tpu
Elimina il bucket Cloud Storage:
gcloud storage rm -r gs://${GSBUCKET}
Elimina il repository Artifact Registry:
gcloud artifacts repositories delete vllm-tpu \ --location=${COMPUTE_REGION}
Elimina il cluster:
gcloud container clusters delete ${CLUSTER_NAME} \ --location=LOCATION
Sostituisci
LOCATION
con una delle seguenti variabili di ambiente:- Per i cluster Autopilot, utilizza
COMPUTE_REGION
. - Per i cluster Standard, utilizza
COMPUTE_ZONE
.
- Per i cluster Autopilot, utilizza
Elimina il progetto
Se hai eseguito il deployment del tutorial in un nuovo progetto Google Cloud e non ne hai più bisogno, eliminalo completando i seguenti passaggi:
- 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.
Passaggi successivi
- Scopri come eseguire carichi di lavoro di AI/ML ottimizzati con le funzionalità di orchestrazione della piattaforma GKE.
- Scopri come utilizzare Ray Serve su GKE visualizzando il codice di esempio su GitHub.
- Scopri come raccogliere e visualizzare le metriche per i cluster Ray in esecuzione su GKE completando i passaggi descritti in Raccogliere e visualizzare log e metriche per i cluster Ray su GKE.