Questa guida mostra come gestire un modello linguistico di grandi dimensioni (LLM) utilizzando le Tensor Processing Unit (TPU) su Google Kubernetes Engine (GKE) con JetStream tramite PyTorch. In questa guida, scaricherai i pesi del modello in Cloud Storage ed eseguirai il deployment su un cluster GKE Autopilot o Standard utilizzando un container che esegue JetStream.
Se hai bisogno della scalabilità, della resilienza e dell'efficacia in termini di costi offerti dalle funzionalità di Kubernetes durante il deployment del modello su JetStream, questa guida è un buon punto di partenza.
Questa guida è destinata ai clienti dell'AI generativa che utilizzano PyTorch, agli utenti nuovi o 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 la gestione degli LLM.
Sfondo
Se gestisci un LLM utilizzando le TPU su GKE con JetStream, puoi creare una soluzione di gestione solida e pronta per la produzione con tutti i vantaggi di Kubernetes gestito, tra cui efficienza dei costi, scalabilità e maggiore disponibilità. Questa sezione descrive le tecnologie chiave utilizzate in questo tutorial.
Informazioni sulle 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.
Prima di utilizzare le TPU in GKE, ti consigliamo di completare il seguente percorso di apprendimento:
- Scopri di più sulla disponibilità della versione attuale della TPU con l'architettura di sistema di Cloud TPU.
- Scopri di più sulle TPU in GKE.
Questo tutorial illustra l'erogazione di vari modelli LLM. GKE esegue il deployment del modello su nodi TPUv5e a singolo host con topologie TPU configurate in base ai requisiti del modello per la gestione dei prompt con bassa latenza.
Informazioni su JetStream
JetStream è un framework open source per la pubblicazione di inferenze sviluppato da Google. JetStream consente un'inferenza ad alte prestazioni, ad alta velocità effettiva e ottimizzato per la memoria su TPU e GPU. JetStream offre ottimizzazioni avanzate delle prestazioni, tra cui il batching continuo, l'ottimizzazione della cache KV e tecniche di quantizzazione, per facilitare l'implementazione degli LLM. JetStream consente l'erogazione di PyTorch/XLA e JAX TPU per ottenere prestazioni ottimali.
Raggruppamento continuo
Il batch continuo è una tecnica che raggruppa dinamicamente le richieste di inferenza in entrata in batch, riducendo la latenza e aumentando la velocità effettiva.
Quantizzazione della cache KV
La quantizzazione della cache KV prevede la compressione della cache chiave-valore utilizzata nei meccanismi di attenzione, riducendo i requisiti di memoria.
Quantizzazione dei pesi Int8
La quantizzazione dei pesi Int8 riduce la precisione dei pesi del modello da virgola mobile a 32 bit a numeri interi a 8 bit, il che comporta un calcolo più rapido e un utilizzo della memoria ridotto.
Per scoprire di più su queste ottimizzazioni, consulta i repository dei progetti JetStream PyTorch e JetStream MaxText.
Informazioni su PyTorch
PyTorch è un framework di machine learning open source sviluppato da Meta e ora parte della Linux Foundation. PyTorch fornisce funzionalità di alto livello come il calcolo dei tensori e le reti neurali profonde.
Obiettivi
- Prepara un cluster GKE Autopilot o Standard con la topologia TPU consigliata in base alle caratteristiche del modello.
- Esegui il deployment dei componenti JetStream su GKE.
- Recupera e pubblica il modello.
- Pubblica e interagisci con il modello pubblicato.
Architettura
Questa sezione descrive l'architettura GKE utilizzata in questo tutorial. L'architettura include un cluster GKE Autopilot o Standard che esegue il provisioning delle TPU e ospita i componenti JetStream per eseguire il deployment e pubblicare i modelli.
Il seguente diagramma mostra i componenti di questa architettura:
Questa architettura include i seguenti componenti:
- Un cluster regionale GKE Autopilot o Standard.
- Due node pool di sezioni TPU a host singolo che ospitano il deployment di JetStream.
- Il componente Service distribuisce il traffico in entrata a tutte le repliche
JetStream HTTP
. JetStream HTTP
è un server HTTP che accetta le richieste come wrapper per il formato richiesto di JetStream e le invia al client GRPC di JetStream.JetStream-PyTorch
è un server JetStream che esegue l'inferenza con il batch continuo.
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, roles/resourcemanager.projectIamAdmin
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 column 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 l'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.
-
- Verifica di disporre di una quota sufficiente per otto chip TPU v5e PodSlice Lite. In questo tutorial utilizzi le istanze on demand.
- Crea un token Hugging Face se non ne hai già uno.
Ottenere l'accesso al modello
Accedere a vari modelli su Hugging Face per il deployment su GKE
Gemma 7B-it
Per accedere al modello Gemma per il deployment su GKE, devi prima firmare il contratto di consenso alla licenza.
- Accedere alla pagina del consenso del modello Gemma su Hugging Face
- Accedi a Hugging Face, se non l'hai ancora fatto.
- Leggi e accetta i Termini e condizioni modello.
Llama 3 8B
Per accedere al modello Llama 3 per il deployment su GKE, devi prima firmare il contratto di consenso alla licenza.
- Accedere alla pagina di consenso del modello Llama 3 su Hugging Face
- Accedi a Hugging Face, se non l'hai ancora fatto.
- Leggi e accetta i Termini e condizioni modello.
Prepara l'ambiente
In questo tutorial utilizzerai Cloud Shell per gestire le risorse ospitate su
Google Cloud. Cloud Shell include il software preinstallato necessario
per questo tutorial, tra cui
kubectl
e
gcloud CLI.
Per configurare l'ambiente con Cloud Shell:
Nella console Google Cloud , avvia una sessione di Cloud Shell facendo clic su
Attiva Cloud Shell nella consoleGoogle Cloud . Viene avviata una sessione nel riquadro inferiore della console Google Cloud .
Imposta le variabili di ambiente predefinite:
gcloud config set project PROJECT_ID gcloud config set billing/quota_project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CLUSTER_NAME=CLUSTER_NAME export REGION=REGION export LOCATION=LOCATION export CLUSTER_VERSION=CLUSTER_VERSION export BUCKET_NAME=BUCKET_NAME
Sostituisci i seguenti valori:
PROJECT_ID
: il tuo Google Cloud ID progetto.CLUSTER_NAME
: il nome del tuo cluster GKE. Non è necessario specificare il prefissogs://
.REGION
: la regione in cui si trovano il cluster GKE e i nodi TPU. La regione contiene zone in cui sono disponibili i tipi di macchine TPU v5e (ad esempious-west1
,us-west4
,us-central1
,us-east1
,us-east5
oeurope-west4
). Per i cluster Autopilot, assicurati di disporre di risorse di zona TPU v5e sufficienti per la regione che preferisci.- (Solo cluster Standard)
LOCATION
: la zona in cui sono disponibili le risorse TPU (ad esempio,us-west4-a
). Per i cluster Autopilot, non è necessario specificare la zona, ma solo la regione. CLUSTER_VERSION
: la versione di GKE, che deve supportare il tipo di macchina che vuoi utilizzare. Tieni presente che la versione GKE predefinita potrebbe non essere disponibile per la TPU di destinazione. Per un elenco delle versioni GKE minime disponibili per tipo di macchina TPU, consulta Disponibilità delle TPU in GKE.BUCKET_NAME
: il nome del bucket Cloud Storage utilizzato per archiviare la cache di compilazione JAX.
Creare e configurare risorse Google Cloud
Segui queste istruzioni per creare le risorse richieste.
Crea un cluster GKE
Puoi pubblicare Gemma su TPU in un cluster GKE Autopilot o Standard. Ti consigliamo di utilizzare 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.
Autopilot
Crea un cluster GKE Autopilot:
gcloud container clusters create-auto CLUSTER_NAME \
--project=PROJECT_ID \
--region=REGION \
--cluster-version=CLUSTER_VERSION
Sostituisci CLUSTER_VERSION
con la versione del cluster appropriata. Per un cluster GKE Autopilot, utilizza una versione del canale di rilascio regolare.
Standard
Crea un cluster GKE Standard regionale che utilizza Workload Identity Federation for GKE:
gcloud container clusters create CLUSTER_NAME \ --enable-ip-alias \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --cluster-version=CLUSTER_VERSION \ --workload-pool=PROJECT_ID.svc.id.goog \ --location=REGION
La creazione del cluster potrebbe richiedere diversi minuti.
Sostituisci
CLUSTER_VERSION
con la versione del cluster appropriata.Crea un node pool TPU v5e con una topologia
2x4
e due nodi:gcloud container node-pools create tpu-nodepool \ --cluster=CLUSTER_NAME \ --machine-type=ct5lp-hightpu-8t \ --project=PROJECT_ID \ --num-nodes=2 \ --region=REGION \ --node-locations=LOCATION
Genera il token della CLI di Hugging Face in Cloud Shell
Genera un nuovo token Hugging Face se non ne hai già uno:
- Fai clic su Il tuo profilo > Impostazioni > Token di accesso.
- Fai clic su Nuovo token.
- Specifica un nome a tua scelta e un ruolo di almeno
Read
. - Fai clic su Generate a token (Genera un token).
- Modifica le autorizzazioni del token di accesso per avere l'accesso in lettura al repository Hugging Face del modello.
- Copia il token generato negli appunti.
Crea un secret di Kubernetes per le credenziali di Hugging Face
In Cloud Shell:
Configura
kubectl
per comunicare con il cluster:gcloud container clusters get-credentials CLUSTER_NAME --location=REGION
Crea un secret per archiviare le credenziali di Hugging Face:
kubectl create secret generic huggingface-secret \ --from-literal=HUGGINGFACE_TOKEN=HUGGINGFACE_TOKEN
Sostituisci
HUGGINGFACE_TOKEN
con il tuo token Hugging Face.
Configura l'accesso ai tuoi workload utilizzando Workload Identity Federation for GKE
Assegna un ServiceAccount Kubernetes all'applicazione e configura questo service account Kubernetes in modo che funga da account di servizio IAM.
Crea un account di servizio IAM per la tua applicazione:
gcloud iam service-accounts create wi-jetstream
Aggiungi un'associazione di policy IAM per il tuo account di servizio IAM per gestire Cloud Storage:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:wi-jetstream@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/storage.objectUser gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:wi-jetstream@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/storage.insightsCollectorService
Consenti al service account Kubernetes di rappresentare l'account di servizio IAM aggiungendo un'associazione dei criteri IAM tra i due service account. Questa associazione consente al service account Kubernetes di agire come account di servizio IAM:
gcloud iam service-accounts add-iam-policy-binding wi-jetstream@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
Annota il account di servizio Kubernetes con l'indirizzo email del account di servizio IAM:
kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=wi-jetstream@PROJECT_ID.iam.gserviceaccount.com
Esegui il deployment di JetStream
Esegui il deployment del container JetStream per pubblicare il modello. Questo tutorial utilizza i manifest di deployment di Kubernetes. Un deployment è un oggetto API Kubernetes che consente di eseguire più repliche di pod distribuite tra i nodi di un cluster.
Salva il seguente manifest come jetstream-pytorch-deployment.yaml
:
Gemma 7B-it
Llama 3 8B
Il manifest imposta le seguenti proprietà chiave:
model_id
: il nome del modello di Hugging Face (google/gemma-7b-it
,meta-llama/Meta-Llama-3-8B
) (vedi i modelli supportati).override_batch_size
: la dimensione del batch di decodifica per dispositivo, dove un chip TPU equivale a un dispositivo. Per impostazione predefinita, questo valore è30
.enable_model_warmup
: questa impostazione attiva il preriscaldamento del modello dopo l'avvio del server del modello. Per impostazione predefinita, questo valore èFalse
.
Facoltativamente, puoi impostare queste proprietà:
max_input_length
: la lunghezza massima della sequenza di input. Per impostazione predefinita, questo valore è1024
.max_output_length
: la lunghezza massima di decodifica dell'output. Il valore predefinito è1024
.quantize_weights
: indica se il checkpoint è quantizzato. Il valore predefinito è0
; impostalo su 1 per attivare la quantizzazioneint8
.internal_jax_compilation_cache
: la directory per la cache di compilazione JAX. Il valore predefinito è~/jax_cache
; impostalo sugs://BUCKET_NAME/jax_cache
per la memorizzazione nella cache remota.
Nel manifest, un probe di avvio
è configurato per garantire che il server del modello sia etichettato Ready
dopo che il
modello è stato caricato e il warmup è stato completato. I probe di attività e idoneità sono configurati per garantire l'integrità del server del modello.
Applica il manifest:
kubectl apply -f jetstream-pytorch-deployment.yaml
Verifica il deployment:
kubectl get deployment
L'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE jetstream-pytorch-server 0/2 2 0 ##s
Per i cluster Autopilot, il provisioning delle risorse TPU richieste potrebbe richiedere alcuni minuti.
Visualizza i log del server JetStream-PyTorch per verificare che i pesi del modello siano stati caricati e che il warmup del modello sia stato completato. Il completamento di questa operazione potrebbe richiedere alcuni minuti.
kubectl logs deploy/jetstream-pytorch-server -f -c jetstream-pytorch-server
L'output è simile al seguente:
Started jetstream_server.... 2024-04-12 04:33:37,128 - root - INFO - ---------Generate params 0 loaded.---------
Verifica che il deployment sia pronto:
kubectl get deployment
L'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE jetstream-pytorch-server 2/2 2 2 ##s
La registrazione dell'endpoint
healthcheck
potrebbe richiedere alcuni minuti.
Pubblica il modello
In questa sezione, interagisci con il modello.
Configurare il port forwarding
Puoi accedere al deployment di JetStream tramite il servizio ClusterIP che hai creato nel passaggio precedente. I servizi ClusterIP sono raggiungibili solo dall'interno del cluster. Pertanto, per accedere al servizio dall'esterno del cluster, completa i seguenti passaggi:
Per stabilire una sessione di port forwarding, esegui questo comando:
kubectl port-forward svc/jetstream-svc 8000:8000
Interagisci con il modello utilizzando curl
Verifica di poter accedere al server HTTP JetStream aprendo un nuovo terminale ed eseguendo questo comando:
curl --request POST \ --header "Content-type: application/json" \ -s \ localhost:8000/generate \ --data \ '{ "prompt": "What are the top 5 programming languages", "max_tokens": 200 }'
Il completamento della richiesta iniziale può richiedere diversi secondi a causa del riscaldamento del modello. L'output è simile al seguente:
{ "response": " for data science in 2023?\n\n**1. Python:**\n- Widely used for data science due to its readability, extensive libraries (pandas, scikit-learn), and integration with other tools.\n- High demand for Python programmers in data science roles.\n\n**2. R:**\n- Popular choice for data analysis and visualization, particularly in academia and research.\n- Extensive libraries for statistical modeling and data wrangling.\n\n**3. Java:**\n- Enterprise-grade platform for data science, with strong performance and scalability.\n- Widely used in data mining and big data analytics.\n\n**4. SQL:**\n- Essential for data querying and manipulation, especially in relational databases.\n- Used for data analysis and visualization in various industries.\n\n**5. Scala:**\n- Scalable and efficient for big data processing and machine learning models.\n- Popular in data science for its parallelism and integration with Spark and Spark MLlib." }
Hai eseguito correttamente le seguenti operazioni:
- È stato eseguito il deployment del server di modelli JetStream-PyTorch su GKE utilizzando le TPU.
- Ha pubblicato e interagito con il modello.
Osserva le prestazioni del modello
Per osservare le prestazioni del modello, puoi utilizzare l'integrazione della dashboard JetStream in Cloud Monitoring. Con questa dashboard puoi visualizzare metriche sul rendimento critiche come il throughput dei token, la latenza delle richieste e i tassi di errore.
Per utilizzare la dashboard JetStream, devi abilitare Google Cloud Managed Service per Prometheus, che raccoglie le metriche da JetStream, nel tuo cluster GKE.
Puoi quindi visualizzare le metriche utilizzando la dashboard JetStream. Per informazioni sull'utilizzo di Google Cloud Managed Service per Prometheus per raccogliere le metriche dal modello, consulta le indicazioni sull'osservabilità di JetStream nella documentazione di Cloud Monitoring.Risoluzione dei problemi
- Se visualizzi il messaggio
Empty reply from server
, è possibile che il container non abbia completato il download dei dati del modello. Controlla di nuovo i log del pod per il messaggioConnected
che indica che il modello è pronto per essere pubblicato. - Se visualizzi
Connection refused
, verifica che l'inoltro delle porte sia attivo.
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
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse create in questa guida, esegui i seguenti comandi e segui le istruzioni:
gcloud container clusters delete CLUSTER_NAME --region=REGION
gcloud iam service-accounts delete wi-jetstream@PROJECT_ID.iam.gserviceaccount.com
Passaggi successivi
- Scopri come eseguire i modelli Gemma su GKE e come eseguire carichi di lavoro di AI/ML ottimizzati con le funzionalità di orchestrazione della piattaforma GKE.
- Scopri di più sulle TPU in GKE.
- Esplora il repository GitHub di JetStream.
- Esplora Vertex AI Model Garden.