Tutorial ini menunjukkan cara mengorkestrasi 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 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, menggunakan Alokasi Resource Dinamis (DRA) GKE untuk jalur Autopilot.
- Node A4X (GB200) berbasis Arm: Siapkan dan lakukan penskalaan menggunakan Superchip NVIDIA GB200 Grace Blackwell, 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 itu reinforcement learning?
Pengoptimalan Kebijakan Relatif Grup (GRPO)
GRPO, sebuah algoritma yang dipopulerkan oleh DeepSeek, menawarkan alternatif yang hemat memori untuk Proximal Policy Optimization (PPO) dalam penyelarasan LLM dengan menghapus model Critic. Alih-alih jaringan Critic, 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 yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator
(
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, jika ada yang belum diaktifkan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). 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 yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator
(
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, jika ada yang belum diaktifkan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Memberikan peran ke akun pengguna Anda. Jalankan perintah berikut satu kali untuk setiap peran IAM berikut:
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
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 Google Cloud jendela konsol, klik tombol Activate Cloud Shell.
Tetapkan variabel lingkungan:
A4 dan A3 Ultra
Autopilot
Standar
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=ddbcdb7Ganti nilai berikut:
YOUR_REGION: region Compute Engine untuk bidang kontrol cluster GKE.YOUR_ZONE: zona tempat node dipesan. Untuk mengetahui informasi selengkapnya, lihat Ketersediaan GPU.YOUR_CLUSTER_NAME: nama cluster GKE Anda.YOUR_KSA_NAME: nama akun layanan Kubernetes Anda.YOUR_GCS_BUCKET: nama dasar untuk bucket Cloud Storage Anda. Anda tidak perlu menentukan awalangs://.YOUR_GPU_TYPE: akselerator yang Anda pesan dalam reservasi kapasitas Compute Engine. Nilainya harus berupa salah satu dari nilai berikut:nvidia-gb200: A4X (GB200 Superchips)nvidia-b200: A4 (GPU B200)nvidia-h200-141gb: A3 Ultra (GPU H200)
YOUR_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
YOUR_CPU_MACHINE_TYPE: jenis mesin Compute Engine untuk node pool default CPU. Gunakan jenis mesinhighmemdengan minimal 16 vCPU yang didukung di zona cluster Anda, sepertin4-highmem-16ataun2d-highmem-16.YOUR_RESERVATION_NAME: nama reservasi kapasitas Anda.YOUR_HF_TOKEN: token Hugging Face Anda.- Gunakan variabel berikut saat menyiapkan lingkungan di cluster GKE Standard:
YOUR_GVNIC_NAME(Khusus A4 atau A3 Ultra): awalan untuk nama jaringan gVNIC. Anda dapat menggunakan awalan apa pun yang Anda inginkan.YOUR_RDMA_NAME(khusus A4 atau A3 Ultra): awalan untuk jaringan remote direct memory access (RDMA). Anda dapat menggunakan awalan apa pun yang Anda inginkan.
Gandakan repositori contoh:
Buka direktori kerja untuk mode GKE pilihan Anda:
A4 dan A3 Ultra
Autopilot
Standar
A4X
Tidak ada perubahan direktori yang diperlukan. Anda dapat langsung melanjutkan ke bagian berikutnya.
Menyiapkan infrastruktur
Di bagian ini, Anda akan membuat jaringan VPC standar dan cluster GKE.
Buat jaringan dan subnet RDMA (GKE Standard - A4 dan A3 Ultra saja)
A4 dan A3 Ultra
Autopilot
Bagian ini hanya diperlukan untuk GPU Ultra A4 dan A3 GKE Standard.
Jika Anda menggunakan Autopilot, lewati bagian ini dan langsung lanjutkan ke Membuat cluster GKE. GKE secara otomatis menyediakan jaringan dan subnet VPC yang diperlukan, serta menggunakan DRANET yang dikelola GKE untuk mengalokasikan resource ini ke Pod Anda. Anda tidak perlu membuat infrastruktur jaringan secara manual.
Standar
Buat jaringan VPC untuk antarmuka gVNIC:
Buat jaringan VPC untuk RDMA:
Buat 8 subnet RDMA untuk 8 GPU:
A4X
Bagian ini hanya diperlukan untuk GPU Ultra A4 dan A3 GKE Standard.
Jika Anda menggunakan GPU A4X (GB200), lewati bagian ini dan langsung lanjutkan ke
Membuat cluster GKE. Untuk GPU A4X (GB200) atau Autopilot, 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.
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:
Dapatkan kredensial untuk cluster Anda:
Standar
Buat cluster Standard:
Dapatkan kredensial untuk cluster Anda:
Buat node pool GPU. Node pool ini menggunakan reservasi Anda untuk memastikan ketersediaan. Anda mulai dengan dua node:
Instal penginstal NCCL RDMA yang digunakan untuk cluster Standard:
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}Verifikasi bahwa 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 GKE Standard - A4 dan A3 Ultra)
A4 dan A3 Ultra
Autopilot
Langkah ini diperlukan untuk penyiapan GPU GKE Standard (khusus A4 dan A3 Ultra). Jika Anda menggunakan A4X (GB200), GKE akan mengelola antarmuka jaringan secara otomatis, jadi lewati bagian ini.
Standar
Periksa manifes
network-mapping.yaml:Terapkan manifes:
A4X
Langkah ini diperlukan untuk penyiapan GPU GKE Standard (khusus A4 dan A3 Ultra). Jika Anda menggunakan A4X (GB200), GKE akan mengelola antarmuka jaringan secara otomatis, jadi lewati bagian ini.
Menyiapkan data dan penyimpanan
Mengonfigurasi resource Cloud Storage dan Kubernetes:
Membuat bucket Cloud Storage:
Buat Akun Layanan Kubernetes (KSA) dan ikat ke bucket:
Buat Secret untuk Hugging Face:
Periksa manifes
gcsfuse-storage.yaml:Terapkan manifes:
Menyiapkan DRANET
Konfigurasi DRANET Anda:
A4 dan A3 Ultra
Autopilot
Buat manifes ComputeClass:
Terapkan manifes
computeclass-dranet.yaml(dibuat di langkah sebelumnya) dan manifesresourceclaim-dranet.yaml(termasuk dalam repositori contoh):
Standar
Tidak diperlukan penyiapan DRANET. Anda dapat langsung melanjutkan ke bagian berikutnya.
A4X
DRANET ditetapkan oleh Cluster Toolkit. Anda dapat langsung melanjutkan ke bagian berikutnya.
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:
A4 dan A3 Ultra
Autopilot
Periksa manifes
data-prep-job.yaml, yang mengonfigurasi tugas penyiapan data:Luncurkan tugas:
Periksa status Pod:
Setelah Pod
data-prep-jobmencapai statusRunning, tekan Control+C untuk berhenti melihat.Pantau tugas:
Perintah
kubectl logsmenampilkan output minimal atau tidak ada output hingga Pod mencapai statusRunning.
Standar
Periksa manifes
data-prep-job.yaml, yang mengonfigurasi Tugas penyiapan data:Luncurkan Tugas:
Memantau Tugas:
A4X
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 (download ini memerlukan ruang disk sekitar 66 GB):
hf download Qwen/Qwen2.5-32B-Instruct --local-dir Qwen2.5-32B-InstructUpload model, data, dan kode verifikasi 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 worker yang didukung GPU.
A4 dan A3 Ultra
Pilih mode cluster GKE yang Anda gunakan untuk membuat cluster:
Autopilot
Periksa workload RayCluster:
Terapkan RayCluster:
Standar
Periksa workload RayCluster:
Terapkan RayCluster:
A4X
Buat RDMA
ResourceClaimTemplatedan NVIDIAComputeDomain. Setiap Pod pekerja GPU mengklaim empat NIC RDMA (semua jalur node-nya) dan satu channel 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 head Pod dan empat worker Pod berada dalam status
Running:kubectl get pods -w
Luncurkan Tugas GRPO
Konfigurasi dan kirim tugas pelatihan reinforcement learning:
A4 dan A3 Ultra
Pilih mode cluster GKE yang Anda gunakan untuk membuat cluster:
Autopilot
Siapkan Klien Ray:
Memulihkan Layanan Head Ray:
Siapkan penerusan port ke node dasbor Ray. Proses berjalan di latar belakang, sehingga Anda dapat terus menjalankan perintah di sesi terminal yang sama.
Untuk menghentikan loop penerusan port, gunakan perintah
kill ${PF_LOOP_PID}.Periksa manifes
runtime-env.yaml:Jika Anda menggunakan GPU H200, ubah nilai variabel lingkungan
NCCL_CONF_FILEmenjadi/usr/local/gib/configs/nccl.a3u.conf.File ini digunakan oleh klien Ray. Anda tidak perlu menerapkan manifes ini ke cluster.
Kirimkan tugas menggunakan perintah
ray job submit:Pantau log tugas pelatihan dan cari
critic/score/meanmetrik yang meningkat, yang menunjukkan bahwa model sedang belajar:- Dasbor Ray:
- Buka
http://localhost:8265di browser Anda. Jika Anda menggunakan Cloud Shell, klik Web Preview, pilih Change port, lalu masukkan8265. - Buka tab Tugas.
- Klik ID pekerjaan Anda.
- Filter log menurut kata kunci
criticuntuk memeriksacritic/score/mean.
- Buka
Terminal: Karena tugas dikirimkan secara asinkron dengan flag
--no-wait, streaming log tugas di terminal Anda dengan menjalankan perintah berikut:
- Dasbor Ray:
Setelah pelatihan selesai, verifikasi bahwa checkpoint model telah disimpan ke bucket Cloud Storage Anda dengan mencantumkan konten direktori:
Atau, lihat titik pemeriksaan di konsol Google Cloud dengan membuka Cloud Storage > Buckets, memilih
YOUR_GCS_BUCKET, lalu membuka folderverl/checkpoints.
Standar
Siapkan Klien Ray:
Memulihkan Layanan Head Ray:
Siapkan penerusan port ke node dasbor Ray. Proses berjalan di latar belakang, sehingga Anda dapat terus menjalankan perintah di sesi terminal yang sama.
Untuk menghentikan loop penerusan port, gunakan perintah
kill ${PF_PID}.Periksa manifes
runtime-env.yaml:Jika Anda menggunakan GPU H200, ubah nilai variabel lingkungan
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:
Pantau log tugas pelatihan dan cari
critic/score/meanmetrik yang meningkat, yang menunjukkan bahwa model sedang belajar:- Dasbor Ray:
- Buka
http://localhost:8265di browser Anda. Jika Anda menggunakan Cloud Shell, klik Web Preview, pilih Change port, lalu masukkan8265. - Buka tab Tugas.
- Klik ID pekerjaan Anda.
- Filter log menurut kata kunci
criticuntuk memeriksa metrikcritic/score/mean.
- Buka
Output konsol: Karena tugas dikirimkan secara asinkron dengan tanda
--no-wait, streaming log tugas di terminal dengan menjalankan perintah berikut:
- Dasbor Ray:
Setelah pelatihan selesai, verifikasi bahwa checkpoint model telah disimpan ke bucket Cloud Storage Anda dengan mencantumkan konten direktori:
Atau, lihat titik pemeriksaan di konsol Google Cloud dengan membuka Cloud Storage > Buckets, memilih
YOUR_GCS_BUCKET, lalu membuka folderverl/checkpoints.
A4X
Dapatkan 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 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 menjalankannya di 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 di log yang berisivia P2P/MNNVL.
Pembersihan
Untuk menghindari timbulnya biaya, hapus resource:
A4 dan A3 Ultra
Autopilot
Jika loop penerusan port masih berjalan di sesi latar belakang Anda, hentikan:
Hapus cluster Ray:
Hapus Cloud Storage FUSE:
Hapus resource DRANET:
Hapus bucket Cloud Storage:
Hapus cluster GKE:
Standar
Jika loop penerusan port masih berjalan di sesi latar belakang Anda, hentikan:
Hapus cluster Ray:
Hapus Cloud Storage FUSE:
Hapus bucket Cloud Storage:
Hapus cluster GKE:
Hapus jaringan dan subnet VPC:
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}