Tutorial ini menunjukkan cara mengatur lingkungan pelatihan terdistribusi untuk reinforcement learning di Google Kubernetes Engine (GKE). Anda menggunakan Ray dan framework verl (Volcano Engine Reinforcement Learning) untuk menyiapkan lingkungan pelatihan terdistribusi guna menyempurnakan model Qwen2.5-32B-Instruct pada set data GSM8K.
Tutorial ini berfokus pada pipeline pelatihan Group Relative Policy Optimization (GRPO) di GKE dengan Ray dan verl. GRPO adalah algoritma pembelajaran penguatan yang dirancang untuk meningkatkan kemampuan penalaran model. Algoritma yang hemat memori ini menyederhanakan proses reinforcement learning (RL) dengan menghilangkan Critic, atau model nilai, dan menggunakan perhitungan berbasis grup relatif.
Tutorial ini adalah titik awal yang baik jika Anda perlu menyiapkan lingkungan pelatihan terdistribusi tempat data, bobot model, dan mesin pelatihan dipisahkan untuk efisiensi.
Tutorial ini mendukung arsitektur GPU berikut:
- Node GPU berbasis Intel atau AMD: Siapkan dan lakukan penskalaan menggunakan GPU NVIDIA B200 atau H200.
- Node A4X (GB200) berbasis Arm: Siapkan dan lakukan penskalaan menggunakan Superchip Grace Blackwell NVIDIA GB200, menggunakan Alokasi Resource Dinamis (DRA) GKE dan Multi-Node NVLink (IMEX).
Latar belakang
Bagian berikut memberikan ringkasan singkat tentang konsep yang digunakan dalam tutorial ini.
Reinforcement learning (RL)
RL mengajari model melalui pengalaman, eksplorasi, dan masukan, bukan imitasi statis. Meskipun pra-pelatihan mengajarkan model apa yang harus dikatakan, Reinforcement Learning from Human Feedback (RLHF) mengajarkannya cara menjadi bermanfaat, aman, dan logis. RL berfungsi sebagai jembatan antara model dasar dan model yang di-fine-tune untuk kasus penggunaan khusus.
Untuk mengetahui informasi selengkapnya, lihat Apa yang dimaksud dengan reinforcement learning?
Pengoptimalan Kebijakan Relatif Grup (GRPO)
GRPO, sebuah algoritma yang dipopulerkan oleh DeepSeek, menawarkan alternatif yang hemat memori untuk penyelarasan LLM dengan Proximal Policy Optimization (PPO) dengan menghapus model Critic. Alih-alih jaringan Kritikus, GRPO menghasilkan sekelompok respons untuk perintah yang sama dan menggunakan reward rata-rata kelompok tersebut sebagai dasar.
Untuk mengetahui informasi selengkapnya, lihat GRPO.
Volcano Engine Reinforcement Learning (verl)
verl adalah framework berperforma tinggi yang dirancang untuk menangani pola memori dan komputasi yang kompleks dari RL berbasis LLM.
Untuk mengetahui informasi selengkapnya, lihat verl.
Tujuan
Tutorial ini menunjukkan cara menyiapkan reinforcement learning di GKE dengan verl, dengan menyelesaikan langkah-langkah berikut:
- Siapkan cluster GKE dengan A4X (GB200 Superchips), A4 (GPU B200), atau A3 Ultra (GPU H200).
- Konfigurasi KubeRay untuk mengelola cluster Ray terdistribusi.
- Gunakan Cloud Storage FUSE untuk memasang bucket Cloud Storage di semua node.
- Jalankan tugas pelatihan GRPO menggunakan verl untuk menyelaraskan model Qwen2.5-32B-Instruct dengan set data GSM8K.
Sebelum memulai
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih Google Cloud project.
Peran yang diperlukan untuk memilih atau membuat project
- Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Pembuat Project
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat Google Cloud project:
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan API yang diperlukan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (
roles/serviceusage.serviceUsageAdmin), yang berisi izinserviceusage.services.enable. Pelajari cara memberikan peran.gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih Google Cloud project.
Peran yang diperlukan untuk memilih atau membuat project
- Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Pembuat Project
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat Google Cloud project:
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan API yang diperlukan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (
roles/serviceusage.serviceUsageAdmin), yang berisi izinserviceusage.services.enable. Pelajari cara memberikan peran.gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Berikan peran ke akun pengguna Anda. Jalankan perintah berikut satu kali untuk setiap peran IAM berikut:
roles/container.admin, roles/iam.serviceAccountAdmin, roles/storage.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Ganti kode berikut:
PROJECT_ID: Project ID Anda.USER_IDENTIFIER: ID untuk akun pengguna Anda. Misalnya,myemail@example.com.ROLE: Peran IAM yang Anda berikan ke akun pengguna Anda.
- Buat akun Hugging Face jika Anda belum memilikinya.
- Pastikan Anda memiliki token Hugging Face.
- Pastikan project Anda memiliki kuota yang cukup untuk A4X (GB200 Superchips), A4 (GPU B200), atau A3 Ultra (GPU H200). Untuk mempelajari lebih lanjut, lihat Merencanakan kuota GPU dan Kuota GPU.
- Pastikan Anda memiliki reservasi kapasitas aktif untuk jenis mesin GPU Anda. Untuk mengetahui informasi selengkapnya, lihat Mencadangkan kapasitas melalui tim akun Anda.
- Untuk penyiapan A4X (GB200), pastikan Anda telah menginstal Helm.
Menyiapkan lingkungan Anda
Dalam tutorial ini, Anda akan menggunakan Cloud Shell.
Buka Google Cloud console.
Di bagian atas jendela konsol, klik tombol Activate Cloud Shell. Google Cloud
Tetapkan variabel lingkungan:
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CONTROL_PLANE_REGION=CONTROL_PLANE_REGION export NODE_ZONE=NODE_ZONE export CLUSTER_NAME=CLUSTER_NAME export KSA_NAME=KSA_NAME export GS_BUCKET=BUCKET_NAME-${PROJECT_ID} export NAMESPACE=default export GPU_TYPE=GPU_TYPE export MACHINE_TYPE=MACHINE_TYPE export RESERVATION=RESERVATION export HF_TOKEN=YOUR_HUGGING_FACE_TOKEN # A4 (B200 GPUs) or A3 Ultra (H200 GPUs) only variables export GVNIC_NETWORK_PREFIX=YGVNIC_NAME export RDMA_NETWORK_PREFIX=RDMA_NAME # A4X (GB200 Superchips) only variables export NUM_GPU_NODES=4 export VERL_IMAGE=verlai/verl:vllm023.aarch64.dev1 export VERL_REF=ddbcdb7Ganti nilai berikut:
CONTROL_PLANE_REGION: region Compute Engine untuk bidang kontrol cluster GKE.NODE_ZONE: zona tempat node dipesan. Untuk mengetahui informasi selengkapnya, lihat Ketersediaan GPU.CLUSTER_NAME: nama cluster GKE Anda.KSA_NAME: nama akun layanan Kubernetes Anda.BUCKET_NAME: nama dasar untuk bucket Cloud Storage Anda. Anda tidak perlu menentukan awalangs://.GPU_TYPE: akselerator yang Anda pesan dalam reservasi kapasitas Compute Engine. Harus berupa salah satu nilai berikut:nvidia-gb200: A4X (GB200 Superchips)nvidia-b200: A4 (GPU B200)nvidia-h200-141gb: A3 Ultra (GPU H200)
MACHINE_TYPE: jenis mesin yang akan digunakan:- Untuk A4X (GB200 Superchips), gunakan
a4x-highgpu-4g. - Untuk A4 (GPU B200), gunakan
a4-highgpu-8gatau yang lebih baru. - Untuk A3 Ultra (GPU H200), gunakan
a3-ultragpu-8gatau yang lebih baru.
- Untuk A4X (GB200 Superchips), gunakan
RESERVATION: nama reservasi kapasitas Anda.YOUR_HUGGING_FACE_TOKEN: token Hugging Face Anda.GVNIC_NAME(khusus A4 atau A3 Ultra): awalan untuk nama jaringan gVNIC. Anda dapat menggunakan awalan apa pun yang Anda inginkan.RDMA_NAME(khusus A4 atau A3 Ultra): awalan untuk jaringan remote direct memory access (RDMA). Anda dapat menggunakan awalan apa pun yang Anda inginkan.
Menyiapkan infrastruktur
Di bagian ini, Anda akan membuat jaringan VPC standar dan cluster GKE.
Membuat jaringan dan subnet RDMA (khusus A4 dan A3 Ultra)
Bagian ini hanya diperlukan untuk GPU A4 dan A3 Ultra.
Jika Anda menggunakan GPU A4X (GB200), lewati bagian ini dan langsung lanjutkan ke
Membuat cluster GKE. Untuk GPU A4X (GB200), GKE
membuat jaringan secara otomatis saat node pool menggunakan profil jaringan akselerator auto. Blueprint Cluster Toolkit mengaktifkan profil ini dengan menggunakan flag enable_dranet:true.
Buat jaringan VPC untuk antarmuka gVNIC:
gcloud compute networks create ${GVNIC_NETWORK_PREFIX}-net \ --subnet-mode=custom \ --project=${PROJECT_ID} gcloud compute networks subnets create ${GVNIC_NETWORK_PREFIX}-sub \ --network=${GVNIC_NETWORK_PREFIX}-net \ --region=${CONTROL_PLANE_REGION} \ --range=192.168.0.0/24 gcloud compute firewall-rules create ${GVNIC_NETWORK_PREFIX}-internal \ --network=${GVNIC_NETWORK_PREFIX}-net \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=192.168.0.0/16Buat jaringan VPC dan subnet untuk RDMA dengan 8 subnet untuk 8 GPU:
gcloud beta compute networks create ${RDMA_NETWORK_PREFIX}-net \ --network-profile=${NODE_ZONE}-vpc-roce \ --subnet-mode=custom for N in $(seq 0 7); do gcloud compute networks subnets create ${RDMA_NETWORK_PREFIX}-sub-$N \ --network=${RDMA_NETWORK_PREFIX}-net \ --region=${CONTROL_PLANE_REGION} \ --range=192.168.$((N+1)).0/24 & done waitClone repositori contoh:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samplesBuka direktori kerja:
cd ai-ml/verl-on-gke
Membuat cluster GKE
Buat cluster GKE yang sesuai dengan arsitektur GPU Anda:
A4 dan A3 Ultra
Pilih mode cluster GKE yang ingin Anda gunakan:
Autopilot
Buat cluster Autopilot:
gcloud container clusters create-auto ${CLUSTER_NAME} \ --location=${CONTROL_PLANE_REGION} \ --enable-multi-networking \ --enable-ray-operatorDapatkan kredensial untuk cluster Anda:
gcloud container clusters get-credentials ${CLUSTER_NAME} \ --location=${CONTROL_PLANE_REGION}Instal penginstal NCCL RDMA untuk Autopilot:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/gpudirect-rdma/nccl-rdma-installer-autopilot.yaml
Standar
Buat cluster Standard:
gcloud container clusters create ${CLUSTER_NAME} \ --location=${CONTROL_PLANE_REGION} \ --enable-dataplane-v2 \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --enable-ip-alias \ --enable-multi-networking \ --addons=RayOperator,GcsFuseCsiDriver \ --machine-type=c2-standard-16 \ --num-nodes=1 \ --min-nodes=1 \ --max-nodes=5 \ --enable-autoscalingDapatkan kredensial untuk cluster Anda:
gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${CONTROL_PLANE_REGION}Buat node pool GPU. Node pool ini menggunakan reservasi Anda untuk memastikan ketersediaan. Kita mulai dengan dua node:
gcloud container node-pools create gpu-pool \ --cluster=${CLUSTER_NAME} \ --location=${CONTROL_PLANE_REGION} \ --node-locations=${NODE_ZONE} \ --machine-type=${MACHINE_TYPE} \ --accelerator=type=${GPU_TYPE},count=8,gpu-driver-version=DEFAULT \ --reservation-affinity=specific \ --reservation=${RESERVATION} \ --enable-autoscaling \ --num-nodes=2 \ --total-max-nodes=10 \ --additional-node-network=network=${GVNIC_NETWORK_PREFIX}-net,subnetwork=${GVNIC_NETWORK_PREFIX}-sub \ --additional-node-network=network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-0 \ --additional-node-network=network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-1 \ --additional-node-network=network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-2 \ --additional-node-network=network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-3 \ --additional-node-network=network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-4 \ --additional-node-network=network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-5 \ --additional-node-network=network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-6 \ --additional-node-network=network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-7Instal penginstal NCCL RDMA yang digunakan untuk cluster Standard:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/gpudirect-rdma/nccl-rdma-installer.yaml
A4X
Buat cluster GKE dan node pool menggunakan cetak biru Cluster Toolkit
gke-a4x. Blueprint ini menyediakan cluster GKE, termasuk kumpulan node A4X yang terikat ke reservasi Anda, jaringan akselerator (satu gVNIC tambahan plus empat jalur RDMA), dan driver DRANET terkelola yang mengekspos NIC CX-7 sebagai perangkat DRA.Gunakan petunjuk deployment blueprint untuk mengonfigurasi parameter Anda (seperti
PROJECT_ID,CONTROL_PLANE_REGION,NODE_ZONE, reservasi, danNUM_GPU_NODES), lalu deploy cluster. Atau, Anda dapat mengikuti panduan pembuatan cluster GKE A4X untuk membuat cluster secara manual.Dapatkan kredensial untuk cluster Anda:
gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${CONTROL_PLANE_REGION}Pastikan cluster mengekspos NIC RDMA melalui DRA:
kubectl get deviceclassesOutput harus menyertakan
mrdma.google.com.Pastikan node A4X ada:
kubectl get nodes -l cloud.google.com/gke-accelerator=nvidia-gb200Instal plugin gIB NCCL (varian A4X):
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-rdma/nccl-rdma-installer-a4x.yamlInstal driver NVIDIA DRA, yang menyediakan saluran
ComputeDomain(IMEX) untuk NVLink multi-node: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=ExistsInstal operator KubeRay, yang dicakup ke namespace beban kerja:
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}}"
Mengonfigurasi pemetaan jaringan (khusus A4 dan A3 Ultra)
Langkah ini diperlukan untuk penyiapan GPU standar (khusus A4 dan A3 Ultra). Jika Anda menggunakan A4X (GB200), GKE akan mengelola antarmuka jaringan secara otomatis, jadi lewati bagian ini.
Periksa manifes
network-mapping.yaml:Terapkan manifes:
envsubst < network-mapping.yaml > network-mapping-updated.yaml kubectl apply -f network-mapping-updated.yaml
Menyiapkan data dan penyimpanan
Mengonfigurasi resource Cloud Storage dan Kubernetes:
Membuat bucket Cloud Storage:
gcloud storage buckets create gs://${GS_BUCKET} \ --location=${CONTROL_PLANE_REGION} \ --enable-hierarchical-namespace \ --uniform-bucket-level-accessBuat Akun Layanan Kubernetes (KSA) dan ikat ke bucket:
kubectl create serviceaccount ${KSA_NAME} --namespace ${NAMESPACE} gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET} \ --member "principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${NAMESPACE}/sa/${KSA_NAME}" \ --role "roles/storage.objectUser"Buat Secret untuk Hugging Face:
kubectl create secret generic hf-secret --from-literal=hf_api_token=${HF_TOKEN}Periksa manifes
gcsfuse-storage.yaml:Terapkan manifes:
envsubst < gcsfuse-storage.yaml > gcsfuse-storage-updated.yaml kubectl apply -f gcsfuse-storage-updated.yaml
Menyiapkan model dan data
Isi bucket Cloud Storage Anda dengan bobot dan set data model. Anda dapat menjalankan perintah ini secara lokal atau di Pod GKE untuk mengisi bucket:
Clone repositori verl, siapkan lingkungan virtual, dan proses set data 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/gsm8kDownload model Qwen2.5-32B-Instruct menggunakan Hugging Face CLI (tindakan ini memerlukan ruang disk sekitar 66 GB):
hf download Qwen/Qwen2.5-32B-Instruct --local-dir Qwen2.5-32B-InstructUpload model, data, dan kode VERL ke bucket Cloud Storage Anda:
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/
Men-deploy resource kustom RayCluster
Deploy resource kustom RayCluster, yang terdiri dari satu Pod head sistem dan beberapa Pod pekerja yang didukung GPU.
A4 dan A3 Ultra
Pilih mode cluster GKE yang Anda gunakan untuk membuat cluster:
Autopilot
Deploy RayCluster. Simpan kode berikut ke
ray-cluster-auto.yaml:Terapkan RayCluster:
envsubst < ray-cluster-auto.yaml > ray-cluster-auto-updated.yaml kubectl apply -f ray-cluster-auto-updated.yaml
Standar
Deploy RayCluster. Simpan konfigurasi berikut ke
ray-cluster-standard.yaml:Terapkan RayCluster:
envsubst < ray-cluster-standard.yaml > ray-cluster-updated.yaml kubectl apply -f ray-cluster-updated.yaml
A4X
Buat RDMA
ResourceClaimTemplatedan NVIDIAComputeDomain. Setiap Pod pekerja GPU mengklaim empat NIC RDMA (semua jalur node-nya) dan satu saluran IMEX. Simpan manifes berikut kecompute-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-channelTerapkan manifes:
kubectl apply -f compute-domain-a4x.yamlDeploy RayCluster. Pod head Ray berjalan di node A4X tanpa meminta GPU (karena image hanya
arm64). Simpan konfigurasi berikut keray-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-pvcTerapkan manifes RayCluster:
envsubst < ray-cluster-a4x.yaml | kubectl apply -f -Tunggu hingga satu Pod head dan empat Pod pekerja berada dalam status
Running:kubectl get pods -w
Luncurkan Tugas GRPO
Konfigurasi dan kirim tugas pelatihan reinforcement learning:
A4 dan A3 Ultra
Siapkan penerusan port ke node dasbor Ray. Gunakan jendela terminal terpisah untuk ini, karena perintah ini akan memblokir terminal selama perintah berjalan. Gunakan Ctrl+C untuk menghentikannya:
kubectl port-forward svc/b200-ray-cluster-head-svc 8265:8265Periksa manifes
runtime-env.yaml:Jika Anda menggunakan GPU H200, ubah
NCCL_TUNER_CONFIG_PATHmenjadi/usr/local/gib/configs/tuner_config_a3u.txtpb.File ini digunakan oleh klien Ray. Anda tidak perlu menerapkan manifes ini ke cluster.
Kirim Tugas menggunakan
ray job submit:ray job submit \ --address "http://localhost:8265" \ --runtime-env runtime-env.yaml \ -- \ bash -c " cd /data/verl && PYTHONUNBUFFERED=1 python3 -m verl.trainer.main_ppo \ 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=256 \ actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=64 \ actor_rollout_ref.rollout.name=vllm \ actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=8 \ actor_rollout_ref.rollout.tensor_model_parallel_size=8 \ actor_rollout_ref.rollout.gpu_memory_utilization=0.6 \ actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=4 \ actor_rollout_ref.actor.strategy=fsdp2 \ algorithm.kl_ctrl.kl_coef=0.001 \ trainer.logger=console \ trainer.val_before_train=False \ trainer.n_gpus_per_node=8 \ trainer.nnodes=2 \ trainer.save_freq=10 \ trainer.test_freq=10 \ trainer.default_local_dir=/data/verl/checkpoints \ algorithm.adv_estimator=grpo \ actor_rollout_ref.rollout.n=8 \ trainer.total_epochs=2"Pantau log di Dasbor Ray atau output konsol. Cari
critic/score/meanyang meningkat, yang menunjukkan pembelajaran.Setelah pelatihan selesai, titik pemeriksaan model terlatih dapat ditemukan di
gs://$GS_BUCKET/verl/checkpoints.
A4X
Mendapatkan nama Pod head Ray:
export HEAD_POD=$(kubectl get pod -n ${NAMESPACE} -l ray.io/node-type=head -o jsonpath='{.items[0].metadata.name}')Konfigurasi file lingkungan runtime Ray secara langsung di Pod head:
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'Kirimkan tugas pelatihan GRPO dengan menjalankan Pod head Ray:
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'Pantau log tugas (menggunakan ID unik yang ditampilkan oleh
ray job submit):kubectl exec ${HEAD_POD} -c ray-head -- ray job logs <var>JOB_ID</var> --followGanti
JOB_ID. Konfirmasi bahwa NVLink lintas node aktif dengan mencari baris NCCL dalam log yang berisivia P2P/MNNVL.
Pembersihan
Untuk menghindari biaya, hapus resource:
A4 dan A3 Ultra
kubectl delete raycluster b200-ray-cluster
gcloud container clusters delete ${CLUSTER_NAME} --location=${CONTROL_PLANE_REGION}
gcloud storage rm -r gs://${GS_BUCKET}
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}