Questo tutorial mostra come eseguire il deployment e il servizio di un modello linguistico di grandi dimensioni (LLM) utilizzando un pool di nodi di slice TPU multi-host su Google Kubernetes Engine (GKE) con Saxml per un'architettura scalabile ed efficiente.
Sfondo
Saxml è un sistema sperimentale che serve i framework Paxml, JAX e PyTorch. Puoi utilizzare le TPU per
accelerare l'elaborazione dei dati con questi framework. Per dimostrare il deployment delle TPU
in GKE, questo tutorial serve il modello di test 175B
LmCloudSpmd175B32Test. GKE esegue il deployment di questo modello di test su due pool di nodi della sezione TPU v5e con topologia 4x8
rispettivamente.
Per eseguire correttamente il deployment del modello di test, la topologia TPU è stata definita in base alle dimensioni del modello. Dato che il modello di N miliardi di bit richiede circa il doppio (2xN) di GB di memoria, il modello 175B LmCloudSpmd175B32Test richiede circa 350 GB di memoria. Il singolo chip TPU v5e ha 16 GB. Per supportare 350 GB, GKE ha bisogno di 21 chip TPU v5e (350/16= 21). In base alla mappatura della configurazione TPU, la configurazione TPU corretta per questo tutorial è:
- Tipo di macchina:
ct5lp-hightpu-4t
- Topologia:
4x8
(numero di chip TPU 32)
La selezione della topologia TPU corretta per l'erogazione di un modello è importante quando si eseguono il deployment delle TPU in GKE. Per scoprire di più, consulta Pianificare la configurazione della TPU.
Obiettivi
Questo tutorial è rivolto a DevOps o MLOps engineer o amministratori della piattaforma che vogliono utilizzare le funzionalità di orchestrazione di GKE per pubblicare modelli di dati.
Questo tutorial illustra i seguenti passaggi:
- Prepara l'ambiente con un cluster GKE Standard. Il
cluster ha due node pool di sezioni TPU v5e con topologia
4x8
. - Esegui il deployment di Saxml. Saxml ha bisogno di un server di amministrazione, un gruppo di pod che fungono da server di modelli, un server HTTP precompilato e un bilanciatore del carico.
- Utilizza Saxml per pubblicare l'LLM.
Il seguente diagramma mostra l'architettura implementata nel tutorial che segue:
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required API.
-
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Vai a IAM - Seleziona il progetto.
- Fai clic su Concedi accesso.
-
Nel campo Nuove entità, inserisci il tuo identificatore utente. In genere si tratta dell'indirizzo email di un Account Google.
- Nell'elenco Seleziona un ruolo, seleziona un ruolo.
- Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni ruolo aggiuntivo.
- Fai clic su Salva.
-
- Assicurati che il tuo progetto disponga di una quota sufficiente per Cloud TPU in GKE.
Prepara l'ambiente
Nella console Google Cloud, avvia un'istanza Cloud Shell:
Apri Cloud ShellImposta le variabili di ambiente predefinite:
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export REGION=COMPUTE_REGION export ZONE=COMPUTE_ZONE export GSBUCKET=PROJECT_ID-gke-bucket
Sostituisci i seguenti valori:
- PROJECT_ID: il tuo ID progetto Google Cloud.
- COMPUTE_REGION: la regione Compute Engine.
- COMPUTE_ZONE: la zona in cui è disponibile
ct5lp-hightpu-4t
.
Crea un cluster GKE Standard
Utilizza Cloud Shell per:
Crea un cluster standard che utilizza Workload Identity Federation for GKE:
gcloud container clusters create saxml \ --zone=${ZONE} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --cluster-version=VERSION \ --num-nodes=4
Sostituisci
VERSION
con il numero della versione GKE. GKE supporta TPU v5e nella versione 1.27.2-gke.2100 e successive. Per ulteriori informazioni, consulta la sezione Disponibilità di TPU in GKE.La creazione del cluster potrebbe richiedere diversi minuti.
Crea il primo pool di nodi denominato
tpu1
:gcloud container node-pools create tpu1 \ --zone=${ZONE} \ --num-nodes=8 \ --machine-type=ct5lp-hightpu-4t \ --tpu-topology=4x8 \ --cluster=saxml
Crea il secondo pool di nodi denominato
tpu2
:gcloud container node-pools create tpu2 \ --zone=${ZONE} \ --num-nodes=8 \ --machine-type=ct5lp-hightpu-4t \ --tpu-topology=4x8 \ --cluster=saxml
Hai creato le seguenti risorse:
- Un cluster standard con quattro nodi CPU.
- Due pool di nodi di sezioni TPU v5e con topologia
4x8
. Ogni pool di nodi rappresenta otto nodi di sezioni TPU con 4 chip TPU ciascuno.
Il modello da 175 miliardi deve essere pubblicato su uno slice TPU v5e multi-host con almeno uno slice di topologia 4x8
(32 chip TPU v5e).
Crea un bucket Cloud Storage
Crea un bucket Cloud Storage per archiviare le configurazioni del server di amministrazione Saxml. Un server di amministrazione in esecuzione salva periodicamente il proprio stato e i dettagli dei modelli pubblicati.
In Cloud Shell, esegui quanto segue:
gcloud storage buckets create gs://${GSBUCKET}
Configurare l'accesso ai carichi di lavoro utilizzando la federazione delle identità per i carichi di lavoro per GKE
Assegna un account di servizio Kubernetes all'applicazione e configuralo in modo che agisca come account di servizio IAM.
Configura
kubectl
per comunicare con il cluster:gcloud container clusters get-credentials saxml --zone=${ZONE}
Crea un account di servizio Kubernetes da utilizzare per la tua applicazione:
kubectl create serviceaccount sax-sa --namespace default
Crea un account di servizio IAM per la tua applicazione:
gcloud iam service-accounts create sax-iam-sa
Aggiungi un'associazione di criteri IAM per consentire all'account di servizio IAM di leggere e scrivere in Cloud Storage:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member "serviceAccount:sax-iam-sa@${PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/storage.admin
Consenti all'account di servizio Kubernetes di simulare l'account di servizio IAM aggiungendo un'associazione dei criteri IAM tra i due account di servizio. Questa associazione consente all'account di servizio Kubernetes di agire come account di servizio IAM, in modo che possa leggere e scrivere in Cloud Storage.
gcloud iam service-accounts add-iam-policy-binding sax-iam-sa@${PROJECT_ID}.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:${PROJECT_ID}.svc.id.goog[default/sax-sa]"
Annota l'account di servizio Kubernetes con l'indirizzo email dell'account di servizio IAM. In questo modo, l'app di esempio saprà quale account di servizio utilizzare per accedere ai servizi Google Cloud. Pertanto, quando l'app utilizza qualsiasi libreria client API di Google standard per accedere ai servizi Google Cloud, utilizza questo account di servizio IAM.
kubectl annotate serviceaccount sax-sa \ iam.gke.io/gcp-service-account=sax-iam-sa@${PROJECT_ID}.iam.gserviceaccount.com
Esegui il deployment di Saxml
In questa sezione esegui il deployment del server di amministrazione Saxml e del server di modelli Saxml.
Esegui il deployment del server di amministrazione Saxml
Crea il seguente manifest
sax-admin-server.yaml
:Sostituisci
BUCKET_NAME
con il nome del bucket Cloud Storage.Applica il manifest:
kubectl apply -f sax-admin-server.yaml
Verifica che il pod del server di amministrazione sia attivo e in esecuzione:
kubectl get deployment
L'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE sax-admin-server 1/1 1 1 52s
Esegui il deployment del server del modello Saxml
I carichi di lavoro in esecuzione in slice TPU multi-host richiedono un identificatore di rete stabile per ogni pod per rilevare i peer nello stesso slice TPU. Per definire questi identificativi, utilizza IndexedJob, StatefulSet con un servizio headless o JobSet che crea automaticamente un servizio headless per tutti i job che appartengono al JobSet. La sezione seguente mostra come gestire più gruppi di pod del server di modelli con JobSet.
Installa JobSet v0.2.3 o versioni successive.
kubectl apply --server-side -f https://github.com/kubernetes-sigs/jobset/releases/download/JOBSET_VERSION/manifests.yaml
Sostituisci
JOBSET_VERSION
con la versione del set di job. Ad esempio,v0.2.3
.Verifica che il controller JobSet sia in esecuzione nello spazio dei nomi
jobset-system
:kubectl get pod -n jobset-system
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE jobset-controller-manager-69449d86bc-hp5r6 2/2 Running 0 2m15s
Esegui il deployment di due server di modelli in due node pool di sezioni TPU. Salva il seguente manifest
sax-model-server-set
:Sostituisci
BUCKET_NAME
con il nome del bucket Cloud Storage.In questo manifest:
replicas: 2
è il numero di repliche del job. Ogni job rappresenta un server di modelli. Di conseguenza, un gruppo di 8 pod.parallelism: 8
ecompletions: 8
sono uguali al numero di nodi in ogni pool di nodi.backoffLimit: 0
deve essere pari a zero per contrassegnare il job come non riuscito se si verifica un errore in un pod.ports.containerPort: 8471
è la porta predefinita per la comunicazione delle VMname: MEGASCALE_NUM_SLICES
azzera la variabile di ambiente perché GKE non esegue l'addestramento multislice.
Applica il manifest:
kubectl apply -f sax-model-server-set.yaml
Verifica lo stato dei pod del server di amministrazione Saxml e del server di modelli:
kubectl get pods
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE sax-admin-server-557c85f488-lnd5d 1/1 Running 0 35h sax-model-server-set-sax-model-server-0-0-nj4sm 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-1-sl8w4 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-2-hb4rk 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-3-qv67g 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-4-pzqz6 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-5-nm7mz 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-6-7br2x 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-7-4pw6z 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-0-8mlf5 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-1-h6z6w 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-2-jggtv 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-3-9v8kj 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-4-6vlb2 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-5-h689p 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-6-bgv5k 1/1 Running 0 24m sax-model-server-set-sax-model-server-1-7-cd6gv 1/1 Running 0 24m
In questo esempio sono presenti 16 contenitori di server di modelli:sax-model-server-set-sax-model-server-0-0-nj4sm
esax-model-server-set-sax-model-server-1-0-8mlf5
sono i due server di modelli principali in ogni gruppo.
Il cluster Saxml ha due server di modelli di cui è stato eseguito il deployment su due node pool di sezioni TPU v5e con rispettivamente la topologia 4x8
.
Esegui il deployment del server HTTP Saxml e del bilanciatore del carico
Utilizza l'immagine del server HTTP predefinita riportata di seguito. Salva il seguente manifest
sax-http.yaml
:Sostituisci
BUCKET_NAME
con il nome del tuo nome del bucket Cloud Storage.Applica il manifest
sax-http.yaml
:kubectl apply -f sax-http.yaml
Attendi il completamento della creazione del contenitore del server HTTP:
kubectl get pods
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE sax-admin-server-557c85f488-lnd5d 1/1 Running 0 35h sax-http-65d478d987-6q7zd 1/1 Running 0 24m sax-model-server-set-sax-model-server-0-0-nj4sm 1/1 Running 0 24m ...
Attendi che al servizio venga assegnato un indirizzo IP esterno:
kubectl get svc
L'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sax-http-lb LoadBalancer 10.48.11.80 10.182.0.87 8888:32674/TCP 7m36s
Utilizzare Saxml
Carica, esegui il deployment e pubblica il modello su Saxml nel slice multihost TPU v5e:
Carica il modello
Recupera l'indirizzo IP del bilanciatore del carico per Saxml.
LB_IP=$(kubectl get svc sax-http-lb -o jsonpath='{.status.loadBalancer.ingress[*].ip}') PORT="8888"
Carica il modello di test
LmCloudSpmd175B
in due node pool di slice TPU v5e:curl --request POST \ --header "Content-type: application/json" \ -s ${LB_IP}:${PORT}/publish --data \ '{ "model": "/sax/test/spmd", "model_path": "saxml.server.pax.lm.params.lm_cloud.LmCloudSpmd175B32Test", "checkpoint": "None", "replicas": 2 }'
Il modello di test non ha un checkpoint ottimizzato, i pesi vengono generati in modo randomico. Il caricamento del modello potrebbe richiedere fino a 10 minuti.
L'output è simile al seguente:
{ "model": "/sax/test/spmd", "path": "saxml.server.pax.lm.params.lm_cloud.LmCloudSpmd175B32Test", "checkpoint": "None", "replicas": 2 }
Controlla l'idoneità del modello:
kubectl logs sax-model-server-set-sax-model-server-0-0-nj4sm
L'output è simile al seguente:
... loading completed. Successfully loaded model for key: /sax/test/spmd
Il modello è completamente caricato.
Visualizza le informazioni sul modello:
curl --request GET \ --header "Content-type: application/json" \ -s ${LB_IP}:${PORT}/listcell --data \ '{ "model": "/sax/test/spmd" }'
L'output è simile al seguente:
{ "model": "/sax/test/spmd", "model_path": "saxml.server.pax.lm.params.lm_cloud.LmCloudSpmd175B32Test", "checkpoint": "None", "max_replicas": 2, "active_replicas": 2 }
Pubblica il modello
Presenta una richiesta di prompt:
curl --request POST \
--header "Content-type: application/json" \
-s ${LB_IP}:${PORT}/generate --data \
'{
"model": "/sax/test/spmd",
"query": "How many days are in a week?"
}'
L'output mostra un esempio della risposta del modello. Questa risposta potrebbe non essere significativa perché il modello di test ha pesi casuali.
Annullare la pubblicazione del modello
Esegui il seguente comando per annullare la pubblicazione del modello:
curl --request POST \
--header "Content-type: application/json" \
-s ${LB_IP}:${PORT}/unpublish --data \
'{
"model": "/sax/test/spmd"
}'
L'output è simile al seguente:
{
"model": "/sax/test/spmd"
}
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina le risorse di cui è stato eseguito il deployment
Elimina il cluster che hai creato per questo tutorial:
gcloud container clusters delete saxml --zone ${ZONE}
Elimina l'account di servizio:
gcloud iam service-accounts delete sax-iam-sa@${PROJECT_ID}.iam.gserviceaccount.com
Elimina il bucket Cloud Storage:
gcloud storage rm -r gs://${GSBUCKET}
Passaggi successivi
- Scopri le versioni TPU attuali con l'architettura di sistema Cloud TPU.
- Scopri di più sulle TPU in GKE.