本教學課程說明如何在 Google Kubernetes Engine (GKE) 上,為強化學習編排分散式訓練環境。您可以使用 Ray 和 verl (Volcano Engine Reinforcement Learning) 框架,設定分散式訓練環境,在 GSM8K 資料集上微調 Qwen2.5-32B-Instruct 模型。
本教學課程著重於使用 Ray 和 verl,在 GKE 上進行群組相對政策最佳化 (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.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 帳戶,請建立一個。
- 請確認您擁有 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_RESERVATION_NAME:預留容量的名稱。YOUR_HF_TOKEN:您的 Hugging Face 權杖。- 僅限 Google Kubernetes Engine (GKE) Standard 版:
GVNIC_NAME(僅限 GKE Standard - A4 或 A3 Ultra):gVNIC 網路名稱的前置字元。你可以使用任何前置字元。RDMA_NAME(僅限 A4 或 A3 Ultra):遠端直接記憶體存取 (RDMA) 網路的前置字元。你可以使用任何前置字元。
複製範例存放區:
前往所選 GKE 模式的工作目錄:
A4 和 A3 Ultra
Autopilot
標準
A4X
您不需要變更目錄,您可以直接前往下一個章節。
設定基礎架構
在本節中,您將建立標準虛擬私有雲網路和 GKE 叢集。
建立 RDMA 網路和子網路 (僅限 GKE Standard - A4 和 A3 Ultra)
A4 和 A3 Ultra
Autopilot
這個部分僅適用於 GKE Standard A4 和 A3 Ultra GPU。
如果您使用 Autopilot,請略過本節,直接前往「建立 GKE 叢集」。GKE 會自動佈建必要的 VPC 網路和子網路,並使用 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 加速器網路設定檔時,GKE 會自動建立網路。Cluster Toolkit 藍圖會使用 enable_dranet:true 旗標啟用這個設定檔。
建立 GKE 叢集
建立與 GPU 架構對應的 GKE 叢集:
A4 和 A3 Ultra
選取要使用的 GKE 叢集模式:
Autopilot
建立 Autopilot 叢集:
取得叢集憑證:
標準
建立 Standard 叢集:
取得叢集憑證:
建立 GPU 節點集區。這些節點集區會使用預留項目,確保可用性。一開始有兩個節點:
安裝用於標準叢集的 NCCL RDMA 安裝程式:
A4X
使用 Cluster Toolkit 藍圖建立 GKE 叢集和節點集區。
gke-a4x藍圖會佈建 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 值區中填入模型權重和資料集。 您可以在本機或 GKE Pod 上執行這些指令,將資料填入 bucket:
A4 和 A3 Ultra
Autopilot
檢查資料準備工作:
啟動工作:
監控工作:
標準
檢查資料準備工作:
啟動工作:
監控工作:
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 值區:
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 自訂資源,其中包含一個系統頭部 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
設定 Ray Client:
復原 Ray Head 服務:
設定通訊埠轉送至 Ray 資訊主頁節點。請使用獨立的終端機視窗執行這個步驟,因為這個指令會在執行時封鎖終端機。使用
Control+C 停止: 檢查
runtime-env.yaml資訊清單:如果您使用 H200 GPU,請將
NCCL_TUNER_CONFIG_PATH變更為/usr/local/gib/configs/tuner_config_a3u.txtpb。Ray 用戶端會使用這個檔案。您不需要將這個資訊清單套用至叢集。
使用
ray job submit提交工作:在 Ray 資訊主頁或控制台輸出內容中監控記錄。尋找
critic/score/mean符號,表示學習成效有所提升。訓練完成後,您可以在
gs://$GS_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}')直接在首節點 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}