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, menggunakan Alokasi Resource Dinamis (DRA) GKE untuk jalur Autopilot.
- Node A4X (GB200) berbasis Arm: Siapkan dan lakukan penskalaan menggunakan Superchip Grace Blackwell NVIDIA, 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 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:
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 mana pun 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:
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.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:
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_RESERVATION_NAME: nama reservasi kapasitas Anda.YOUR_HF_TOKEN: token Hugging Face Anda.- Khusus edisi Standar Google Kubernetes Engine (GKE):
GVNIC_NAME(GKE Standard - A4 atau A3 Ultra saja): 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.
Clone repositori contoh:
Buka direktori kerja untuk mode GKE yang Anda pilih:
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.
Membuat jaringan dan subnet RDMA (khusus GKE Standard - A4 dan A3 Ultra)
A4 dan A3 Ultra
Autopilot
Bagian ini hanya diperlukan untuk GPU Ultra A4 dan A3 Standard GKE.
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 Standard GKE.
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 memulai 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}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 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 pada 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 tugas penyiapan data:
Luncurkan tugas:
Pantau tugas:
Standar
Periksa tugas penyiapan data:
Luncurkan tugas:
Pantau 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 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
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 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 Klien Ray:
Memulihkan Layanan Head Ray:
Siapkan penerusan port ke node dasbor Ray. Gunakan jendela terminal terpisah untuk langkah ini karena perintah ini memblokir terminal saat dijalankan. Gunakan
Control+C untuk menghentikannya: Periksa 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: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
Autopilot
Hapus cluster Ray:
Hapus Cloud Storage FUSE:
Hapus resource DRANET:
Hapus bucket Cloud Storage:
Hapus cluster GKE:
Standar
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}