Questo tutorial mostra come orchestrare un ambiente di addestramento distribuito per il reinforcement learning su Google Kubernetes Engine (GKE). Utilizzi Ray e il framework verl (Volcano Engine Reinforcement Learning) per configurare un ambiente di addestramento distribuito per ottimizzare un modello Qwen2.5-32B-Instruct sul set di dati GSM8K.
Questo tutorial si concentra sulla pipeline di addestramento Group Relative Policy Optimization (GRPO) su GKE con Ray e verl. 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 reinforcement learning (RL) eliminando il Critic, o modello di valore, e utilizzando invece un calcolo relativo basato sul gruppo.
Questo tutorial è un buon punto di partenza se devi configurare un ambiente di addestramento distribuito in cui dati, pesi del modello e motore di addestramento sono disaccoppiati per efficienza.
Questo tutorial supporta le seguenti architetture GPU:
- Nodi GPU basati su Intel o AMD: configura e scala utilizzando le GPU NVIDIA B200 o H200, utilizzando l'allocazione dinamica delle risorse (DRA) di GKE per il percorso Autopilot.
- Nodi A4X (GB200) basati su Arm: configura ed esegui lo scale utilizzando i superchip NVIDIA GB200 Grace Blackwell, utilizzando l'allocazione dinamica delle risorse (DRA) di GKE e NVLink multimodale (IMEX).
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 sottoposto a fine-tuning 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 efficiente in termini di memoria all'ottimizzazione delle norme prossimali (PPO) per l'allineamento degli LLM rimuovendo il modello Critic. Anziché una rete Critic, GRPO genera un gruppo di risposte per lo stesso prompt e utilizza la media dei reward di quel gruppo come baseline.
Per saperne di più, consulta GRPO.
Volcano Engine Reinforcement Learning (verl)
verl è un framework ad alte prestazioni progettato per gestire i complessi pattern di memoria e di calcolo dell'RL basato su LLM.
Per saperne di più, consulta verl.
Obiettivi
Questo tutorial mostra come configurare l'apprendimento per rinforzo su GKE con verl, completando i seguenti passaggi:
- Configura un cluster GKE con A4X (superchip GB200), A4 (GPU B200) o A3 Ultra (GPU H200).
- Configura KubeRay per gestire un cluster Ray distribuito.
- Utilizza Cloud Storage FUSE per montare un bucket Cloud Storage su tutti i nodi.
- Esegui un job di addestramento GRPO utilizzando verl per allineare il modello Qwen2.5-32B-Instruct al set di dati GSM8K.
Prima di iniziare
- Questo tutorial utilizza Cloud Shell, che include Google Cloud CLI e
kubectlpreinstallati. Se non utilizzi Cloud Shell, installa e inizializza Google Cloud CLI e installakubectl.
- 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.
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere 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 il quale 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.
-
Crea 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, se non sono già abilitate:
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 Service Usage (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere 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 il quale 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.
-
Crea 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, se non sono già abilitate:
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 Service Usage (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Concedi i 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.admin, roles/iam.serviceAccountUsergcloud 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. Ad esempio:myemail@example.com.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.
- Assicurati che il tuo progetto disponga di una quota sufficiente per A4X (superchip GB200), A4 (GPU B200) o A3 Ultra (GPU H200). Per scoprire di più, consulta Pianificare la quota di GPU e Quota di GPU.
- Assicurati di avere una prenotazione di capacità attiva per il tipo di macchina GPU. Per ulteriori informazioni, vedi Riservare capacità tramite il team dedicato all'account.
- Per la configurazione di A4X (GB200), assicurati di aver installato Helm.
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 variabili di ambiente:
A4 e A3 Ultra
Autopilot
Standard
A4X
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CONTROL_PLANE_REGION=YOUR_REGION export NODE_ZONE=YOUR_ZONE export CLUSTER_NAME=YOUR_CLUSTER_NAME export KSA_NAME=YOUR_KSA_NAME export GS_BUCKET=YOUR_GCS_BUCKET-${PROJECT_ID} export NAMESPACE=default export GPU_TYPE=YOUR_GPU_TYPE export MACHINE_TYPE=YOUR_MACINE_TYPE export RESERVATION=YOUR_RESERVATION_NAME export HF_TOKEN=YOUR_HF_TOKEN # A4X (GB200 Superchips) only variables export NUM_GPU_NODES=4 export VERL_IMAGE=verlai/verl:vllm023.aarch64.dev1 export VERL_REF=ddbcdb7Sostituisci i seguenti valori:
YOUR_REGION: la regione di Compute Engine per il control plane del cluster GKE.YOUR_ZONE: la zona in cui sono prenotati i nodi. Per saperne di più, consulta Disponibilità delle GPU.YOUR_CLUSTER_NAME: il nome del tuo cluster GKE. Questo nome deve contenere al massimo 40 caratteri ed essere composto da caratteri alfanumerici minuscoli e trattini.YOUR_KSA_NAME: il nome del tuo account di servizio Kubernetes.YOUR_GCS_BUCKET: il nome di base del bucket Cloud Storage. Non è necessario specificare il prefissogs://.YOUR_GPU_TYPE: l'acceleratore che hai prenotato nella prenotazione di capacità di Compute Engine. Deve essere uno dei seguenti valori:nvidia-gb200: A4X (GB200 Superchips)nvidia-b200: A4 (GPU B200)nvidia-h200-141gb: A3 Ultra (GPU H200)
YOUR_MACHINE_TYPE: il tipo di macchina da utilizzare:- Per A4X (superchip GB200), utilizza
a4x-highgpu-4g. - Per A4 (GPU B200), utilizza
a4-highgpu-8go versioni successive. - Per A3 Ultra (GPU H200), utilizza
a3-ultragpu-8go versioni successive.
- Per A4X (superchip GB200), utilizza
YOUR_CPU_MACHINE_TYPE: il tipo di macchina Compute Engine per il pool di nodi predefinito della CPU. Utilizza un tipo di macchinahighmemcon almeno 16 vCPU supportate nella zona del cluster, ad esempion4-highmem-16on2d-highmem-16.YOUR_RESERVATION_NAME: il nome della prenotazione di capacità.YOUR_HF_TOKEN: il tuo token Hugging Face.- Utilizza le seguenti variabili durante la configurazione dell'ambiente nei cluster GKE Standard:
YOUR_GVNIC_NAME(solo A4 o A3 Ultra): il prefisso per il nome della rete gVNIC. Puoi utilizzare qualsiasi prefisso.YOUR_RDMA_NAME(solo A4 o A3 Ultra): il prefisso per la rete RDMA (Remote Direct Memory Access). Puoi utilizzare qualsiasi prefisso.
Clona il repository di esempio:
Nel resto del tutorial, cerca nella tua clonazione del repository di esempio i file specifici che devi esaminare o applicare.
Vai alla directory di lavoro per la modalità GKE scelta:
A4 e A3 Ultra
Autopilot
Standard
A4X
Non è necessario modificare la directory. Puoi passare direttamente alla sezione successiva.
Configurazione dell'infrastruttura
In questa sezione, creerai reti VPC standard e il cluster GKE.
Crea una rete e delle subnet RDMA (solo GKE Standard - A4 e A3 Ultra)
A4 e A3 Ultra
Autopilot
Questa sezione è obbligatoria solo per le GPU GKE Standard A4 e A3 Ultra.
Se utilizzi Autopilot, salta questa sezione e vai direttamente a Crea un cluster GKE. GKE esegue automaticamente il provisioning delle reti VPC e delle subnet necessarie e utilizza GKE Managed DRANET per allocare queste risorse ai tuoi pod. Non è necessario creare manualmente un'infrastruttura di rete.
Standard
Crea una rete VPC per l'interfaccia gVNIC:
Crea una rete VPC per RDMA:
Crea le 8 subnet RDMA per le 8 GPU:
A4X
Questa sezione è obbligatoria solo per le GPU GKE Standard A4 e A3 Ultra.
Se utilizzi GPU A4X (GB200), salta questa sezione e vai direttamente a
Crea un cluster GKE. Per le GPU A4X (GB200) o Autopilot, GKE crea automaticamente le reti quando il pool di nodi utilizza il profilo di rete dell'acceleratore auto. Il progetto base di Cluster Toolkit
attiva questo profilo utilizzando il flag enable_dranet:true.
Crea un cluster GKE
Crea un cluster GKE corrispondente alla tua architettura GPU:
A4 e A3 Ultra
Seleziona la modalità cluster GKE che vuoi utilizzare:
Autopilot
Crea un cluster Autopilot:
Recupera le credenziali per il tuo cluster:
Standard
Crea un cluster Standard:
Recupera le credenziali per il tuo cluster:
Crea il pool di nodi GPU. Questi node pool utilizzano la prenotazione per garantire la disponibilità. Inizia con due nodi:
Installa il programma di installazione NCCL RDMA utilizzato per i cluster Standard:
A4X
Crea un cluster GKE e pool di nodi utilizzando il blueprint Cluster Toolkit
gke-a4x. Il progetto esegue il provisioning del cluster GKE, incluso il pool di nodi A4X associato alla tua prenotazione, le reti di acceleratori (un gVNIC aggiuntivo più quattro rail RDMA) e il driver DRANET gestito che espone le NIC CX-7 come dispositivi DRA.Utilizza le istruzioni di deployment del blueprint per configurare i parametri (ad esempio
PROJECT_ID,CONTROL_PLANE_REGION,NODE_ZONE, prenotazione eNUM_GPU_NODES), quindi esegui il deployment del cluster. In alternativa, puoi seguire la guida alla creazione di cluster GKE A4X per creare un cluster manualmente.- Recupera le credenziali per il tuo cluster:
gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${CONTROL_PLANE_REGION}Verifica che il cluster esponga le NIC RDMA tramite DRA:
kubectl get deviceclassesL'output deve includere
mrdma.google.com.Verifica che i nodi A4X siano presenti:
kubectl get nodes -l cloud.google.com/gke-accelerator=nvidia-gb200Installa il plug-in NCCL gIB (variante A4X):
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-rdma/nccl-rdma-installer-a4x.yamlInstalla il driver NVIDIA DRA, che fornisce canali
ComputeDomain(IMEX) per NVLink multinodo:helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update kubectl create namespace nvidia-dra-driver-gpu kubectl apply -f - <<EOF apiVersion: v1 kind: ResourceQuota metadata: name: nvidia-dra-driver-gpu-quota namespace: nvidia-dra-driver-gpu spec: hard: pods: "$((2 * NUM_GPU_NODES + 1))" scopeSelector: matchExpressions: - operator: In scopeName: PriorityClass values: - system-node-critical - system-cluster-critical EOF helm upgrade --install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \ --version=25.3.1 --namespace nvidia-dra-driver-gpu \ --set nvidiaDriverRoot=/home/kubernetes/bin/nvidia \ --set resources.gpus.enabled=false \ --set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \ --set kubeletPlugin.tolerations[0].operator=Exists \ --set kubeletPlugin.tolerations[1].key=kubernetes.io/arch \ --set kubeletPlugin.tolerations[1].operator=ExistsInstalla l'operatore KubeRay, con ambito limitato allo spazio dei nomi del carico di lavoro:
kubectl create namespace ${NAMESPACE} helm repo add kuberay https://ray-project.github.io/kuberay-helm/ && helm repo update helm upgrade --install kuberay-operator kuberay/kuberay-operator \ --namespace ${NAMESPACE} \ --set singleNamespaceInstall=true --set "watchNamespace={${NAMESPACE}}"
Configura le mappature di rete (solo GKE Standard - A4 e A3 Ultra)
A4 e A3 Ultra
Autopilot
Questo passaggio è obbligatorio per le configurazioni GPU GKE Standard (solo A4 e A3 Ultra). Se utilizzi A4X (GB200), GKE gestisce automaticamente le interfacce di rete, quindi salta questa sezione.
Standard
Esamina il manifest
network-mapping.yaml:Applica il manifest:
A4X
Questo passaggio è obbligatorio per le configurazioni GPU GKE Standard (solo A4 e A3 Ultra). Se utilizzi A4X (GB200), GKE gestisce le interfacce di rete automaticamente, quindi salta questa sezione.
Prepara dati e spazio di archiviazione
Configura le risorse Cloud Storage e Kubernetes:
Crea un bucket Cloud Storage:
Crea un service account Kubernetes (KSA) e associalo al bucket:
Crea il secret per Hugging Face:
Controlla il manifest
gcsfuse-storage.yaml:Applica il manifest:
Configurare DRANET
Configura DRANET:
A4 e A3 Ultra
Autopilot
Crea il manifest ComputeClass:
Applica sia il manifest
computeclass-dranet.yaml(creato nel passaggio precedente) sia il manifestresourceclaim-dranet.yaml(incluso nel repository di esempio):
Standard
Non è richiesta alcuna configurazione DRANET. Puoi procedere direttamente alla sezione successiva.
A4X
DRANET è impostato da Cluster Toolkit. Puoi procedere direttamente alla sezione successiva.
Prepara il modello e i dati
Completa il bucket Cloud Storage con i pesi e i set di dati del modello. Puoi eseguire questi comandi localmente o su un pod GKE per compilare il bucket:
A4 e A3 Ultra
Autopilot
Esamina il manifest
data-prep-job.yaml, che configura il job di preparazione dei dati:Avvia il job:
Controlla lo stato del pod:
Dopo che il pod
data-prep-jobha raggiunto lo statoRunning, premi Ctrl+C per interrompere il monitoraggio.Monitora il job:
Il comando
kubectl logsrestituisce un output minimo o nullo finché il pod non raggiunge lo statoRunning.
Standard
Esamina il manifest
data-prep-job.yaml, che configura il job di preparazione dei dati:Avvia il job:
Monitora il job:
A4X
Clona il repository verl, prepara l'ambiente virtuale ed elabora il set di dati GSM8K:
git clone https://github.com/volcengine/verl.git git -C verl checkout ${VERL_REF} VENV_DIR=.venv python3 -m venv $VENV_DIR source $VENV_DIR/bin/activate pip install verl python verl/examples/data_preprocess/gsm8k.py --local_save_dir ~/data/gsm8kScarica il modello Qwen2.5-32B-Instruct utilizzando Hugging Face CLI (questo download richiede circa 66 GB di spazio su disco):
hf download Qwen/Qwen2.5-32B-Instruct --local-dir Qwen2.5-32B-InstructCarica il modello, i dati e il codice di verifica nel bucket Cloud Storage:
gcloud storage cp --recursive verl gs://${GS_BUCKET}/verl gcloud storage cp --recursive Qwen2.5-32B-Instruct gs://${GS_BUCKET}/Qwen2.5-32B-Instruct gcloud storage cp --recursive ~/data/gsm8k/* gs://${GS_BUCKET}/gsm8k/
Esegui il deployment della risorsa personalizzata RayCluster
Esegui il deployment di una risorsa personalizzata RayCluster, composta da un pod head di sistema e da più pod worker supportati da GPU.
A4 e A3 Ultra
Seleziona la modalità cluster GKE che hai utilizzato per creare il cluster:
Autopilot
Ispeziona il workload RayCluster:
Applica il RayCluster:
Standard
Ispeziona il workload RayCluster:
Applica il RayCluster:
A4X
Crea
ResourceClaimTemplateRDMA eComputeDomainNVIDIA. Ogni pod worker GPU richiede quattro NIC RDMA (tutti i rail del nodo) e un canale IMEX. Salva il seguente manifest incompute-domain-a4x.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: verl-rdma-nic namespace: ${NAMESPACE} spec: spec: devices: requests: - name: nic exactly: deviceClassName: mrdma.google.com allocationMode: ExactCount count: 1 --- apiVersion: resource.nvidia.com/v1beta1 kind: ComputeDomain metadata: name: verl-compute-domain namespace: ${NAMESPACE} spec: numNodes: ${NUM_GPU_NODES} channel: resourceClaimTemplate: name: verl-compute-domain-channelApplica il manifest:
kubectl apply -f compute-domain-a4x.yamlEsegui il deployment del RayCluster. Il pod head di Ray viene eseguito su un nodo A4X senza richiedere GPU (poiché l'immagine è solo per
arm64). Salva le seguenti configurazioni inray-cluster-a4x.yaml:apiVersion: ray.io/v1 kind: RayCluster metadata: name: gb200-ray-cluster namespace: ${NAMESPACE} spec: rayVersion: '2.49.0' headGroupSpec: rayStartParams: dashboard-host: '0.0.0.0' num-cpus: "0" template: metadata: annotations: gke-gcsfuse/volumes: "true" spec: serviceAccountName: ${KSA_NAME} nodeSelector: cloud.google.com/gke-accelerator: nvidia-gb200 tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule - key: kubernetes.io/arch operator: Exists effect: NoSchedule containers: - name: ray-head image: ${VERL_IMAGE} lifecycle: postStart: exec: command: - /bin/bash - -c - pip3 install --quiet TransferQueue==0.1.8 ports: - containerPort: 6379 name: gcs-server - containerPort: 8265 name: dashboard - containerPort: 10001 name: client resources: limits: cpu: "12" memory: 32Gi ephemeral-storage: 20Gi requests: cpu: "12" memory: 32Gi ephemeral-storage: 20Gi volumeMounts: - mountPath: /tmp/ray name: ray-logs - name: training-bucket-vol mountPath: /data volumes: - name: ray-logs emptyDir: {} - name: training-bucket-vol persistentVolumeClaim: claimName: training-bucket-pvc workerGroupSpecs: - replicas: ${NUM_GPU_NODES} minReplicas: ${NUM_GPU_NODES} maxReplicas: ${NUM_GPU_NODES} groupName: gpu-group rayStartParams: num-cpus: "120" template: metadata: annotations: gke-gcsfuse/volumes: "true" spec: serviceAccountName: ${KSA_NAME} nodeSelector: cloud.google.com/gke-accelerator: nvidia-gb200 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: ray.io/group: gpu-group topologyKey: kubernetes.io/hostname tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule - key: kubernetes.io/arch operator: Exists effect: NoSchedule containers: - name: ray-worker image: ${VERL_IMAGE} lifecycle: postStart: exec: command: - /bin/bash - -c - pip3 install --quiet TransferQueue==0.1.8 env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64 resources: limits: cpu: "120" memory: 600Gi nvidia.com/gpu: "4" ephemeral-storage: 500Gi requests: cpu: "120" memory: 600Gi nvidia.com/gpu: "4" ephemeral-storage: 500Gi claims: - name: rdma-nic-0 - name: rdma-nic-1 - name: rdma-nic-2 - name: rdma-nic-3 - name: compute-domain-channel volumeMounts: - name: nvidia mountPath: /usr/local/nvidia - name: gib mountPath: /usr/local/gib - name: shared-memory mountPath: /dev/shm - name: ray-tmp-storage mountPath: /tmp - name: training-bucket-vol mountPath: /data resourceClaims: - name: rdma-nic-0 resourceClaimTemplateName: verl-rdma-nic - name: rdma-nic-1 resourceClaimTemplateName: verl-rdma-nic - name: rdma-nic-2 resourceClaimTemplateName: verl-rdma-nic - name: rdma-nic-3 resourceClaimTemplateName: verl-rdma-nic - name: compute-domain-channel resourceClaimTemplateName: verl-compute-domain-channel volumes: - name: gib hostPath: path: /home/kubernetes/bin/gib - name: nvidia hostPath: path: /home/kubernetes/bin/nvidia - name: shared-memory emptyDir: medium: Memory sizeLimit: 200Gi - name: ray-tmp-storage emptyDir: {} - name: training-bucket-vol persistentVolumeClaim: claimName: training-bucket-pvcApplica il manifest RayCluster:
envsubst < ray-cluster-a4x.yaml | kubectl apply -f -Attendi finché un pod head e quattro pod worker non sono nello stato
Running:kubectl get pods -w
Avvia il job GRPO
Configura e invia il job di addestramento per l'apprendimento per rinforzo:
A4 e A3 Ultra
Seleziona la modalità cluster GKE che hai utilizzato per creare il cluster:
Autopilot
Configura Ray Client:
Recupera il servizio head Ray:
Configura il port forwarding al nodo della dashboard Ray. Il processo viene eseguito in background, quindi puoi continuare a eseguire comandi nella stessa sessione del terminale.
Per interrompere il ciclo di port forwarding, utilizza il comando
kill ${PF_LOOP_PID}.Esamina il manifest
runtime-env.yaml:Se utilizzi GPU H200, modifica il valore della variabile di ambiente
NCCL_CONF_FILEin/usr/local/gib/configs/nccl.a3u.conf.Questo file viene utilizzato dal client Ray. Non devi applicare questo manifest al cluster.
Invia il job utilizzando il comando
ray job submit:Monitora i log del job di addestramento e cerca la metrica
critic/score/meanin aumento, il che indica che il modello sta apprendendo:- Dashboard di Ray:
- Apri
http://localhost:8265nel browser. Se utilizzi Cloud Shell, fai clic su Anteprima web, seleziona Cambia porta e inserisci8265. - Vai alla scheda Job.
- Fai clic sull'ID job.
- Filtra i log in base alla parola chiave
criticper ispezionarecritic/score/mean.
- Apri
Terminale: poiché il job viene inviato in modo asincrono con il flag
--no-wait, trasmetti in streaming i log del job nel terminale eseguendo questo comando:
- Dashboard di Ray:
Al termine dell'addestramento, verifica che i checkpoint del modello siano stati salvati nel bucket Cloud Storage elencando i contenuti della directory:
In alternativa, visualizza i checkpoint nella console Google Cloud andando su Cloud Storage > Bucket, selezionando
YOUR_GCS_BUCKETe aprendo la cartellaverl/checkpoints.
Standard
Configura il client Ray:
Recupera il servizio head Ray:
Configura il port forwarding al nodo della dashboard di Ray. Il processo viene eseguito in background, quindi puoi continuare a eseguire comandi nella stessa sessione del terminale.
Per interrompere il ciclo di port forwarding, utilizza il comando
kill ${PF_PID}.Esamina il manifest
runtime-env.yaml:Se utilizzi GPU H200, modifica il valore della variabile di ambiente
NCCL_TUNER_CONFIG_PATHin/usr/local/gib/configs/tuner_config_a3u.txtpb.Questo file viene utilizzato dal client Ray. Non è necessario applicare questo manifest al cluster.
Invia il job:
Monitora i log del job di addestramento e cerca la metrica
critic/score/meanin aumento, il che indica che il modello sta apprendendo:- Dashboard di Ray:
- Apri
http://localhost:8265nel browser. Se utilizzi Cloud Shell, fai clic su Anteprima web, seleziona Cambia porta e inserisci8265. - Vai alla scheda Job.
- Fai clic sull'ID job.
- Filtra i log in base alla parola chiave
criticper esaminare la metricacritic/score/mean.
- Apri
Output della console: poiché il job viene inviato in modo asincrono con il flag
--no-wait, trasmetti i log del job in streaming nel terminale eseguendo questo comando:
- Dashboard di Ray:
Al termine dell'addestramento, verifica che i checkpoint del modello siano stati salvati nel bucket Cloud Storage elencando i contenuti della directory:
In alternativa, visualizza i checkpoint nella console Google Cloud andando su Cloud Storage > Bucket, selezionando
YOUR_GCS_BUCKETe aprendo la cartellaverl/checkpoints.
A4X
Ottieni il nome del pod della testa di Ray:
export HEAD_POD=$(kubectl get pod -n ${NAMESPACE} -l ray.io/node-type=head -o jsonpath='{.items[0].metadata.name}')Configura il file dell'ambiente di runtime Ray direttamente nel pod head:
kubectl exec ${HEAD_POD} -c ray-head -- bash -c 'mkdir -p /tmp/submit && cat > /tmp/submit/runtime-env.yaml <<EOF working_dir: "." env_vars: PYTHONPATH: "/data/verl" LD_LIBRARY_PATH: "/usr/local/nvidia/lib64:/usr/local/gib/lib64" NCCL_DEBUG: "INFO" NCCL_ENV_PLUGIN: "gcp" HF_HOME: "/data/huggingface_cache" GLOO_SOCKET_IFNAME: "eth0" EOF'Invia il job di addestramento GRPO eseguendolo sul pod di intestazione Ray:
kubectl exec ${HEAD_POD} -c ray-head -- bash -c 'cd /tmp/submit && \ ray job submit --runtime-env runtime-env.yaml --no-wait -- \ python3 -m verl.trainer.main_ppo \ algorithm.adv_estimator=grpo \ data.train_files=/data/gsm8k/train.parquet \ data.val_files=/data/gsm8k/test.parquet \ data.train_batch_size=256 \ data.max_prompt_length=512 \ data.max_response_length=512 \ actor_rollout_ref.model.path=/data/Qwen2.5-32B-Instruct \ actor_rollout_ref.actor.optim.lr=1e-5 \ actor_rollout_ref.actor.ppo_mini_batch_size=64 \ actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=8 \ actor_rollout_ref.actor.use_kl_loss=True \ actor_rollout_ref.actor.strategy=fsdp2 \ actor_rollout_ref.rollout.name=vllm \ actor_rollout_ref.rollout.tensor_model_parallel_size=4 \ actor_rollout_ref.rollout.gpu_memory_utilization=0.6 \ actor_rollout_ref.rollout.n=8 \ actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=16 \ actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=16 \ algorithm.kl_ctrl.kl_coef=0.001 \ trainer.logger=console \ trainer.n_gpus_per_node=4 \ trainer.nnodes=4 \ trainer.save_freq=10 \ trainer.test_freq=10 \ trainer.total_epochs=2 \ trainer.default_local_dir=/data/verl/checkpoints'Monitora i log del job (utilizzando l'ID univoco restituito da
ray job submit):kubectl exec ${HEAD_POD} -c ray-head -- ray job logs <var>JOB_ID</var> --followSostituisci
JOB_ID. Verifica che NVLink tra nodi sia attivo cercando le righe NCCL nei log contenentivia P2P/MNNVL.
Esegui la pulizia
Per evitare che ti vengano addebitati dei costi, elimina le risorse:
A4 e A3 Ultra
Autopilot
Se il ciclo di port forwarding è ancora in esecuzione nella sessione in background, termina:
Elimina il cluster Ray:
Elimina Cloud Storage FUSE:
Elimina le risorse DRANET:
Elimina il bucket Cloud Storage:
Elimina il cluster GKE:
Standard
Se il loop di port forwarding è ancora in esecuzione nella sessione in background, terminalo:
Elimina il cluster Ray:
Elimina Cloud Storage FUSE:
Elimina il bucket Cloud Storage:
Elimina il cluster GKE:
Elimina le reti e le subnet VPC:
A4X
kubectl delete raycluster gb200-ray-cluster
kubectl delete computedomain verl-compute-domain
gcloud storage rm -r gs://${GS_BUCKET}
gcloud container clusters delete ${CLUSTER_NAME} --location=${CONTROL_PLANE_REGION}
Passaggi successivi
- Scopri di più su Ray su GKE
- Scopri di più sulla creazione di cluster A4X su GKE
- Esplora la documentazione di verl