本教學課程說明如何在 Google Kubernetes Engine (GKE) 上,為強化學習 (RL) 協調分散式訓練環境。您可以使用 Ray 和 NVIDIA NeMo RL 架構設定分散式訓練環境,微調模型。
本教學課程著重於在 GKE 上使用 Ray 和 NeMo RL 建立群體相對政策最佳化 (GRPO) 訓練管道。GRPO 是一種強化學習演算法,旨在提升模型的推理能力。這項演算法可節省記憶體,並透過淘汰 Critic 或價值模型,改用以群組為基礎的相對計算,簡化 RL 程序。
執行本教學課程前,請先完成在 GKE 上使用 Verl 微調及擴充強化學習教學課程。本教學課程使用的叢集設定和配置,與「使用 verl 微調及擴充強化學習」教學課程相同。
背景
以下各節簡要說明本教學課程使用的概念。
增強學習 (RL)
RL 是透過經驗、探索和回饋來訓練模型,而不是靜態模仿。預先訓練會教導模型該說什麼,而人類回饋增強學習 (RLHF) 則會教導模型如何提供實用、安全且合乎邏輯的內容。RL 是基礎模型與微調模型之間的橋樑,可滿足特定用途的需求。
詳情請參閱「什麼是強化學習?」
群組相對政策最佳化 (GRPO)
GRPO 是 DeepSeek 普及的演算法,可移除 Critic 模型,為 LLM 對齊提供記憶體效率高的 PPO (近端策略最佳化) 替代方案。GRPO 不使用 Critic 網路,而是針對相同提示生成一組回覆,並以該組回覆的平均獎勵做為基準。
詳情請參閱「GRPO」。
NVIDIA NeMo RL
NeMo RL 是 NVIDIA 的開放原始碼訓練後程式庫,專為可擴充的強化學習設計。NeMo RL 是更廣泛的 NeMo 架構生態系統的一部分,可在單一 GPU 上進行小規模實驗,也可在數千個 GPU 上進行多節點部署。
詳情請參閱「NVIDIA NeMo RL」。
GSM8k 資料集
在本教學課程中,您會使用 GSM8k 資料集,其中包含 8,500 個優質、語言多元的小學數學文字題。
模型會使用 GSM8k 和 GRPO,針對同一個問題生成一組 n 個不同的回覆。GRPO 會將這些回覆與群組平均值進行比較,相較於其他路徑,如果路徑持續正確且合乎邏輯,模型會獲得更多獎勵。隨著時間推移,模型會瞭解清楚說明步驟是獲得最高獎勵最可靠的方式,進而有效減少低成效答案的獎勵。
詳情請參閱「GSM8k」。
目標
本教學課程說明如何透過下列步驟,使用 NeMo RL 在 GKE 上設定 RL:
- 準備環境。
- 設定搭載 B200 或 H200 GPU 的 GKE 叢集。
- 設定 KubeRay 來管理分散式 Ray 叢集。
- 使用 Managed Lustre 取得高效能儲存空間。
- 執行使用 NeMo RL 的 GRPO 訓練工作。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您必須具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
啟用必要的 API (如有尚未啟用的 API):
啟用 API 所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com -
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您必須具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
啟用必要的 API (如有尚未啟用的 API):
啟用 API 所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com -
將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令:
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
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶 ID。 例如:myemail@example.com。ROLE:授予使用者帳戶的 IAM 角色。
- 如果還沒有帳戶,請建立 Hugging Face 帳戶。
- 確認您有
read access的 Hugging Face 權杖。 - 如果沒有 Weights & Biases (Wandb) 帳戶,請建立一個。
- 建立 Wandb API 金鑰。
- 請確認 Google Cloud 專案有足夠的 B200 和 H200 GPU 配額。詳情請參閱「規劃 GPU 配額」和「GPU 配額」。
- 確認 Google Cloud 專案有足夠的 Managed Lustre 配額。詳情請參閱「 Managed Lustre 配額和限制」。
準備環境
在本教學課程中,您會使用 Cloud Shell。
前往 Google Cloud 控制台。
按一下 Google Cloud 控制台視窗頂端的「Activate Cloud Shell」(啟用 Cloud Shell) 按鈕。
請設定下列環境變數:
替換下列值:
YOUR_REGION:GKE 叢集控制層的 Compute Engine 區域。YOUR_ZONE:節點所在的可用區。選取提供 NVIDIA B200 或 H200 GPU 的區域。YOUR_LUSTRE_ZONE:Managed Lustre 執行個體的可用區。選取提供 Managed Lustre 的區域。為提升效能、縮短延遲時間及避免網路輸出費用,請使用與YOUR_ZONE相同的可用區。YOUR_CLUSTER_NAME:GKE 叢集的名稱。YOUR_GPU_TYPE:您在 Compute Engine 預留容量中預留的加速器。必須是下列其中一個值:nvidia-b200:NVIDIA B200 (180 GB)nvidia-h200-141gb:NVIDIA H200 (141 GB)
YOUR_MACHINE_TYPE:要使用的機器類型:- 如要使用 NVIDIA B200 (180 GB) GPU,請使用
a4-highgpu-8g以上版本。 - 如為 NVIDIA H200 (141 GB) GPU,請使用
a3-ultragpu-8g以上版本。
- 如要使用 NVIDIA B200 (180 GB) GPU,請使用
YOUR_CPU_MACHINE_TYPE:CPU 預設節點集區的 Compute Engine 機型。使用叢集可用區支援的highmem機型,且至少要有 16 個 vCPU,例如n4-highmem-16或n2d-highmem-16。YOUR_RESERVATION_NAME:GPU 預留項目的名稱。YOUR_LUSTRE_NAME:Lustre 執行個體的名稱。YOUR_HF_TOKEN:您的 Hugging Face 權杖。YOUR_WANDB_API_KEY:您的 Wandb API 金鑰。
為網路建立下列環境變數:
替換下列值:
YOUR_NETWORK_NAME:用於產生 GKE 叢集虛擬私有雲網路名稱的前置字串。YOUR_GVNIC_NETWORK_PREFIX:gVNIC 網路名稱的前置字串。你可以使用任何前置字元。YOUR_RDMA_NETWORK_PREFIX:遠端直接記憶體存取 (RDMA) 網路的前置字元。你可以使用任何前置字元。
如果尚未安裝,請為
kubectlCLI 安裝 KubeRay 外掛程式 (Beta 版):這個外掛程式提供指令,可管理 Kubernetes 上的 Ray 工作負載,例如開啟互動式工作階段及提交工作。
設定基礎架構
在本節中,您將建立虛擬私有雲網路和 GKE 叢集。
建立虛擬私有雲網路
為 gVNIC 介面建立虛擬私有雲網路:
為 RDMA 建立虛擬私有雲網路和子網路,當中包含八個 GPU 的八個子網路:
建立 GKE 叢集
您可以在 GKE Standard 叢集中設定 NeMo RL。
建立 Standard 叢集:
取得叢集憑證:
建立 GPU 節點集區:
安裝 NCCL RDMA 安裝程式:
設定網路對應
將下列資訊清單儲存為
network-mapping.yaml:套用資訊清單:
準備儲存空間
在本節中,您將建立 Managed Lustre 執行個體,為強化學習工作負載佈建所需的高效能儲存空間。
為私人服務連線分配 IP 位址範圍:
連結對等互連:
建立 Managed Lustre 執行個體:
使用 Managed Lustre CSI 驅動程式,存取現有的 Managed Lustre 執行個體。
擷取 Managed Lustre 執行個體的 IP 位址。
將下列資訊清單儲存為
lustre-pv.yaml:套用資訊清單:
將下列資訊清單儲存為
lustre-pvc.yaml:套用資訊清單:
部署 RayCluster
在本節中,您將複製範例存放區、準備資訊清單,並部署 Ray 叢集:
複製範例存放區,並查看已驗證的修訂版本:
前往目前使用的目錄:
檢查
values.yaml資訊清單:根據本教學課程中使用的加速器,將
NCCL_TUNER_CONFIG_PATH替換為下列任一值:- NVIDIA B200 (180 GB):
/usr/local/gib/configs/tuner_config_a4.txtpb - NVIDIA H200 (141 GB):
/usr/local/gib/configs/tuner_config_a3u.txtpb
在這個資訊清單中,主要節點會管理工作並代管 Ray 資訊主頁。工作站節點會執行訓練工作。
- NVIDIA B200 (180 GB):
部署 Ray 叢集:
在本教學課程中,您會使用兩個工作節點。如要變更 worker 節點數量,請變更
REPLICA_COUNT值。確認代管 Ray 主要和工作節點的 Pod 正在執行:
輸出結果會與下列內容相似:
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 33hPod 大約需要 10 分鐘才能啟動。
確認 Ray 叢集正在執行:
輸出結果會與下列內容相似:
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 工作
Ray 叢集準備就緒後,您可以將 Ray 工作提交至 GKE 上執行的 Ray 叢集。NeMo RL 會在執行 RL 訓練工作時自動下載模型。
如要提交 Ray 工作,請啟動互動式工作階段來執行工作。
如要與 Ray 叢集建立本機連線,請執行下列指令:
這項指令會在本機與 GKE 叢集中的 Ray 主節點之間啟動通訊埠轉送。請注意,這個工作階段啟用時,終端機將處於忙碌狀態;如要繼續,請開啟另一個終端機執行個體。
在另一個終端機中前往
kubernetes-engine-samples/ai-ml/nemo-rl-on-gke/nemoRL/gemma3-27b-it,並編輯gemma3-27b-gsm8k.sh檔案:在
gemma3-27b-gsm8k.sh檔案中替換下列值:YOUR_WANDB_API_KEY:您的 WandB API 金鑰。YOUR_HF_TOKEN:您的 Hugging Face 權杖。
在這個檔案中,您可以看到使用 GSM8k 資料集執行 Gemma 3 27b IT 模型工作的設定。如要完成 GRPO 訓練管道,這項指令碼會定義下列參數:
num_prompts_per_step: 16和num_generations_per_prompt: 32:Gemma3-27b-it 模型會針對每個提示生成大量回覆。在此設定中,模型會產生 512 個回應 (16 × 32 = 512)。policy.generation.colocated.enabled=False:這項參數會停用共置生成功能,也就是說,模型不會在訓練程序所在的節點生成回覆。在標準 RL 中,訓練和生成作業都由相同的 GPU 處理。在這個 NeMo RL 設定中,您會將特定節點 (使用policy.generation.colocated.resources參數管理) 專用於 vLLM 推論,而叢集的其餘部分則專注於高負載的訓練數學。將這些工作負載分開,可避免耗用大量記憶體的訓練緩衝區,與耗用大量運算資源的推論工作負載爭搶資源。
在初始終端機視窗中提交工作:
作業執行時,輸出內容會顯示訓練結果、時間和效能指標。
監控 GRPO 工作狀態
Ray 完成工作後,NeMo RL 會將檢查點儲存在設定的路徑中。
如要檢查 GRPO 作業的輸出內容,請建立
ray-head容器的 SSH 工作階段:在
ray-head容器的終端機中,安裝 apt tree 公用程式:列出
ray-head容器的目錄結構:輸出結果會與下列內容相似:
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
清除所用資源
為避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除個別資源,或刪除含有這些資源的專案。
刪除資源
刪除 Slurm 叢集:
刪除您的 GKE 叢集:
刪除 Lustre 檔案系統:
刪除虛擬私有雲對等互連:
刪除 Lustre 私人 IP 位址範圍:
刪除 RDMA 和 gVNIC 子網路:
刪除防火牆規則和網路:
刪除專案
刪除 Google Cloud 專案:
gcloud projects delete PROJECT_ID