Questo tutorial mostra come orchestrare un ambiente di addestramento distribuito per il reinforcement learning (RL) su Google Kubernetes Engine (GKE). Utilizzi Ray e il framework NVIDIA NeMo RL per configurare un ambiente di addestramento distribuito per ottimizzare un modello.
Questo tutorial si concentra sulla pipeline di addestramento dell'ottimizzazione relativa dei criteri di gruppo (GRPO) su GKE con Ray e NeMo RL. GRPO è un algoritmo di apprendimento per rinforzo progettato per migliorare la capacità di ragionamento di un modello. Questo algoritmo efficiente in termini di memoria semplifica il processo di RL eliminando il Critic, o modello di valore, e utilizzando invece un calcolo relativo basato sul gruppo.
Prima di eseguire questo tutorial, completa il tutorial Ottimizzare e scalare l'apprendimento per rinforzo con Vertex AI su GKE. Questo tutorial utilizza la stessa configurazione e configurazione del cluster del tutorial sull'ottimizzazione e lo scaling del RL con verl.
Sfondo
Le sezioni seguenti forniscono una breve panoramica dei concetti utilizzati in questo tutorial.
Apprendimento per rinforzo (RL)
L'RL insegna ai modelli attraverso l'esperienza, l'esplorazione e il feedback, anziché l'imitazione statica. Anche se il pre-addestramento insegna a un modello cosa dire, l'apprendimento per rinforzo con feedback umano (RLHF) gli insegna a essere utile, sicuro e logico. L'RL funge da ponte tra un modello di base e un modello ottimizzato per un caso d'uso specializzato.
Per saperne di più, consulta Che cos'è l'apprendimento per rinforzo?
Ottimizzazione delle policy relative al gruppo (GRPO)
GRPO, un algoritmo reso popolare da DeepSeek, offre un'alternativa a basso consumo di memoria all'ottimizzazione delle norme prossimali (PPO) per l'allineamento degli LLM rimuovendo il modello Critic. Anziché una rete di critici, GRPO genera un gruppo di risposte per lo stesso prompt e utilizza la ricompensa media di quel gruppo come baseline.
Per saperne di più, consulta GRPO.
NVIDIA NeMo RL
NeMo RL è la libreria open source di NVIDIA per il post-training progettata per l'RL scalabile. Parte dell'ecosistema più ampio del framework NeMo, NeMo RL consente sia esperimenti su piccola scala su una singola GPU sia deployment multinodo su migliaia di GPU.
Per ulteriori informazioni, consulta NVIDIA NeMo RL.
Set di dati GSM8k
In questo tutorial utilizzi il set di dati GSM8k, che contiene 8500 problemi matematici di alta qualità, linguisticamente diversi per la scuola elementare.
Utilizzando GSM8k e GRPO, il modello genera un gruppo di n risposte diverse per lo stesso problema. GRPO confronta queste risposte con la media del gruppo. Il modello viene premiato maggiormente per i percorsi che sono costantemente corretti e logicamente validi rispetto al resto del gruppo. Nel tempo, il modello impara che articolare chiaramente i suoi passaggi è il modo più affidabile per massimizzare la ricompensa, riducendo di fatto la ricompensa per le risposte con un rendimento scarso.
Per saperne di più, consulta GSM8k.
Obiettivi
Questo tutorial mostra come configurare RL su GKE con NeMo RL completando i seguenti passaggi:
- Prepara l'ambiente.
- Configura un cluster GKE con GPU B200 o H200.
- Configura KubeRay per gestire un cluster Ray distribuito.
- Utilizza Managed Lustre per l'archiviazione ad alte prestazioni.
- Esegui un job di addestramento GRPO che utilizza NeMo RL.
Prima di iniziare
-
Installa Google Cloud CLI.
-
Configura gcloud CLI per utilizzare la tua identità federata.
Per ulteriori informazioni, vedi Accedi a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
Crea o seleziona un Google Cloud progetto.
Ruoli richiesti per selezionare o creare un progetto
- Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per cui ti è stato concesso un ruolo.
-
Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto
(
roles/resourcemanager.projectCreator), che contiene l'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Creare un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon un nome per il progetto Google Cloud che stai creando. -
Seleziona il progetto Google Cloud che hai creato:
gcloud config set project PROJECT_ID
Sostituisci
PROJECT_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .
Abilita le API richieste:
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre dell'autorizzazione
serviceusage.services.enable. Se hai creato il progetto, probabilmente disponi già di questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM:
roles/container.admin, roles/iam.serviceAccountAdmin, roles/storage.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Sostituisci quanto segue:
PROJECT_ID: il tuo ID progetto.USER_IDENTIFIER: l'identificatore del tuo account utente account. Per esempi, vedi Rappresenta gli utenti del pool di forza lavoro nelle policy IAM.ROLE: il ruolo IAM che concedi al tuo account utente.
- Crea un account Hugging Face, se non ne hai già uno.
- Assicurati di avere un
token Hugging Face con
read access. - Crea un account Weights & Biases (Wandb), se non ne hai uno.
- Crea una chiave API Wandb.
- Assicurati che il tuo progetto Google Cloud disponga di una quota sufficiente per le GPU B200 e H200. Per saperne di più, consulta Pianificare la quota di GPU e Quota di GPU.
prepara l'ambiente
In questo tutorial utilizzi Cloud Shell.
Vai alla consoleGoogle Cloud .
Nella parte superiore della finestra della console Google Cloud , fai clic sul pulsante Attiva Cloud Shell.
Imposta le seguenti variabili di ambiente:
Sostituisci i seguenti valori:
YOUR_REGION: la regione Compute Engine per il control plane del cluster GKE.YOUR_NODE_ZONE: la zona per i nodi. Seleziona una zona in cui sono disponibili le GPU NVIDIA B200 o H200.YOUR_CLUSTER_NAME: il nome del cluster GKE.YOUR_GPU_TYPE: l'acceleratore che hai prenotato nella prenotazione di capacità di Compute Engine. Deve essere uno dei seguenti valori:nvidia-b200: NVIDIA B200 (180 GB)nvidia-h200-141gb: NVIDIA H200 (141 GB)
YOUR_MACHINE_TYPE: il tipo di macchina da utilizzare:- Per le GPU NVIDIA B200 (180 GB), utilizza
a4-highgpu-8go versioni successive. - Per le GPU NVIDIA H200 (141 GB), utilizza
a3-ultragpu-8go versioni successive.
- Per le GPU NVIDIA B200 (180 GB), utilizza
YOUR_RESERVATION_NAME: il nome della prenotazione GPU.CHOSEN_LUSTRE_NAME: il nome dell'istanza Lustre.YOUR_HF_TOKEN: il tuo token Hugging Face.YOUR_WANDB_API_KEY: la tua chiave API Wandb.
Crea le seguenti variabili di ambiente per la rete:
Sostituisci i seguenti valori:
NETWORK_NAME: il nome della rete per GKE.GVNIC_NAME: il prefisso per il nome della rete gVNIC. Puoi utilizzare qualsiasi prefisso.RDMA_NAME: il prefisso per la rete RDMA (Remote Direct Memory Access). Puoi utilizzare qualsiasi prefisso.
Configurazione dell'infrastruttura
In questa sezione crei reti VPC e un cluster GKE.
Crea una rete VPC
Crea una rete VPC per l'interfaccia gVNIC:
Crea una rete VPC e subnet per RDMA che includa otto subnet per otto GPU:
Crea il cluster GKE
Puoi impostare NeMo RL in un cluster GKE Standard.
Crea un cluster standard:
Recupera le credenziali per il tuo cluster:
Crea il pool di nodi GPU:
Installa il programma di installazione NCCL RDMA:
Configurare i mapping di rete
Salva il seguente manifest come
network-mapping.yaml:Applica il manifest:
Preparare lo spazio di archiviazione
In questa sezione creerai un'istanza Managed Lustre, che esegue il provisioning dello spazio di archiviazione ad alte prestazioni necessario per il tuo carico di lavoro RL.
Alloca un intervallo di indirizzi IP per l'accesso ai servizi privati:
Connetti il peering:
Crea un'istanza Managed Lustre:
Accedi a un'istanza Managed Lustre esistente utilizzando il driver CSI Managed Lustre.
Estrai l'indirizzo IP dell'istanza Managed Lustre.
Esamina il manifest di
lustre-pv.yaml.Applica il manifest:
Esamina il manifest di
lustre-pvc.yaml.Applica il manifest:
Esegui il deployment di RayCluster
In questa sezione, clona il repository di esempio, prepara i manifest ed esegui il deployment del cluster Ray:
Clona il repository di esempio:
Vai alla directory di lavoro:
Ispeziona il manifest
values.yaml:Sostituisci
NCCL_TUNER_CONFIG_PATHcon uno dei seguenti valori, in base all'acceleratore che utilizzi in questo tutorial:- NVIDIA B200 (180 GB):
/usr/local/gib/configs/tuner_config_a4.txtpb - NVIDIA H200 (141 GB):
/usr/local/gib/configs/tuner_config_a3u.txtpb
In questo manifest, il nodo head gestisce il job e ospita la dashboard Ray. I nodi worker eseguono i job di addestramento.
- NVIDIA B200 (180 GB):
Esegui il deployment del cluster Ray:
Per questo tutorial, utilizzi due nodi di lavoro. Se vuoi modificare il numero di nodi worker, modifica il valore di
REPLICA_COUNT.Verifica che i nodi di lavoro e di intestazione siano in esecuzione:
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE ray-cluster-kuberay-head-sw7dp 2/2 Running 0 33h ray-cluster-kuberay-worker-grp-0-worker-gkbxw 2/2 Running 0 33h ray-cluster-kuberay-worker-grp-0-worker-kdg62 2/2 Running 0 33hVerifica che il cluster Ray sia in esecuzione:
L'output è simile al seguente:
NAME NAMESPACE DESIRED WORKERS AVAILABLE WORKERS CPUS GPUS TPUS MEMORY CONDITION STATUS AGE ray-cluster-kuberay default 2 2 618 17 0 1573741824k RayClusterProvisioned ready 33h
Avvia il job GRPO
Quando il cluster Ray è pronto, puoi inviare un job Ray al cluster Ray in esecuzione su GKE. NeMo RL scarica automaticamente il modello durante l'esecuzione del job di addestramento RL.
Per inviare un job Ray, avvia una sessione interattiva per eseguire il job.
Per stabilire una connessione locale al cluster Ray, esegui questo comando:
Questo comando avvia l'inoltro delle porte tra la tua macchina locale e il nodo head Ray nel tuo cluster GKE. Tieni presente che il terminale sarà occupato mentre questa sessione è attiva; per procedere, apri un'istanza del terminale separata.
In un terminale separato, vai a
kubernetes-engine-samples/ai-ml/nemo-rl-on-gke/nemoRL/gemma3-27b-ite modifica il filegemma3-27b-gsm8k.sh:Sostituisci i seguenti valori nel file
gemma3-27b-gsm8k.sh:YOUR_WANDB_API_KEY: la tua chiave API WandB.YOUR_HF_TOKEN: il tuo token Hugging Face.
In questo file puoi vedere la configurazione per eseguire un job con il modello gemma3-27b-it sul set di dati GSM8k. Per completare la pipeline di addestramento GRPO, questo script definisce i seguenti parametri:
num_prompts_per_step: 16enum_generations_per_prompt: 32: il modello Gemma3-27b-it genera un ampio gruppo di risposte per ogni prompt. In questa configurazione, il modello produce 512 risposte totali (16 × 32 = 512).policy.generation.colocated.enabled=False: questo parametro disattiva la funzionalità di generazione colocalizzata, il che significa che il modello non genera risposte nello stesso nodo del processo di addestramento. Nell'RL standard, le stesse GPU gestiscono sia l'addestramento che la generazione. In questa configurazione di NeMo RL, dedichi nodi specifici (gestiti con il parametropolicy.generation.colocated.resources) esclusivamente all'inferenza vLLM, mentre il resto del cluster si concentra sui calcoli di addestramento più complessi. Separando questi workload, eviti la contesa delle risorse tra i buffer di addestramento ad alta intensità di memoria e i workload di inferenza ad alta intensità di calcolo.
Per inviare il Job, esegui questo comando:
Quando il job è in esecuzione, l'output mostra i risultati dell'addestramento, la tempistica e le metriche di rendimento.
Monitorare lo stato del job GRPO
Al termine del job, NeMo RL archivia i checkpoint nel percorso configurato.
Per controllare l'output del job GRPO, crea una sessione SSH nel container
ray-head:Installa l'utilità apt tree nel terminale del contenitore
ray-head:Elenca la struttura delle directory del container
ray-head:L'output è simile al seguente:
root@ray-cluster-kuberay-worker-grp-0-worker-gkbxw:/opt/nemo-rl# tree /data/nemo_rl_gemma3_27b_3_17/ /data/nemo_rl_gemma3_27b_3_17/ `-- step_10 |-- config.yaml |-- policy | |-- optimizer | | |-- __0_0.distcp | | |-- __10_0.distcp | | |-- __11_0.distcp | | |-- __12_0.distcp | | |-- __13_0.distcp | | |-- __14_0.distcp | | |-- __15_0.distcp | | |-- __1_0.distcp | | |-- __2_0.distcp | | |-- __3_0.distcp | | |-- __4_0.distcp | | |-- __5_0.distcp | | |-- __6_0.distcp | | |-- __7_0.distcp | | |-- __8_0.distcp | | `-- __9_0.distcp | |-- tokenizer | | |-- chat_template.jinja | | |-- special_tokens_map.json | | |-- tokenizer.json | | `-- tokenizer_config.json | `-- weights | |-- __0_0.distcp | |-- __10_0.distcp | |-- __11_0.distcp | |-- __12_0.distcp | |-- __13_0.distcp | |-- __14_0.distcp | |-- __15_0.distcp | |-- __1_0.distcp | |-- __2_0.distcp | |-- __3_0.distcp | |-- __4_0.distcp | |-- __5_0.distcp | |-- __6_0.distcp | |-- __7_0.distcp | |-- __8_0.distcp | `-- __9_0.distcp |-- train_dataloader.pt `-- training_info.json 6 directories, 39 files
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina le singole risorse oppure il progetto che le contiene.
Elimina le risorse
Elimina il cluster Slurm:
Elimina il cluster GKE:
Elimina il file system Lustre:
Elimina peering VPC:
Elimina l'intervallo di indirizzi IP privati Lustre:
Elimina le subnet RDMA e gVNIC:
Elimina regole firewall e reti:
Elimina il progetto
Elimina un progetto Google Cloud :
gcloud projects delete PROJECT_ID