Questo tutorial mostra come eseguire il fine tuning di un modello linguistico di grandi dimensioni (LLM) utilizzando le unità di elaborazione tensoriale (TPU) su Google Kubernetes Engine (GKE) con JAX. Il fine-tuning ti consente di adattare un foundation model come Gemma 3 a un dominio o un'attività specifici. Questo processo migliora la precisione e l'accuratezza del modello aggiornandone i parametri con il tuo set di dati specializzato.
Questa guida è un buon punto di partenza se hai bisogno del controllo granulare, della personalizzazione, della scalabilità, della resilienza, della portabilità e dell'economicità di Kubernetes gestito durante la messa a punto dei tuoi workload AI/ML.
Sfondo
Utilizzando le TPU su GKE con Jax per il fine-tuning di un LLM, puoi creare una soluzione di fine-tuning solida e pronta per la produzione con tutti i vantaggi di Kubernetes gestito.
Gemma
Gemma è un insieme di modelli multimodali di AI/ML generativa, leggeri e disponibili pubblicamente, rilasciati con una licenza aperta. Questi modelli di AI sono disponibili per l'esecuzione in applicazioni, hardware, dispositivi mobili o servizi ospitati. Gemma 3 introduce la multimodalità e supporta l'input di visione-linguaggio e gli output di testo. Gestisce finestre contestuali fino a 128.000 token e supporta oltre 140 lingue. Gemma 3 offre anche funzionalità migliorate per la matematica, il ragionamento e la chat, tra cui output strutturati e chiamate di funzioni.
Puoi utilizzare i modelli Gemma per la generazione di testo oppure puoi anche ottimizzarli per attività specializzate.
Per saperne di più, consulta la documentazione di Gemma.
TPU
Le TPU sono circuiti integrati specifici per le applicazioni (ASIC) che Google ha sviluppato su misura 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 TPU attuale con l'architettura di sistema Cloud TPU.
- Scopri di più sulle TPU in GKE.
JAX
JAX è un framework di machine learning ad alte prestazioni progettato per essere utilizzato con TPU e GPU. JAX fornisce un'API per la creazione e l'addestramento di modelli di machine learning.
Per saperne di più, consulta il repository JAX.
Obiettivi
Questo tutorial illustra i seguenti passaggi:
- Crea un cluster GKE Autopilot o Standard con la topologia TPU consigliata, in base alle caratteristiche del modello. Durante questo tutorial, esegui il perfezionamento sui pool di nodi single-tenant.
- Aggiungi dati a un bucket Cloud Storage e montalo nel container tramite Cloud Storage FUSE.
- Esegui il deployment del job di perfezionamento dell'LLM su GKE.
- Monitora il job di perfezionamento e visualizza i log.
Prima di iniziare
- Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei carichi di lavoro.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the required API.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the required API.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Assicurati di avere il seguente ruolo o ruoli nel progetto: roles/container.admin,roles/iam.serviceAccountAdmin,roles/storage.admin
Controlla i ruoli
-
Nella console Google Cloud vai alla pagina IAM.
Vai a IAM - Seleziona il progetto.
-
Nella colonna Entità, trova tutte le righe che identificano te o un gruppo di cui fai parte. Per scoprire a quali gruppi appartieni, contatta il tuo amministratore.
- Per tutte le righe che ti specificano o ti includono, controlla la colonna Ruolo per verificare se l'elenco dei ruoli include i ruoli richiesti.
Concedi i ruoli
-
Nella console Google Cloud vai alla pagina IAM.
Vai a IAM - Seleziona il progetto.
- Fai clic su Concedi l'accesso.
-
Nel campo Nuove entità, inserisci il tuo identificatore dell'utente. In genere si tratta dell'indirizzo email di un Account Google.
- Fai clic su Seleziona un ruolo, quindi cerca il ruolo.
- Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni ruolo successivo.
- Fai clic su Salva.
-
- Assicurati di disporre di una quota sufficiente per 16 chip TPU Trillium (v6e). In questo tutorial utilizzi una configurazione pool di nodi che richiede 16 chip e istanze on demand.
- Assicurati di avere un repository Docker. Se non ne hai uno, crea un repository standard in Artifact Registry.
Prepara l'ambiente
In questo tutorial utilizzerai Cloud Shell per
gestire le risorse ospitate su Google Cloud. Cloud Shell è preinstallato con il software necessario per questo tutorial, tra cui kubectl e Google Cloud CLI.
Per configurare l'ambiente con Cloud Shell:
Nella console Google Cloud , avvia una sessione Cloud Shell e fai clic su
Attiva Cloud Shell. Questa azione avvia 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=CONTROL_PLANE_LOCATION export ZONE=ZONE export GCS_BUCKET_NAME=BUCKET_NAMESostituisci i seguenti valori:
PROJECT_ID: il tuo Google Cloud ID progetto.CLUSTER_NAME: il nome del tuo cluster GKE.CONTROL_PLANE_LOCATION: la regione Compute Engine in cui si trovano il cluster GKE e i nodi TPU. La regione deve contenere zone in cui sono disponibili i tipi di macchine TPU Trillium (v6e).ZONE: una zona all'interno della regioneCONTROL_PLANE_LOCATIONselezionata in cui sono disponibili i tipi di macchine TPU Trillium (v6e). Per elencare le zone in cui sono disponibili le TPU TPU Trillium (v6e), esegui il comando seguente:gcloud compute accelerator-types list --filter="name~ct6e" --format="value(zone)"BUCKET_NAME: il nome del bucket Cloud Storage che contiene i dati di addestramento.
Clona il repository di esempio:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samplesVai alla directory di lavoro:
cd ai-ml/llm-training-jax-tpu-gemma3
Creare e configurare risorse Google Cloud
In questa sezione, creerai e configurerai le risorse Google Cloud .
Crea un cluster GKE
Puoi eseguire il fine tuning di un LLM sulle 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 workload, consulta Scegliere una modalità operativa GKE.
Autopilot
Crea un cluster GKE Autopilot che utilizzi Workload Identity Federation for GKE e in cui sia abilitato Cloud Storage FUSE.
gcloud container clusters create-auto ${CLUSTER_NAME} \
--location=${REGION}
La creazione del cluster potrebbe richiedere diversi minuti.
Standard
Crea un cluster GKE Standard regionale che utilizzi Workload Identity Federation for GKE e in cui sia abilitato Cloud Storage FUSE.
gcloud container clusters create ${CLUSTER_NAME} \ --enable-ip-alias \ --addons GcsFuseCsiDriver \ --machine-type=n2-standard-4 \ --num-nodes=2 \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --location=${REGION}La creazione del cluster potrebbe richiedere diversi minuti.
Crea un pool di nodi a singolo host:
gcloud container node-pools create jax-tpu-nodepool \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-1t \ --num-nodes=1 \ --location=${REGION} \ --node-locations=${ZONE} \ --workload-metadata=GKE_METADATA
GKE crea un pool di nodi TPU Trillium con una topologia 1x1 e un nodo. Il flag --workload-metadata=GKE_METADATA configura il pool di nodi in modo che utilizzi il server metadati GKE.
Installa JobSet
Configura
kubectlper comunicare con il cluster:gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${REGION}Installa l'ultima versione rilasciata di JobSet:
kubectl apply --server-side -f https://github.com/kubernetes-sigs/jobset/releases/download/JOBSET_VERSION/manifests.yamlSostituisci
JOBSET_VERSIONcon l'ultima versione rilasciata di JobSet. Ad esempio:v0.11.0.Verifica l'installazione di JobSet:
kubectl get pods -n jobset-systemL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE jobset-controller-manager-6c56668494-l4dhc 1/1 Running 0 4m45sPotresti dover aggiungere altri nodi se JobSet è in attesa di risorse.
Configurare Cloud Storage FUSE
Per ottimizzare l'LLM, devi fornire dati di addestramento. In questo tutorial, utilizzerai il set di dati TinyStories di Hugging Face. Questo set di dati contiene racconti generati sinteticamente da GPT-3.5 e GPT-4, che utilizzano un vocabolario limitato.
Questa sezione descrive i passaggi per configurare Cloud Storage FUSE in modo da leggere i dati da un bucket Cloud Storage.
Scarica il set di dati:
wget https://huggingface.co/datasets/roneneldan/TinyStories/resolve/main/TinyStories-train.txt?download=true -O TinyStories-train.txtCarica i dati in un nuovo bucket Cloud Storage:
gcloud storage buckets create gs://${GCS_BUCKET_NAME} \ --location=${REGION} \ --enable-hierarchical-namespace \ --uniform-bucket-level-access gcloud storage cp TinyStories-train.txt gs://${GCS_BUCKET_NAME}Per consentire al tuo workload di leggere i dati tramite Cloud Storage FUSE, crea un account di servizio Kubernetes (KSA) e aggiungi le autorizzazioni richieste. Esegui lo script
permissionsetup.sh:Dopo aver eseguito questo script, le seguenti risorse vengono configurate nel tuo progettoGoogle Cloud e nel cluster GKE:
- Nel tuo progetto viene creato un nuovo account di servizio IAM denominato
gcs-fuse-sa. - Al service account Google (GSA) creato Google Cloud (
gcs-fuse-sa) viene concesso il ruoloroles/storage.objectViewersul bucket Cloud Storage specificato da${GCS_BUCKET_NAME}. Questa autorizzazione consente al GSA di leggere gli oggetti dal bucket. - Nel tuo cluster GKE viene creato un nuovo KSA denominato
jaxserviceaccountnello spazio dei nomidefault. - Il criterio IAM del service account Google è aggiornato per concedere il ruolo
roles/iam.workloadIdentityUseral service account Kubernetes. Questa autorizzazione consente al KSA di rappresentare il GSA. Il KSA è annotato per essere collegato al GSA. Questa annotazione indica a GKE quale account di servizio Google deve essere rappresentato dal KSA utilizzando Workload Identity.
Qualsiasi pod in esecuzione nello spazio dei nomi
defaultdel cluster GKE che utilizza il account di serviziojaxserviceaccountora potrà autenticarsi come GSAgcs-fuse-sa. Questi pod avranno accesso in lettura agli oggetti archiviati nel bucketgs://${GCS_BUCKET_NAME}, il che è essenziale per consentire al job di perfezionamento di accedere al set di dati utilizzando Cloud Storage FUSE.
- Nel tuo progetto viene creato un nuovo account di servizio IAM denominato
Crea lo script di ottimizzazione
In questa sezione esplorerai lo script di addestramento che esegue un'operazione di perfezionamento su un modello Gemma 3. Questo script utilizza Gemma3Tokenizer.
Esamina il seguente script di ottimizzazione Gemma3LLMTrain.py:
In questo script, vale quanto segue:
- Un
Gemma3Tokenizerconverte i dati di testo in token che il modello può elaborare. - La funzione
load_and_preprocess_datalegge i dati di addestramento da un file, li suddivide in singole storie e utilizza il tokenizer per convertire il testo in sequenze di token con padding. - La funzione
generate_textaccetta il modello, i relativi parametri e un prompt per generare il testo. - La funzione
train_stepdefinisce una singola iterazione di addestramento che include il passaggio in avanti, il calcolo della perdita (utilizzando l'entropia incrociata), il calcolo del gradiente e gli aggiornamenti dei parametri. - La funzione
train_modelscorre il set di dati per un numero specificato di epoche, che chiama la funzionetrain_stepper ogni batch. - La funzione
run_trainingorchestra l'intero processo di caricamento dei dati, inizializzazione del modello Gemma 3 (Gemma3_270M) e dell'ottimizzatore, caricamento dei parametri preaddestrati, configurazione dello sharding dei dati per l'elaborazione parallela, esecuzione di una generazione di test, esecuzione del ciclo di addestramento ed esecuzione di una generazione di testo finale per dimostrare l'effetto del fine tuning. - Lo script utilizza la libreria
argparseper accettare gli argomenti della riga di comando per i parametrimaxlen,batch_sizeedatacount.
Ora che hai esplorato lo script di perfezionamento, inseriscilo in un container per eseguirlo su GKE.
Containerizza lo script di perfezionamento
Prima di eseguire lo script di perfezionamento in un cluster GKE, devi inserirlo in un container. Questo tutorial utilizza un'immagine AI JAX come immagine di base.
Apri
Dockerfilenella stessa directory del fileGemma3LLMTrain.py:Questo Dockerfile installa le dipendenze necessarie e copia il file
Gemma3LLMTrain.pynel container.Crea l'immagine Docker ed eseguine il push in un repository di immagini:
export REPOSITORY=REPOSITORY_NAME export IMAGE_NAME="jax-gemma3-training" export IMAGE_TAG="latest" export DOCKERFILE_PATH="./Dockerfile" export IMAGE_URI="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY}/${IMAGE_NAME}:${IMAGE_TAG}" docker build -t "${IMAGE_URI}" -f "${DOCKERFILE_PATH}" . gcloud auth configure-docker "${REGION}-docker.pkg.dev" -q docker push "${IMAGE_URI}"Sostituisci
REPOSITORY_NAMEcon il nome del tuo repository Artifact Registry.Aggiungi associazioni di ruoli al account di servizio:
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format 'get(projectNumber)') gcloud artifacts repositories add-iam-policy-binding ${REPOSITORY} \ --project=${PROJECT_ID} \ --location=${REGION} \ --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \ --role="roles/artifactregistry.reader"
Con l'immagine nel repository, ora puoi eseguire il deployment del job di perfezionamento in un cluster GKE.
Esegui il deployment del job di ottimizzazione LLM
Questa sezione mostra come eseguire il deployment del job di perfezionamento dell'LLM nel cluster GKE.
Apri il file manifest
training_singlehost.yaml:Applica il manifest:
envsubst < training_singlehost.yaml | kubectl apply -f -
GKE crea un job che avvia un pod su un nodo TPU Trillium (v6e). Questo pod esegue lo script di perfezionamento Python, che
accede ai dati di perfezionamento dal bucket Cloud Storage specificato
montato nel percorso /data utilizzando Cloud Storage FUSE. Lo script esegue quindi il fine tuning del modello Gemma.
Monitora il job di addestramento
In questa sezione, monitori l'avanzamento del job di perfezionamento e le relative prestazioni.
Visualizzare l'avanzamento dell'ottimizzazione
Elenca i pod:
# Find the Pods kubectl get podsSegui l'output del log:
kubectl logs -f pods/POD_NAMESostituisci
POD_NAMEcon il nome del tuo pod.L'output è simile al seguente:
Global device count: 1 Batch size: 128, Max length: 256, Data count: 96000 I1028 00:12:55.925999 1387 google_auth_provider.cc:181] Running on GCE, using service account ... Generating response for: Once upon a time, there was a girl named Amy. Response: Amy lived in a small house. The house was in a big field. Amy liked to play in the big field. She Start training model Loss after batch 0: 10.25 Loss after batch 10: 4.3125 . . . Loss after batch 740: 1.41406 Completed training model. Total time for training 294.6791355609894 seconds Generating response for: Once upon a time, there was a girl named Amy. Response: She loved to play with her toys. One day, Amy's mom told her that she had to go to the store toAnalizza l'output:
- La riga
Global device count: 1indica i core TPU utilizzati. - Il modello genera un testo ragionevole prima di questa esecuzione di ottimizzazione perché viene caricato da un checkpoint preaddestrato.
- L'output generato dopo l'ottimizzazione mostra una maggiore somiglianza con l'inizio di un racconto, il che indica che il modello sta apprendendo dal nuovo set di dati.
- Il perfezionamento sull'intero set di dati dovrebbe produrre risultati ancora più raffinati.
- La riga
Osservare le metriche
Visualizza il rendimento del job di perfezionamento controllando le metriche TPU e CPU. Per visualizzare le metriche di osservabilità per il cluster, segui i passaggi descritti in Visualizzare le metriche di osservabilità di cluster e carichi di lavoro.
Configurazioni di ottimizzazione alternative
Questa sezione descrive configurazioni alternative per il tuo workload di perfezionamento.
Selezione del modello
Questo tutorial ha utilizzato il modello Gemma3_270M, un modello piccolo che rientra in un pool di nodi TPU Trillium (v6e) single-host. Per i modelli più grandi che
richiedono più memoria e calcolo per il perfezionamento, puoi utilizzare configurazioni di pool di nodi multi-host o
multislice.
Per un elenco completo dei modelli disponibili, consulta la documentazione di Gemma.
Configurazioni del node pool
Questo tutorial ha utilizzato un pool di nodi single-host. Puoi anche creare node pool di slice TPU multi-host o node pool multislice, a seconda delle tue esigenze.
Le seguenti schede mostrano come creare pool di nodi multihost e multislices:
Multi-host
In Cloud Shell, esegui questo comando:
gcloud container node-pools create jax-tpu-multihost1 \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-4t \ --num-nodes=2 \ --tpu-topology=2x4 \ --location=${REGION} \ --node-locations=${ZONE}GKE crea un pool di nodi TPU Trillium con una topologia
2x4e due nodi.Apri la definizione del job
training_multihost_jobset.yaml:Esegui il deployment del job di ottimizzazione:
envsubst < training_multihost_jobset.yaml | kubectl apply -f -
Multislice
In Cloud Shell, esegui questo comando:
gcloud container node-pools create jax-tpu-multihost1 \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-4t \ --num-nodes=2 \ --tpu-topology=2x4 \ --location=${REGION} \ --node-locations=${ZONE} gcloud container node-pools create jax-tpu-multihost2 \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-4t \ --num-nodes=2 \ --tpu-topology=2x4 \ --location=${REGION} \ --node-locations=${ZONE}GKE crea due node pool TPU Trillium. Ogni node pool ha una topologia
2x4e due nodi.Apri la definizione del job
training_multislice_jobset.yaml: