本教學課程將說明如何在 Google Kubernetes Engine (GKE) 上,自動調度強化學習的分散式訓練環境。您可以使用 Ray 和 verl (Volcano Engine Reinforcement Learning) 框架,設定分散式訓練環境,在 GSM8K 資料集上微調 Qwen2.5-32B-Instruct 模型。
本教學課程著重於在 GKE 上使用 Ray 和 verl,進行群組相對政策最佳化 (GRPO) 訓練管道。GRPO 是一種強化學習演算法,旨在提升模型的推理能力。這項演算法可節省記憶體,並透過淘汰 Critic 或價值模型,改用相對群組計算,簡化強化學習 (RL) 程序。
如果您需要設定分散式訓練環境,以便將資料、模型權重和訓練引擎分離,提高效率,建議先從本教學課程著手。
本教學課程支援下列 GPU 架構:
- 以 Intel 或 AMD 為基礎的 GPU 節點:使用 NVIDIA B200 或 H200 GPU 設定及擴充,並透過 GKE 動態資源分配 (DRA) 進行 Autopilot 路徑。
- Arm 架構的 A4X (GB200) 節點:使用 NVIDIA GB200 Grace Blackwell Superchip、GKE 動態資源分配 (DRA) 和多節點 NVLink (IMEX) 設定及擴充。
背景
以下各節簡要說明本教學課程使用的概念。
增強學習 (RL)
RL 是透過經驗、探索和回饋來訓練模型,而不是靜態模仿。預先訓練會教導模型該說什麼,而人類回饋增強學習 (RLHF) 則會教導模型如何提供實用、安全且合乎邏輯的內容。RL 可做為基礎模型與微調模型的橋樑,適用於特定用途。
詳情請參閱「什麼是強化學習?」
群組相對政策最佳化 (GRPO)
GRPO 是 DeepSeek 普及的演算法,可移除 Critic 模型,為 LLM 對齊提供記憶體效率高的 PPO (近端策略最佳化) 替代方案。GRPO 不會使用 Critic 網路,而是針對相同提示產生一組回應,並以該組回應的平均獎勵做為基準。
詳情請參閱「GRPO」。
火山引擎強化學習 (verl)
verl 是一種高效能架構,可處理以 LLM 為基礎的 RL 複雜記憶體和運算模式。
詳情請參閱 verl。
目標
本教學課程說明如何透過 verl 在 GKE 上設定強化學習,方法是完成下列步驟:
- 使用 A4X (GB200 Superchip)、A4 (B200 GPU) 或 A3 Ultra (H200 GPU) 設定 GKE 叢集。
- 設定 KubeRay 來管理分散式 Ray 叢集。
- 使用 Cloud Storage FUSE 在所有節點中掛接 Cloud Storage bucket。
- 使用 verl 執行 GRPO 訓練工作,讓 Qwen2.5-32B-Instruct 模型與 GSM8K 資料集保持一致。
事前準備
- 登入 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,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
storage.googleapis.com compute.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,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
將角色授予使用者帳戶。針對下列每個 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
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com。ROLE:授予使用者帳戶的 IAM 角色。
- 如果沒有 Hugging Face 帳戶,請建立一個。
- 確認你擁有 Hugging Face 權杖。
- 請確認專案有足夠的 A4X (GB200 Superchips)、A4 (B200 GPU) 或 A3 Ultra (H200 GPU) 配額。詳情請參閱「規劃 GPU 配額」和「GPU 配額」。
- 請確認您已為 GPU 機型啟用容量預留功能。詳情請參閱「透過帳戶團隊預留容量」。
- 如要設定 A4X (GB200),請確認已安裝 Helm。
準備環境
在本教學課程中,您會使用 Cloud Shell。
前往 Google Cloud 控制台。
在 Google Cloud 控制台視窗頂端,按一下「啟用 Cloud Shell」按鈕。
設定環境變數:
A4 和 A3 Ultra
Autopilot
標準
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=ddbcdb7替換下列值:
YOUR_REGION:GKE 叢集控制層的 Compute Engine 區域。YOUR_ZONE:保留節點的區域。詳情請參閱「GPU 可用性」。YOUR_CLUSTER_NAME:GKE 叢集名稱。YOUR_KSA_NAME:Kubernetes 服務帳戶的名稱。YOUR_GCS_BUCKET:Cloud Storage bucket 的基本名稱。您不需要指定gs://前置字元。YOUR_GPU_TYPE:您在 Compute Engine 容量預留中預留的加速器。必須是下列其中一個值:nvidia-gb200:A4X (GB200 Superchips)nvidia-b200:A4 (B200 GPU)nvidia-h200-141gb:A3 Ultra (H200 GPU)
YOUR_MACHINE_TYPE:要使用的機器類型:- 如果是 A4X (GB200 Superchip),請使用
a4x-highgpu-4g。 - 如果是 A4 (B200 GPU),請使用
a4-highgpu-8g以上版本。 - 如為 A3 Ultra (H200 GPU),請使用
a3-ultragpu-8g以上版本。
- 如果是 A4X (GB200 Superchip),請使用
YOUR_CPU_MACHINE_TYPE:CPU 預設節點集區的 Compute Engine 機型。使用叢集可用區支援的highmem機型,且至少要有 16 個 vCPU,例如n4-highmem-16或n2d-highmem-16。YOUR_RESERVATION_NAME:容量預留的名稱。YOUR_HF_TOKEN:您的 Hugging Face 權杖。- 在 GKE Standard 叢集中設定環境時,請使用下列變數:
YOUR_GVNIC_NAME(僅限 A4 或 A3 Ultra):gVNIC 網路名稱的前置字串。您可以視需要使用任何前置字元。YOUR_RDMA_NAME(僅限 A4 或 A3 Ultra):遠端直接記憶體存取 (RDMA) 網路的前置字元。你可以使用任何前置字元。
複製範例存放區:
前往所選 GKE 模式的目前使用的目錄:
A4 和 A3 Ultra
Autopilot
標準
A4X
不需要變更目錄。您可以直接前往下一個部分。
設定基礎架構
在本節中,您將建立標準 VPC 網路和 GKE 叢集。
建立 RDMA 網路和子網路 (僅限 GKE Standard - A4 和 A3 Ultra)
A4 和 A3 Ultra
Autopilot
本節僅適用於 GKE Standard A4 和 A3 Ultra GPU。
如果您使用 Autopilot,請略過本節,直接前往「建立 GKE 叢集」。GKE 會自動佈建必要的虛擬私有雲網路和子網路,並使用 GKE 管理的 DRANET 將這些資源分配給 Pod。您不需要手動建立任何網路基礎架構。
標準
為 gVNIC 介面建立虛擬私有雲網路:
為 RDMA 建立虛擬私有雲網路:
為 8 個 GPU 建立 8 個 RDMA 子網路:
A4X
本節僅適用於 GKE Standard A4 和 A3 Ultra GPU。
如果您使用 A4X (GB200) GPU,請略過本節,直接前往建立 GKE 叢集。如果是 A4X (GB200) GPU 或 Autopilot,當節點集區使用auto加速晶片 VM 網路設定檔時,GKE 會自動建立網路。Cluster Toolkit 藍圖會使用 enable_dranet:true 旗標啟用這個設定檔。
建立 GKE 叢集
根據 GPU 架構建立 GKE 叢集:
A4 和 A3 Ultra
選取要使用的 GKE 叢集模式:
Autopilot
建立 Autopilot 叢集:
取得叢集憑證:
標準
建立 Standard 叢集:
取得叢集憑證:
建立 GPU 節點集區。這些節點集區會使用預留項目,確保可用性。一開始有兩個節點:
安裝用於 Standard 叢集的 NCCL RDMA 安裝程式:
A4X
使用 Cluster Toolkit
gke-a4x藍圖建立 GKE 叢集和節點集區。 藍圖會佈建 GKE 叢集,包括繫結至預留項目的 A4X 節點集區、加速器網路 (一個額外的 gVNIC 加上四個 RDMA 軌道),以及將 CX-7 NIC 顯示為 DRA 裝置的受管理 DRANET 驅動程式。使用藍圖的部署說明設定參數 (例如
PROJECT_ID、CONTROL_PLANE_REGION、NODE_ZONE、預留項目和NUM_GPU_NODES),然後部署叢集。或者,您也可以按照 A4X GKE 叢集建立指南,手動建立叢集。- 取得叢集憑證:
gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${CONTROL_PLANE_REGION}確認叢集透過 DRA 公開 RDMA NIC:
kubectl get deviceclasses輸出內容必須包含
mrdma.google.com。確認 A4X 節點是否存在:
kubectl get nodes -l cloud.google.com/gke-accelerator=nvidia-gb200安裝 gIB NCCL 外掛程式 (A4X 變體):
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-rdma/nccl-rdma-installer-a4x.yaml安裝 NVIDIA DRA 驅動程式,為多節點 NVLink 提供
ComputeDomain(IMEX) 通道: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=Exists安裝 KubeRay 運算子,範圍限定於工作負載命名空間:
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}}"
設定網路對應 (僅限 GKE Standard - A4 和 A3 Ultra)
A4 和 A3 Ultra
Autopilot
如果使用 GKE Standard GPU 設定 (僅限 A4 和 A3 Ultra),則必須執行這個步驟。如果您使用 A4X (GB200),GKE 會自動管理網路介面,因此請略過本節。
標準
檢查
network-mapping.yaml資訊清單:套用資訊清單:
A4X
這是 GKE Standard GPU 設定的必要步驟 (僅限 A4 和 A3 Ultra)。如果您使用 A4X (GB200),GKE 會自動管理網路介面,因此請略過本節。
準備資料和儲存空間
設定 Cloud Storage 和 Kubernetes 資源:
建立 Cloud Storage bucket:
建立 Kubernetes 服務帳戶 (KSA),並繫結至 bucket:
為 Hugging Face 建立 Secret:
檢查
gcsfuse-storage.yaml資訊清單:套用資訊清單:
設定 DRANET
設定 DRANET:
A4 和 A3 Ultra
Autopilot
建立 ComputeClass 資訊清單:
同時套用
computeclass-dranet.yaml資訊清單 (在上一個步驟中建立) 和resourceclaim-dranet.yaml資訊清單 (包含在範例存放區中):
標準
無須設定 DRANET。您可以直接前往下一個部分。
A4X
DRANET 由 Cluster Toolkit 設定。您可以直接前往下一個部分。
準備模型和資料
在 Cloud Storage bucket 中填入模型權重和資料集。 您可以在本機或 GKE Pod 上執行這些指令,將資料填入 bucket:
A4 和 A3 Ultra
Autopilot
檢查
data-prep-job.yaml資訊清單,該資訊清單會設定資料準備工作:啟動工作:
檢查 Pod 狀態:
data-prep-jobPod 達到Running狀態後,請按下 Control+C 停止監看。監控工作:
在 Pod 達到
Running狀態前,kubectl logs指令只會傳回極少或沒有輸出內容。
標準
檢查
data-prep-job.yaml資訊清單,該資訊清單會設定資料準備工作:啟動工作:
監控工作:
A4X
複製 verl 存放區、準備虛擬環境,然後處理 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/gsm8k使用 Hugging Face CLI 下載 Qwen2.5-32B-Instruct 模型 (下載時需要約 66 GB 的磁碟空間):
hf download Qwen/Qwen2.5-32B-Instruct --local-dir Qwen2.5-32B-Instruct將模型、資料和 verl 程式碼上傳至 Cloud Storage bucket:
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/
部署 RayCluster 自訂資源
部署 RayCluster 自訂資源,其中包含一個系統 head Pod 和多個 GPU 支援的 worker Pod。
A4 和 A3 Ultra
選取用於建立叢集的 GKE 叢集模式:
Autopilot
檢查 RayCluster 工作負載:
套用 RayCluster:
標準
檢查 RayCluster 工作負載:
套用 RayCluster:
A4X
建立 RDMA
ResourceClaimTemplate和 NVIDIAComputeDomain。 每個 GPU 工作人員 Pod 會宣告四個 RDMA NIC (節點的所有軌道) 和一個 IMEX 管道。將下列資訊清單儲存至compute-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-channel套用資訊清單:
kubectl apply -f compute-domain-a4x.yaml部署 RayCluster。Ray head Pod 會在 A4X 節點上執行,不會要求使用 GPU (因為映像檔僅含
arm64)。將下列設定儲存至ray-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-pvc套用 RayCluster 資訊清單:
envsubst < ray-cluster-a4x.yaml | kubectl apply -f -等待一個主要 Pod 和四個工作人員 Pod 進入
Running狀態:kubectl get pods -w
啟動 GRPO 工作
設定並提交增強學習訓練工作:
A4 和 A3 Ultra
選取用於建立叢集的 GKE 叢集模式:
Autopilot
設定 Ray Client:
復原 Ray Head 服務:
設定通訊埠轉送至 Ray 資訊主頁節點。這個程序會在背景執行,因此您可以在同一個終端機工作階段中繼續執行指令。
如要停止連接埠轉送迴圈,請使用
kill ${PF_LOOP_PID}指令。檢查
runtime-env.yaml資訊清單:如果您使用 H200 GPU,請將
NCCL_CONF_FILE環境變數的值變更為/usr/local/gib/configs/nccl.a3u.conf。Ray 用戶端會使用這個檔案。您不必將這個資訊清單套用至叢集。
使用
ray job submit指令提交工作:監控訓練工作記錄,並尋找要增加的
critic/score/mean指標,這表示模型正在學習:- Ray 資訊主頁:
- 在瀏覽器中開啟
http://localhost:8265。如果您使用 Cloud Shell,請按一下「網頁預覽」,選取「變更通訊埠」,然後輸入8265。 - 前往「工作」分頁。
- 按一下「工作 ID」。
- 依關鍵字
critic篩選記錄,以便檢查critic/score/mean。
- 在瀏覽器中開啟
終端機:由於作業是使用
--no-wait旗標非同步提交,請執行下列指令,在終端機中串流作業記錄:
- Ray 資訊主頁:
訓練完成後,請列出目錄內容,確認模型檢查點已儲存至 Cloud Storage bucket:
或者,您也可以在 Google Cloud 控制台中查看檢查點,方法是依序前往「Cloud Storage」 >「Bucket」,選取
YOUR_GCS_BUCKET,然後開啟verl/checkpoints資料夾。
標準
設定 Ray Client:
復原 Ray Head 服務:
設定通訊埠轉送至 Ray 資訊主頁節點。這個程序會在背景執行,因此您可以在同一個終端機工作階段中繼續執行指令。
如要停止連接埠轉送迴圈,請使用
kill ${PF_PID}指令。檢查
runtime-env.yaml資訊清單:如果您使用 H200 GPU,請將
NCCL_TUNER_CONFIG_PATH環境變數的值變更為/usr/local/gib/configs/tuner_config_a3u.txtpb。Ray 用戶端會使用這個檔案。您不必將這個資訊清單套用至叢集。
提交工作:
監控訓練工作記錄,並尋找要增加的
critic/score/mean指標,這表示模型正在學習:- Ray 資訊主頁:
- 在瀏覽器中開啟
http://localhost:8265。如果您使用 Cloud Shell,請按一下「網頁預覽」,選取「變更通訊埠」,然後輸入8265。 - 前往「工作」分頁。
- 按一下「工作 ID」。
- 使用
critic關鍵字篩選記錄,檢查critic/score/mean指標。
- 在瀏覽器中開啟
控制台輸出內容:由於工作是使用
--no-wait旗標以非同步方式提交,請在終端機中執行下列指令,串流處理工作記錄:
- Ray 資訊主頁:
訓練完成後,請列出目錄內容,確認模型檢查點已儲存至 Cloud Storage bucket:
或者,您也可以在 Google Cloud 控制台中查看檢查點,方法是依序前往「Cloud Storage」 >「Bucket」,選取
YOUR_GCS_BUCKET,然後開啟verl/checkpoints資料夾。
A4X
取得 Ray 領導者 Pod 名稱:
export HEAD_POD=$(kubectl get pod -n ${NAMESPACE} -l ray.io/node-type=head -o jsonpath='{.items[0].metadata.name}')直接在 head Pod 上設定 Ray 執行階段環境檔案:
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'在 Ray head Pod 上執行 GRPO 訓練工作,藉此提交工作:
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'監控工作記錄 (使用
ray job submit傳回的專屬 ID):kubectl exec ${HEAD_POD} -c ray-head -- ray job logs <var>JOB_ID</var> --follow取代
JOB_ID。在含有via P2P/MNNVL的記錄中尋找 NCCL 行,確認跨節點 NVLink 是否已啟用。
清除所用資源
為避免產生費用,請刪除資源:
A4 和 A3 Ultra
Autopilot
如果連接埠轉送迴圈仍在背景工作階段中執行,請終止迴圈:
刪除 Ray 叢集:
刪除 Cloud Storage FUSE:
刪除 DRANET 資源:
刪除 Cloud Storage bucket:
刪除 GKE 叢集:
標準
如果連接埠轉送迴圈仍在背景工作階段中執行,請終止迴圈:
刪除 Ray 叢集:
刪除 Cloud Storage FUSE:
刪除 Cloud Storage bucket:
刪除 GKE 叢集:
刪除虛擬私有雲網路和子網路:
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}