In dieser Anleitung erfahren Sie, wie Sie eine verteilte Trainingsumgebung für Reinforcement Learning in Google Kubernetes Engine (GKE) orchestrieren. Sie verwenden Ray und das verl-Framework (Volcano Engine Reinforcement Learning), um eine Umgebung für verteiltes Training einzurichten und ein Qwen2.5-32B-Instruct-Modell für das GSM8K-Dataset abzustimmen.
In dieser Anleitung geht es um die Trainingspipeline für die gruppenbezogene relative Richtlinienoptimierung (Group Relative Policy Optimization, GRPO) in GKE mit Ray und verl. GRPO ist ein Reinforcement-Learning-Algorithmus, der die Fähigkeit eines Modells zum logischen Denken verbessern soll. Dieser speichereffiziente Algorithmus vereinfacht den Prozess des bestärkenden Lernens (Reinforcement Learning, RL), indem der Critic oder das Wertmodell entfernt und stattdessen eine relative gruppenbasierte Berechnung verwendet wird.
Dieses Tutorial ist ein guter Ausgangspunkt, wenn Sie eine Umgebung für verteiltes Training einrichten müssen, in der Daten, Modellgewichte und die Trainings-Engine zur Effizienzsteigerung entkoppelt sind.
Diese Anleitung unterstützt die folgenden GPU-Architekturen:
- GPU-Knoten auf Intel- oder AMD-Basis: Einrichten und skalieren mit NVIDIA B200- oder H200-GPUs über die dynamische Ressourcenzuweisung (Dynamic Resource Allocation, DRA) von GKE für den Autopilot-Pfad.
- Arm-basierte A4X-Knoten (GB200): Einrichten und skalieren mit NVIDIA GB200 Grace Blackwell-Superchips mit dynamischer Ressourcenzuweisung (Dynamic Resource Allocation, DRA) von GKE und Multi-Node NVLink (IMEX).
Hintergrund
In den folgenden Abschnitten erhalten Sie einen kurzen Überblick über die in diesem Tutorial verwendeten Konzepte.
Bestärkendes Lernen (Reinforcement Learning, RL)
Beim bestärkenden Lernen werden Modelle durch Erfahrung, Erkundung und Feedback trainiert, anstatt durch statische Imitation. Beim Vortraining wird einem Modell beigebracht, was es sagen soll. Beim bestärkenden Lernen durch menschliches Feedback (Reinforcement Learning from Human Feedback, RLHF) wird ihm beigebracht, wie es hilfreich, sicher und logisch sein kann. RL dient als Brücke zwischen einem Basismodell und einem feinabgestimmten Modell für einen speziellen Anwendungsfall.
Weitere Informationen finden Sie unter Was ist bestärkendes Lernen?
Gruppenbezogene relative Richtlinienoptimierung (Group Relative Policy Optimization, GRPO)
GRPO, ein von DeepSeek entwickelter Algorithmus, bietet eine speichereffiziente Alternative zu Proximal Policy Optimization (PPO) für die LLM-Abstimmung, da das Critic-Modell entfernt wird. Anstelle eines Critic-Netzwerks generiert GRPO eine Gruppe von Antworten für denselben Prompt und verwendet die durchschnittliche Belohnung dieser Gruppe als Baseline.
Weitere Informationen finden Sie unter GRPO.
Volcano Engine Reinforcement Learning (VERL)
verl ist ein leistungsstarkes Framework, das für die komplexen Speicher- und Rechenmuster von LLM-basiertem RL entwickelt wurde.
Weitere Informationen finden Sie unter verl.
Ziele
In dieser Anleitung erfahren Sie, wie Sie mit verl Reinforcement Learning in GKE einrichten. Dazu führen Sie die folgenden Schritte aus:
- Richten Sie einen GKE-Cluster mit A4X-Superchips (GB200), A4-GPUs (B200) oder A3 Ultra-GPUs (H200) ein.
- KubeRay zum Verwalten eines verteilten Ray-Clusters konfigurieren
- Cloud Storage FUSE verwenden, um einen Cloud Storage-Bucket auf allen Knoten bereitzustellen
- Führen Sie einen GRPO-Trainingsjob mit verl aus, um das Modell Qwen2.5-32B-Instruct mit dem GSM8K-Dataset abzustimmen.
Hinweis
- Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie einfach ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
Installieren Sie die Google Cloud CLI.
-
Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init -
Google Cloud Projekt erstellen oder auswählen
Erforderliche Rollen zum Auswählen oder Erstellen eines Projekts
- Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können jedes Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
-
Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Project Creator“ (
roles/resourcemanager.projectCreator), die die Berechtigungresourcemanager.projects.createenthält. Informationen zum Zuweisen von Rollen
-
So erstellen Sie ein Google Cloud Projekt:
gcloud projects create PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch einen Namen für das Google Cloud Projekt, das Sie erstellen. -
Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:
gcloud config set project PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch Ihren Google Cloud Projektnamen.
-
Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Projekt aktiviert ist.
Aktivieren Sie die erforderlichen APIs, falls noch nicht geschehen:
Rollen, die zum Aktivieren von APIs erforderlich sind
Zum Aktivieren von APIs benötigen Sie die Berechtigung
serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Rolle „Inhaber“ (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollengcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Installieren Sie die Google Cloud CLI.
-
Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init -
Google Cloud Projekt erstellen oder auswählen
Erforderliche Rollen zum Auswählen oder Erstellen eines Projekts
- Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können jedes Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
-
Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Project Creator“ (
roles/resourcemanager.projectCreator), die die Berechtigungresourcemanager.projects.createenthält. Informationen zum Zuweisen von Rollen
-
So erstellen Sie ein Google Cloud Projekt:
gcloud projects create PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch einen Namen für das Google Cloud Projekt, das Sie erstellen. -
Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:
gcloud config set project PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch Ihren Google Cloud Projektnamen.
-
Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Projekt aktiviert ist.
Aktivieren Sie die erforderlichen APIs, falls noch nicht geschehen:
Rollen, die zum Aktivieren von APIs erforderlich sind
Zum Aktivieren von APIs benötigen Sie die Berechtigung
serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Rolle „Inhaber“ (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollengcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Weisen Sie Ihrem Nutzerkonto Rollen zu. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus:
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
Ersetzen Sie Folgendes:
PROJECT_ID: Ihre Projekt-ID.USER_IDENTIFIER: Die Kennung für Ihr Nutzerkonto . Beispiel:myemail@example.comROLE: Die IAM-Rolle, die Sie Ihrem Nutzerkonto zuweisen.
- Erstellen Sie ein Hugging Face-Konto, falls Sie noch keines haben.
- Sie benötigen ein Hugging Face-Token.
- Prüfen Sie, ob Ihr Projekt ein ausreichendes Kontingent für A4X-Superchips (GB200), A4-GPUs (B200) oder A3 Ultra-GPUs (H200) hat. Weitere Informationen finden Sie unter GPU-Kontingent planen und GPU-Kontingent.
- Achten Sie darauf, dass Sie eine aktive Kapazitätsreservierung für Ihren GPU-Maschinentyp haben. Weitere Informationen finden Sie unter Kapazität über Ihr Account-Management-Team reservieren.
- Für die Einrichtung von A4X (GB200) muss Helm installiert sein.
Umgebung vorbereiten
In dieser Anleitung verwenden Sie Cloud Shell.
Rufen Sie die Google Cloud Console auf.
Klicken Sie oben im Google Cloud Console-Fenster auf den Button Cloud Shell aktivieren.
Legen Sie die Umgebungsvariablen fest:
A4 und 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=ddbcdb7Ersetzen Sie die folgenden Werte:
YOUR_REGION: die Compute Engine-Region für die GKE-Cluster-Steuerungsebene.YOUR_ZONE: die Zone, in der die Knoten reserviert sind. Weitere Informationen finden Sie unter GPU-Verfügbarkeit.YOUR_CLUSTER_NAME: Name Ihres GKE-Clusters.YOUR_KSA_NAME: der Name Ihres Kubernetes-Dienstkontos.YOUR_GCS_BUCKET: Der Basisname für Ihren Cloud Storage-Bucket. Sie müssen das Präfixgs://nicht angeben.YOUR_GPU_TYPE: der Beschleuniger, den Sie in der Compute Engine-Kapazitätsreservierung reserviert haben. Es muss einer der folgenden Werte sein:nvidia-gb200: A4X (GB200-Superchips)nvidia-b200: A4 (B200-GPUs)nvidia-h200-141gb: A3 Ultra (H200-GPUs)
YOUR_MACHINE_TYPE: der zu verwendende Maschinentyp:- Verwenden Sie für A4X (GB200-Superchips)
a4x-highgpu-4g. - Verwenden Sie für A4-GPUs (B200)
a4-highgpu-8goder höher. - Für A3 Ultra (H200-GPUs) verwenden Sie
a3-ultragpu-8goder höher.
- Verwenden Sie für A4X (GB200-Superchips)
YOUR_CPU_MACHINE_TYPE: Der Compute Engine-Maschinentyp für den CPU-Standardknotenpool. Verwenden Sie einenhighmem-Maschinentyp mit mindestens 16 vCPUs, der in Ihrer Clusterzone unterstützt wird, z. B.n4-highmem-16odern2d-highmem-16.YOUR_RESERVATION_NAME: Der Name Ihrer Kapazitätsreservierung.YOUR_HF_TOKEN: Ihr Hugging Face-Token.- Verwenden Sie die folgenden Variablen, wenn Sie Ihre Umgebung in GKE-Standardclustern einrichten:
YOUR_GVNIC_NAME(nur A4 oder A3 Ultra): Das Präfix für den gVNIC-Netzwerknamen. Sie können ein beliebiges Präfix verwenden.YOUR_RDMA_NAME(nur A4 oder A3 Ultra): Das Präfix für das RDMA-Netzwerk (Remote Direct Memory Access). Sie können ein beliebiges Präfix verwenden.
Klonen Sie das Beispiel-Repository:
Wechseln Sie zum Arbeitsverzeichnis für den ausgewählten GKE-Modus:
A4 und A3 Ultra
Autopilot
Standard
A4X
Es ist keine Änderung des Verzeichnisses erforderlich. Sie können direkt mit dem nächsten Abschnitt fortfahren.
Infrastruktur einrichten
In diesem Abschnitt erstellen Sie Standard-VPC-Netzwerke und den GKE-Cluster.
RDMA-Netzwerk und ‑Subnetze erstellen (nur GKE Standard – A4 und A3 Ultra)
A4 und A3 Ultra
Autopilot
Dieser Abschnitt ist nur für GKE Standard A4- und A3 Ultra-GPUs erforderlich.
Wenn Sie Autopilot verwenden, überspringen Sie diesen Abschnitt und fahren Sie direkt mit GKE-Cluster erstellen fort. GKE stellt automatisch die erforderlichen VPC-Netzwerke und ‑Subnetze bereit und verwendet GKE-verwaltetes DRANET, um diese Ressourcen Ihren Pods zuzuweisen. Sie müssen keine Netzwerkinfrastruktur manuell erstellen.
Standard
VPC-Netzwerk für die gVNIC-Schnittstelle erstellen:
VPC-Netzwerk für RDMA erstellen:
Erstellen Sie die 8 RDMA-Subnetze für die 8 GPUs:
A4X
Dieser Abschnitt ist nur für GKE Standard A4- und A3 Ultra-GPUs erforderlich.
Wenn Sie A4X-GPUs (GB200) verwenden, überspringen Sie diesen Abschnitt und fahren Sie direkt mit GKE-Cluster erstellen fort. Bei A4X-GPUs (GB200) oder Autopilot erstellt GKE die Netzwerke automatisch, wenn der Knotenpool das auto-Beschleunigernetzwerkprofil verwendet. Das Cluster Toolkit-Blueprint aktiviert dieses Profil mit dem Flag enable_dranet:true.
GKE-Cluster erstellen
Erstellen Sie einen GKE-Cluster, der Ihrer GPU-Architektur entspricht:
A4 und A3 Ultra
Wählen Sie den gewünschten GKE-Clustermodus aus:
Autopilot
Autopilot-Cluster erstellen:
Rufen Sie Anmeldedaten für Ihren Cluster ab:
Standard
Standardcluster erstellen:
Rufen Sie Anmeldedaten für Ihren Cluster ab:
Erstellen Sie den GPU-Knotenpool. Diese Knotenpools verwenden Ihre Reservierung, um die Verfügbarkeit zu gewährleisten. Sie beginnen mit zwei Knoten:
Installieren Sie das NCCL RDMA-Installationsprogramm, das für Standardcluster verwendet wird:
A4X
Erstellen Sie einen GKE-Cluster und einen Knotenpool mit dem Cluster Toolkit
gke-a4x-Blueprint. Mit dem Blueprint wird der GKE-Cluster bereitgestellt, einschließlich des A4X-Knotenpools, der an Ihre Reservierung gebunden ist, der Beschleunigernetzwerke (ein zusätzliches gVNIC plus vier RDMA-Rails) und des verwalteten DRANET-Treibers, der die CX-7-NICs als DRA-Geräte verfügbar macht.Konfigurieren Sie die Parameter (z. B.
PROJECT_ID,CONTROL_PLANE_REGION,NODE_ZONE, Reservierung undNUM_GPU_NODES) anhand der Bereitstellungsanleitung des Blueprints und stellen Sie dann den Cluster bereit. Alternativ können Sie einen Cluster auch manuell erstellen. Folgen Sie dazu der Anleitung zum Erstellen eines GKE-Cluster-Clusters.- Rufen Sie Anmeldedaten für Ihren Cluster ab:
gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${CONTROL_PLANE_REGION}Prüfen Sie, ob der Cluster RDMA-NICs über DRA bereitstellt:
kubectl get deviceclassesDie Ausgabe muss
mrdma.google.comenthalten.Prüfen Sie, ob die A4X-Knoten vorhanden sind:
kubectl get nodes -l cloud.google.com/gke-accelerator=nvidia-gb200Installieren Sie das gIB NCCL-Plug-in (A4X-Variante):
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-rdma/nccl-rdma-installer-a4x.yamlInstallieren Sie den NVIDIA DRA-Treiber, der
ComputeDomain-Kanäle (IMEX) für Multi-Node-NVLink bereitstellt: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=ExistsInstallieren Sie den KubeRay-Operator, der auf den Arbeitslast-Namespace beschränkt ist:
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}}"
Netzwerkzuordnungen konfigurieren (nur GKE Standard – A4 und A3 Ultra)
A4 und A3 Ultra
Autopilot
Dieser Schritt ist nur für GKE Standard-GPU-Konfigurationen (nur A4 und A3 Ultra) erforderlich. Wenn Sie A4X (GB200) verwenden, verwaltet GKE Netzwerkschnittstellen automatisch. Überspringen Sie diesen Abschnitt.
Standard
Prüfen Sie das
network-mapping.yaml-Manifest:Wenden Sie das Manifest an:
A4X
Dieser Schritt ist nur für GKE Standard-GPU-Konfigurationen (nur A4 und A3 Ultra) erforderlich. Wenn Sie A4X (GB200) verwenden, verwaltet GKE die Netzwerkschnittstellen automatisch. Überspringen Sie diesen Abschnitt.
Daten und Speicher vorbereiten
Cloud Storage- und Kubernetes-Ressourcen konfigurieren:
Erstellen Sie einen Cloud Storage-Bucket:
Erstellen Sie ein Kubernetes-Dienstkonto (KSA) und binden Sie es an den Bucket:
Secret für Hugging Face erstellen:
Prüfen Sie das
gcsfuse-storage.yaml-Manifest:Wenden Sie das Manifest an:
DRANET einrichten
DRANET konfigurieren:
A4 und A3 Ultra
Autopilot
Erstellen Sie das ComputeClass-Manifest:
Wenden Sie sowohl das
computeclass-dranet.yaml-Manifest (das Sie im vorherigen Schritt erstellt haben) als auch dasresourceclaim-dranet.yaml-Manifest (das im Beispiel-Repository enthalten ist) an:
Standard
Es ist keine DRANET-Einrichtung erforderlich. Sie können direkt mit dem nächsten Abschnitt fortfahren.
A4X
DRANET wird vom Cluster Toolkit festgelegt. Sie können direkt mit dem nächsten Abschnitt fortfahren.
Modell und Daten vorbereiten
Füllen Sie Ihren Cloud Storage-Bucket mit den Modellgewichten und Datasets. Sie können diese Befehle lokal oder in einem GKE-Pod ausführen, um den Bucket zu füllen:
A4 und A3 Ultra
Autopilot
Sehen Sie sich das
data-prep-job.yaml-Manifest an, mit dem der Job zur Datenaufbereitung konfiguriert wird:Starten Sie den Job:
Prüfen Sie den Pod-Status:
Sobald der
data-prep-job-Pod den StatusRunningerreicht hat, drücken Sie Strg+C, um die Wiedergabe zu beenden.Job überwachen:
Der Befehl
kubectl logsgibt erst dann eine Ausgabe zurück, wenn der Pod den StatusRunningerreicht hat.
Standard
Sehen Sie sich das
data-prep-job.yaml-Manifest an, mit dem der Job zur Datenvorbereitung konfiguriert wird:Job starten:
Job überwachen:
A4X
Klonen Sie das verl-Repository, bereiten Sie die virtuelle Umgebung vor und verarbeiten Sie das GSM8K-Dataset:
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/gsm8kLaden Sie das Modell Qwen2.5-32B-Instruct mit der Hugging Face-CLI herunter. Für diesen Download sind etwa 66 GB Speicherplatz erforderlich:
hf download Qwen/Qwen2.5-32B-Instruct --local-dir Qwen2.5-32B-InstructLaden Sie das Modell, die Daten und den verl-Code in Ihren Cloud Storage-Bucket hoch:
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/
Benutzerdefinierte RayCluster-Ressource bereitstellen
Stellen Sie eine benutzerdefinierte RayCluster-Ressource bereit, die aus einem System-Head-Pod und mehreren GPU-gestützten Worker-Pods besteht.
A4 und A3 Ultra
Wählen Sie den GKE-Clustermodus aus, den Sie zum Erstellen des Clusters verwendet haben:
Autopilot
RayCluster-Arbeitslast prüfen:
Wenden Sie den RayCluster an:
Standard
RayCluster-Arbeitslast prüfen:
Wenden Sie den RayCluster an:
A4X
Erstellen Sie das RDMA-
ResourceClaimTemplateund das NVIDIA-ComputeDomain. Jeder GPU-Worker-Pod beansprucht vier RDMA-NICs (alle Rails des zugehörigen Knotens) und einen IMEX-Channel. Speichern Sie das folgende Manifest untercompute-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-channelWenden Sie das Manifest an:
kubectl apply -f compute-domain-a4x.yamlStellen Sie den Ray-Cluster bereit. Der Ray-Head-Pod wird auf einem A4X-Knoten ausgeführt, ohne GPUs anzufordern, da das Image nur
arm64ist. Speichern Sie die folgenden Konfigurationen 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-pvcWenden Sie das RayCluster-Manifest an:
envsubst < ray-cluster-a4x.yaml | kubectl apply -f -Warten Sie, bis sich ein Head-Pod und vier Worker-Pods im Status
Runningbefinden:kubectl get pods -w
GRPO-Job starten
Konfigurieren und senden Sie den Trainingsjob für bestärkendes Lernen:
A4 und A3 Ultra
Wählen Sie den GKE-Clustermodus aus, den Sie zum Erstellen des Clusters verwendet haben:
Autopilot
Ray Client einrichten:
Ray-Head-Dienst wiederherstellen:
Richten Sie die Portweiterleitung zum Ray-Dashboard-Knoten ein. Der Prozess wird im Hintergrund ausgeführt, sodass Sie weiterhin Befehle in derselben Terminalsitzung ausführen können.
Verwenden Sie den Befehl
kill ${PF_LOOP_PID}, um die Portweiterleitungsschleife zu beenden.Prüfen Sie das
runtime-env.yaml-Manifest:Wenn Sie H200-GPUs verwenden, ändern Sie den Wert der Umgebungsvariable
NCCL_CONF_FILEin/usr/local/gib/configs/nccl.a3u.conf.Diese Datei wird vom Ray-Client verwendet. Sie müssen dieses Manifest nicht auf den Cluster anwenden.
Senden Sie den Job mit dem Befehl
ray job submit:Behalten Sie die Logs des Trainingsjobs im Blick und achten Sie darauf, dass der
critic/score/mean-Messwert steigt. Das deutet darauf hin, dass das Modell lernt:- Ray-Dashboard:
- Öffnen Sie
http://localhost:8265in Ihrem Browser. Wenn Sie Cloud Shell verwenden, klicken Sie auf Webvorschau, wählen Sie Port ändern aus und geben Sie8265ein. - Rufen Sie den Tab Jobs auf.
- Klicken Sie auf Ihre Job-ID.
- Filtern Sie die Logs nach dem Keyword
critic, umcritic/score/meanzu prüfen.
- Öffnen Sie
Terminal: Da der Job asynchron mit dem Flag
--no-waitgesendet wird, können Sie Joblogs im Terminal streamen, indem Sie den folgenden Befehl ausführen:
- Ray-Dashboard:
Prüfen Sie nach Abschluss des Trainings, ob die Modellprüfpunkte in Ihrem Cloud Storage-Bucket gespeichert wurden. Listen Sie dazu den Verzeichnisinhalt auf:
Alternativ können Sie die Prüfpunkte in der Google Cloud Console ansehen. Rufen Sie dazu Cloud Storage > Buckets auf, wählen Sie
YOUR_GCS_BUCKETaus und öffnen Sie den Ordnerverl/checkpoints.
Standard
Ray Client einrichten:
Ray-Head-Dienst wiederherstellen:
Richten Sie die Portweiterleitung zum Ray-Dashboard-Knoten ein. Der Prozess wird im Hintergrund ausgeführt, sodass Sie weiterhin Befehle in derselben Terminalsitzung ausführen können.
Verwenden Sie den Befehl
kill ${PF_PID}, um die Portweiterleitungsschleife zu beenden.Prüfen Sie das
runtime-env.yaml-Manifest:Wenn Sie H200-GPUs verwenden, ändern Sie den Wert der Umgebungsvariable
NCCL_TUNER_CONFIG_PATHin/usr/local/gib/configs/tuner_config_a3u.txtpb.Diese Datei wird vom Ray-Client verwendet. Sie müssen dieses Manifest nicht auf den Cluster anwenden.
Senden Sie den Job:
Behalten Sie die Logs des Trainingsjobs im Blick und achten Sie darauf, dass der
critic/score/mean-Messwert steigt. Das deutet darauf hin, dass das Modell lernt:- Ray-Dashboard:
- Öffnen Sie
http://localhost:8265in Ihrem Browser. Wenn Sie Cloud Shell verwenden, klicken Sie auf Webvorschau, wählen Sie Port ändern aus und geben Sie8265ein. - Rufen Sie den Tab Jobs auf.
- Klicken Sie auf Ihre Job-ID.
- Filtern Sie die Logs nach dem Keyword
critic, um den Messwertcritic/score/meanzu prüfen.
- Öffnen Sie
Konsolenausgabe: Da der Job asynchron mit dem Flag
--no-waitgesendet wird, können Sie die Joblogs in Ihrem Terminal streamen, indem Sie den folgenden Befehl ausführen:
- Ray-Dashboard:
Prüfen Sie nach Abschluss des Trainings, ob die Modellprüfpunkte in Ihrem Cloud Storage-Bucket gespeichert wurden. Listen Sie dazu den Verzeichnisinhalt auf:
Alternativ können Sie die Prüfpunkte in der Google Cloud Console ansehen. Rufen Sie dazu Cloud Storage > Buckets auf, wählen Sie
YOUR_GCS_BUCKETaus und öffnen Sie den Ordnerverl/checkpoints.
A4X
Rufen Sie den Namen des Ray-Head-Pods ab:
export HEAD_POD=$(kubectl get pod -n ${NAMESPACE} -l ray.io/node-type=head -o jsonpath='{.items[0].metadata.name}')Konfigurieren Sie die Ray-Laufzeitumgebungsdatei direkt im Head-Pod:
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'Senden Sie den GRPO-Trainingsjob, indem Sie ihn auf dem Ray-Head-Pod ausführen:
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'Joblogs überwachen (mit der eindeutigen ID, die von
ray job submitzurückgegeben wird):kubectl exec ${HEAD_POD} -c ray-head -- ray job logs <var>JOB_ID</var> --followErsetzen Sie
JOB_ID. Prüfen Sie, ob die NVLink-Verbindung zwischen Knoten aktiv ist. Suchen Sie dazu in Logs, dievia P2P/MNNVLenthalten, nach NCCL-Zeilen.
Bereinigen
Löschen Sie die Ressourcen, um Gebühren zu vermeiden:
A4 und A3 Ultra
Autopilot
Wenn die Portweiterleitungsschleife weiterhin in Ihrer Hintergrundsitzung ausgeführt wird, beenden Sie sie:
Ray-Cluster löschen:
Löschen Sie Cloud Storage FUSE:
Löschen Sie die DRANET-Ressourcen:
Löschen Sie den Cloud Storage-Bucket:
Löschen Sie den GKE-Cluster:
Standard
Wenn die Portweiterleitungsschleife immer noch in Ihrer Hintergrundsitzung ausgeführt wird, beenden Sie sie:
Ray-Cluster löschen:
Löschen Sie Cloud Storage FUSE:
Löschen Sie den Cloud Storage-Bucket:
Löschen Sie den GKE-Cluster:
Löschen Sie die VPC-Netzwerke und ‑Subnetze:
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}
Nächste Schritte
- Informationen zu Ray on GKE
- Informationen zum Erstellen von A4X-Clustern in GKE
- Dokumentation zu Verl ansehen