In dieser Anleitung erfahren Sie, wie Sie eine verteilte Trainingsumgebung für Reinforcement Learning (RL) in Google Kubernetes Engine (GKE) orchestrieren. Sie verwenden Ray und das NVIDIA NeMo RL-Framework, um eine verteilte Trainingsumgebung für die Feinabstimmung eines Modells einzurichten.
In dieser Anleitung geht es um die GRPO-Trainingspipeline (Group Relative Policy Optimization) in GKE mit Ray und NeMo RL. GRPO ist ein Reinforcement-Learning-Algorithmus, der die Fähigkeit eines Modells zum logischen Denken verbessern soll. Dieser speichereffiziente Algorithmus vereinfacht den RL-Prozess, indem er den Critic oder das Wertmodell eliminiert und stattdessen eine relative gruppenbasierte Berechnung verwendet.
Bevor Sie diese Anleitung durcharbeiten, sollten Sie die Anleitung Reinforcement Learning mit verl in GKE optimieren und skalieren durcharbeiten. In dieser Anleitung werden dieselbe Clustereinrichtung und -konfiguration wie in der Anleitung zur Feinabstimmung und Skalierung von RL mit verl verwendet.
Hintergrund
In den folgenden Abschnitten erhalten Sie einen kurzen Überblick über die in diesem Tutorial verwendeten Konzepte.
Bestärkendes Lernen (Reinforcement Learning, RL)
Beim RL lernen Modelle durch Erfahrung, Exploration und Feedback, anstatt statisch zu imitieren. 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 populär gemachter Algorithmus, bietet eine speichereffiziente Alternative zur Proximal Policy Optimization (PPO) für die LLM-Ausrichtung, indem 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.
NVIDIA NeMo RL
NeMo RL ist die Open-Source-Bibliothek von NVIDIA für das Post-Training, die für skalierbares RL entwickelt wurde. NeMo RL ist Teil des umfassenderen NeMo-Framework-Ökosystems und ermöglicht sowohl kleine Experimente auf einer einzelnen GPU als auch Bereitstellungen mit mehreren Knoten auf Tausenden von GPUs.
Weitere Informationen finden Sie unter NVIDIA NeMo RL.
GSM8k-Dataset
In dieser Anleitung verwenden Sie das GSM8k-Dataset, das 8.500 hochwertige, sprachlich vielfältige mathematische Textaufgaben für Grundschüler enthält.
Mit GSM8k und GRPO generiert das Modell n verschiedene Antworten auf dasselbe Problem. GRPO vergleicht diese Antworten mit dem Gruppendurchschnitt. Das Modell wird stärker für Pfade belohnt, die im Vergleich zum Rest der Gruppe durchgehend richtig und logisch sind. Im Laufe der Zeit lernt das Modell, dass es die Belohnung am zuverlässigsten maximiert, wenn es seine Schritte klar formuliert. Dadurch wird die Belohnung für Antworten mit geringer Leistung effektiv reduziert.
Weitere Informationen finden Sie unter GSM8k.
Ziele
In dieser Anleitung erfahren Sie, wie Sie RL in GKE mit NeMo RL einrichten. Dazu führen Sie die folgenden Schritte aus:
- Bereiten Sie Ihre Umgebung vor.
- Richten Sie einen GKE-Cluster mit B200- oder H200-GPUs ein.
- KubeRay zum Verwalten eines verteilten Ray-Clusters konfigurieren
- Verwenden Sie Managed Lustre für Hochleistungsspeicher.
- Führen Sie einen GRPO-Trainingsjob aus, der NeMo RL verwendet.
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 Projekt in Google Cloud 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 Inhaberrolle (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 servicenetworking.googleapis.com lustre.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 Projekt in Google Cloud 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 Inhaberrolle (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 servicenetworking.googleapis.com lustre.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/servicenetworking.networksAdmin, roles/compute.networkAdmin, roles/lustre.admingcloud 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 mit
read access. - Erstellen Sie ein Weights & Biases-Konto (Wandb), falls Sie noch keines haben.
- Wandb-API-Schlüssel erstellen
- Prüfen Sie, ob Ihr Google Cloud -Projekt ein ausreichendes Kontingent für B200- und H200-GPUs hat. Weitere Informationen finden Sie unter GPU-Kontingent planen und GPU-Kontingent.
- Prüfen Sie, ob Ihr Google Cloud -Projekt das erforderliche Kontingent für Managed Lustre hat. Weitere Informationen finden Sie unter Kontingente und Limits für Managed Lustre.
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 folgenden Umgebungsvariablen fest:
Ersetzen Sie die folgenden Werte:
YOUR_REGION: die Compute Engine-Region für die GKE-Cluster-Steuerungsebene.YOUR_ZONE: die Zone für Ihre Knoten. Wählen Sie eine Zone aus, in der NVIDIA B200- oder H200-GPUs verfügbar sind.YOUR_LUSTRE_ZONE: die Zone für Ihre Managed Lustre-Instanz. Wählen Sie eine Zone aus, in der Managed Lustre verfügbar ist. Um die Leistung zu verbessern, die Latenz zu verringern und Kosten für ausgehenden Netzwerktraffic zu vermeiden, verwenden Sie dieselbe Zone wieYOUR_ZONE.YOUR_CLUSTER_NAME: Name Ihres GKE-Clusters.YOUR_GPU_TYPE: der Beschleuniger, den Sie in der Compute Engine-Kapazitätsreservierung reserviert haben. Muss einer der folgenden Werte sein:nvidia-b200: NVIDIA B200 (180 GB)nvidia-h200-141gb: NVIDIA H200 (141 GB)
YOUR_MACHINE_TYPE: der zu verwendende Maschinentyp:- Verwenden Sie für NVIDIA B200-GPUs (180 GB)
a4-highgpu-8goder höher. - Für NVIDIA H200-GPUs (141 GB) verwenden Sie
a3-ultragpu-8goder höher.
- Verwenden Sie für NVIDIA B200-GPUs (180 GB)
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 GPU-Reservierung.YOUR_LUSTRE_NAME: der Name Ihrer Lustre-Instanz.YOUR_HF_TOKEN: Ihr Hugging Face-Token.YOUR_WANDB_API_KEY: Ihr Wandb-API-Schlüssel.
Erstellen Sie die folgenden Umgebungsvariablen für das Netzwerk:
Ersetzen Sie die folgenden Werte:
YOUR_NETWORK_NAME: Das Präfix, das zum Generieren des Namens des VPC-Netzwerk für Ihren GKE-Cluster verwendet wird.YOUR_GVNIC_NETWORK_PREFIX: Das Präfix für den Namen des gVNIC-Netzwerks. Sie können ein beliebiges Präfix verwenden.YOUR_RDMA_NETWORK_PREFIX: Das Präfix für das RDMA-Netzwerk (Remote Direct Memory Access). Sie können ein beliebiges Präfix verwenden.
Installieren Sie das KubeRay-Plug-in (Beta) für die
kubectl-Befehlszeile, falls es noch nicht installiert ist:Dieses Plug-in bietet Befehle zum Verwalten von Ray-Arbeitslasten in Kubernetes, z. B. zum Öffnen interaktiver Sitzungen und zum Senden von Jobs.
Infrastruktur einrichten
In diesem Abschnitt erstellen Sie VPC-Netzwerke und einen GKE-Cluster.
VPC-Netzwerk erstellen
VPC-Netzwerk für die gVNIC-Schnittstelle erstellen:
Erstellen Sie ein VPC-Netzwerk und Subnetze für RDMA, einschließlich acht Subnetzen für acht GPUs:
GKE-Cluster erstellen
Sie können NeMo RL in einem GKE Standard-Cluster einrichten.
Standardcluster erstellen:
Rufen Sie Anmeldedaten für Ihren Cluster ab:
Erstellen Sie den GPU-Knotenpool:
Installieren Sie das NCCL-RDMA-Installationsprogramm:
Netzwerkzuordnungen konfigurieren
Speichern Sie das folgende Manifest als
network-mapping.yaml:Wenden Sie das Manifest an:
Speicher vorbereiten
In diesem Abschnitt erstellen Sie eine Managed Lustre-Instanz, die den leistungsstarken Speicher bereitstellt, der für Ihre RL-Arbeitslast erforderlich ist.
Weisen Sie einen IP-Adressbereich für den Zugriff auf private Dienste zu:
Peering-Verbindung herstellen:
Managed Lustre-Instanz erstellen:
Mit dem Managed Lustre-CSI-Treiber auf eine vorhandene Managed Lustre-Instanz zugreifen
Extrahieren Sie die IP-Adresse der Managed Lustre-Instanz.
Speichern Sie das folgende Manifest als
lustre-pv.yaml:Wenden Sie das Manifest an:
Speichern Sie das folgende Manifest als
lustre-pvc.yaml:Wenden Sie das Manifest an:
RayCluster bereitstellen
In diesem Abschnitt klonen Sie das Beispiel-Repository, bereiten die Manifeste vor und stellen den Ray-Cluster bereit:
Klonen Sie das Beispiel-Repository und checken Sie den bestätigten Commit aus:
Wechseln Sie zum Arbeitsverzeichnis:
Prüfen Sie das
values.yaml-Manifest:Ersetzen Sie
NCCL_TUNER_CONFIG_PATHdurch einen der folgenden Werte, je nachdem, welchen Beschleuniger Sie in diesem Tutorial verwenden:- 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 diesem Manifest verwaltet der Head-Knoten den Job und hostet das Ray-Dashboard. Die Worker-Knoten führen die Trainingsjobs aus.
- NVIDIA B200 (180 GB):
Ray-Cluster bereitstellen:
In dieser Anleitung verwenden Sie zwei Worker-Knoten. Wenn Sie die Anzahl der Worker-Knoten ändern möchten, ändern Sie den Wert
REPLICA_COUNT.Prüfen Sie, ob die Pods, auf denen sich die Ray-Head- und ‑Worker-Knoten befinden, ausgeführt werden:
Die Ausgabe sieht etwa so aus:
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 33hEs kann etwa 10 Minuten dauern, bis die Pods gestartet werden.
Prüfen Sie, ob der Ray-Cluster ausgeführt wird:
Die Ausgabe sieht etwa so aus:
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
GRPO-Job starten
Sobald Ihr Ray-Cluster bereit ist, können Sie einen Ray-Job an Ihren laufenden Ray-Cluster in GKE senden. NeMo RL lädt das Modell automatisch während der Ausführung des RL-Trainingsjobs herunter.
Wenn Sie einen Ray-Job senden möchten, starten Sie eine interaktive Sitzung, um den Job auszuführen.
Führen Sie diesen Befehl aus, um eine lokale Verbindung zu Ihrem Ray-Cluster herzustellen:
Mit diesem Befehl wird die Portweiterleitung zwischen Ihrem lokalen Computer und dem Ray-Head-Knoten in Ihrem GKE-Cluster initiiert. Ihr Terminal ist während dieser Sitzung belegt. Öffnen Sie eine separate Terminalinstanz, um fortzufahren.
Wechseln Sie in einem separaten Terminal zu
kubernetes-engine-samples/ai-ml/nemo-rl-on-gke/nemoRL/gemma3-27b-itund bearbeiten Sie die Dateigemma3-27b-gsm8k.sh:Ersetzen Sie die folgenden Werte in der Datei
gemma3-27b-gsm8k.sh:YOUR_WANDB_API_KEY: Ihr WandB-API-Schlüssel.YOUR_HF_TOKEN: Ihr Hugging Face-Token.
In dieser Datei sehen Sie die Konfiguration zum Ausführen eines Jobs mit dem Modell „gemma3-27b-it“ für den GSM8k-Datensatz. Um die GRPO-Trainingspipeline abzuschließen, werden in diesem Skript die folgenden Parameter definiert:
num_prompts_per_step: 16undnum_generations_per_prompt: 32: Das Modell „Gemma3-27b-it“ generiert für jeden Prompt eine große Gruppe von Antworten. In dieser Konfiguration generiert das Modell insgesamt 512 Antworten (16 × 32 = 512).policy.generation.colocated.enabled=False: Mit diesem Parameter wird die Funktion für die Generierung am selben Ort deaktiviert. Das bedeutet, dass das Modell keine Antworten auf demselben Knoten wie der Trainingsprozess generiert. Beim Standard-RL übernehmen dieselben GPUs sowohl das Training als auch die Generierung. In dieser NeMo RL-Einrichtung weisen Sie bestimmte Knoten (die mit dem Parameterpolicy.generation.colocated.resourcesverwaltet werden) ausschließlich der vLLM-Inferenz zu, während sich der Rest des Clusters auf die rechenintensive Trainingsmathematik konzentriert. Durch die Trennung dieser Arbeitslasten verhindern Sie Ressourcenkonflikte zwischen den speicherintensiven Trainingspuffern und den rechenintensiven Inferenz-Workloads.
Senden Sie den Job im ursprünglichen Terminalfenster:
Während der Job ausgeführt wird, werden in der Ausgabe die Trainingsergebnisse, die Zeit und die Leistungsmesswerte angezeigt.
Zustand des GRPO-Jobs überwachen
Nachdem Ray den Job abgeschlossen hat, speichert NeMo RL die Checkpoints im konfigurierten Pfad.
So prüfen Sie die Ausgabe des GRPO-Jobs: Stellen Sie eine SSH-Verbindung zum
ray-head-Container her:Installieren Sie das apt-tree-Dienstprogramm im Terminal des
ray-head-Containers:Verzeichnisstruktur des Containers
ray-headauflisten:Die Ausgabe sieht etwa so aus:
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
Bereinigen
Damit Ihrem Google Cloud -Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder die einzelnen Ressourcen oder das Projekt löschen, das sie enthält.
Ressourcen löschen
Slurm-Cluster löschen:
So löschen Sie den GKE-Cluster:
Löschen Sie Ihr Lustre-Dateisystem:
VPC-Peering löschen:
Löschen Sie den privaten IP-Adressbereich von Lustre:
RDMA- und gVNIC-Subnetze löschen:
Firewallregeln und Netzwerke löschen:
Projekt löschen
Google Cloud -Projekt löschen:
gcloud projects delete PROJECT_ID