1. บทนำ
หากต้องการเรียกใช้สคริปต์ที่แพ็กไว้โดยตรงโดยไม่ต้องทำตามบทแนะนำทีละขั้นตอน คุณสามารถค้นหาสคริปต์ได้ในที่เก็บ GoogleCloudPlatform/devrel-demos
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีทําให้ไปป์ไลน์การฝึกที่มีประสิทธิภาพสูงสําหรับการเรียนรู้แบบเสริมกําลัง (RL) ใช้งานได้โดยใช้ Google Kubernetes Engine (GKE) และ Managed Lustre
ภาระงานการเรียนรู้แบบเสริมกำลัง โดยเฉพาะอย่างยิ่งภาระงานที่ใช้อัลกอริทึม เช่น การเพิ่มประสิทธิภาพนโยบายแบบสัมพัทธ์ของกลุ่ม (GRPO) จะสร้างข้อมูลจำนวนมหาศาลในระหว่าง "การสร้างประสบการณ์" และต้องมีการตรวจสอบเป็นระยะๆ ที่เก็บข้อมูลออบเจ็กต์มาตรฐานอาจทำให้เกิดคอขวดระหว่างการเพิ่ม I/O เหล่านี้ ซึ่งทำให้ตัวเร่งความเร็วที่มีราคาแพงไม่ได้ใช้งาน
คุณจะใช้ Managed Lustre ซึ่งเป็นระบบไฟล์แบบขนานเพื่อขจัดจุดคอขวดเหล่านี้และเพิ่มอัตราการส่งข้อมูลการฝึก
สิ่งที่คุณต้องทำ
- กำหนดค่าตัวแปรสภาพแวดล้อมสำหรับคลัสเตอร์ Ray ที่ใช้ GPU
- จัดสรรคลัสเตอร์ GPU แบบสปอตใน GKE และอินสแตนซ์ Lustre ที่มีการจัดการโดยใช้ชุดเครื่องมือคลัสเตอร์
- ทําให้คลัสเตอร์ KubeRay ใช้งานได้และติดตั้งระบบไฟล์ Lustre
- ส่งภาระงานการฝึก NeMo-RL
- สังเกตการณ์การส่งข้อความปริมาณมากและเวลาในการตอบสนองของจุดตรวจสอบต่ำโดยใช้ Cloud Monitoring

สิ่งที่คุณต้องมี
- เว็บเบราว์เซอร์ เช่น Chrome
- โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
Codelab นี้เหมาะสำหรับผู้ใช้ด้านเทคนิคขั้นสูง วิศวกรแพลตฟอร์ม และนักวิจัย AI ที่คุ้นเคยกับแนวคิดของ GKE และพื้นที่เก็บข้อมูล
ระยะเวลารวมโดยประมาณ: 45-60 นาที บวกเวลาฝึกอบรม 2 ชั่วโมง
2. ก่อนเริ่มต้น
สร้างโปรเจ็กต์ Google Cloud
- ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud
- ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์แล้ว
เริ่มต้น Cloud Shell
Cloud Shell คือสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud ซึ่งโหลดเครื่องมือที่จำเป็นไว้ล่วงหน้า
- คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud
- เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ยืนยันการตรวจสอบสิทธิ์โดยทำดังนี้
gcloud auth list - ตรวจสอบว่าได้กำหนดค่าโปรเจ็กต์แล้ว
gcloud config get project - หากไม่ได้ตั้งค่าโปรเจ็กต์ตามที่คาดไว้ ให้ตั้งค่าดังนี้
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
ติดตั้งชุดเครื่องมือของคลัสเตอร์
Codelab นี้ใช้ Cluster Toolkit (gcluster) เพื่อติดตั้งใช้งานคลัสเตอร์ GKE ดูวิธีการตั้งค่า Cluster Toolkit ได้ที่คู่มือการตั้งค่า Cluster Toolkit
เปิดใช้ API
เรียกใช้คำสั่งนี้ใน Cloud Shell เพื่อเปิดใช้ API ที่จำเป็นทั้งหมด
gcloud services enable \
container.googleapis.com \
lustre.googleapis.com \
compute.googleapis.com \
servicenetworking.googleapis.com
3. กำหนดค่าตัวแปรสภาพแวดล้อม
ตั้งค่าตัวแปรสภาพแวดล้อม 2-3 ตัวเพื่อให้คำสั่งใน Codelab นี้สอดคล้องกัน
สร้างไฟล์ชื่อ env.sh และป้อนข้อมูลการกำหนดค่า คุณใช้เทมเพลตต่อไปนี้ได้
# Environment Variables for the RL Demo execution
export PROJECT_ID="{{'<var>'}}PROJECT_ID{{'</var>'}}"
export ZONE="us-east1-b"
export REGION="us-east1"
export CLUSTER_NAME="ray-a4-gpu-spot"
export HF_TOKEN="{{'<var>'}}YOUR_HF_TOKEN{{'</var>'}}" # Required for downloading models
export WANDB_API_KEY="{{'<var>'}}YOUR_WANDB_API_KEY{{'</var>'}}" # Optional
# Topology defaults
export NUM_NODES="8"
export GPUS_PER_NODE="8" # Fixed for A4/B200 architecture
แทนที่ <YOUR_PROJECT_ID> และ <YOUR_HF_TOKEN> ด้วยค่าจริง
เรียกใช้ไฟล์เพื่อโหลดตัวแปรลงในเซสชันปัจจุบัน
source env.sh
4. ติดตั้งใช้งานคลัสเตอร์ GKE และ Lustre ที่มีการจัดการโดยใช้ Cluster Toolkit
ในขั้นตอนนี้ คุณจะใช้ Cluster Toolkit (gcluster) เพื่อติดตั้งใช้งานคลัสเตอร์ GKE ด้วย GPU แบบสปอต และจัดสรรพื้นที่เก็บข้อมูล Lustre ที่มีการจัดการโดยอัตโนมัติด้วยไดรเวอร์ Lustre CSI และ PersistentVolumeClaim (lustre-pvc) ที่กำหนดค่าไว้ล่วงหน้า
เตรียม Blueprint
ก่อนที่จะติดตั้งใช้งาน โปรดตรวจสอบexamples/gke-a4/gke-a4.yamlพิมพ์เขียว (ดูรายละเอียดได้ที่สร้างคลัสเตอร์ A4)
- เปิดใช้ Lustre ที่มีการจัดการ: ยกเลิกการแสดงความคิดเห็นในส่วนโมดูล
managed-lustreและlustre-pvcในgke-a4.yaml - เปิดใช้ส่วนเสริม RayOperator: ตั้งค่า
enable_ray_operator: trueในการตั้งค่าโมดูลgke_clusterในgke-a4.yaml
ติดตั้งใช้งานโครงสร้างพื้นฐาน
ตั้งค่า CIDR ที่ได้รับอนุญาตสำหรับการเข้าถึง Cloud Shell และทำให้ใช้งานได้โดยใช้ gcluster deploy
export AUTHORIZED_CIDR="$(curl -s ifconfig.me)/32"
gcluster deploy examples/gke-a4/gke-a4.yaml \
--vars project_id=${PROJECT_ID},deployment_name=${CLUSTER_NAME},region=${REGION},zone=${ZONE},static_node_count=${NUM_NODES},authorized_cidr=${AUTHORIZED_CIDR},spot=true
รอให้การติดตั้งใช้งานเสร็จสมบูรณ์ Cluster Toolkit จะจัดสรรเครือข่าย VPC, การ Peering การเข้าถึงบริการส่วนตัว (PSA), ระบบไฟล์ Lustre ที่มีการจัดการ, ไดรเวอร์ Lustre CSI, ส่วนเสริม RayOperator และการอ้างสิทธิ์พื้นที่เก็บข้อมูล Kubernetes (lustre-pvc) โดยอัตโนมัติในการติดตั้งใช้งานที่ประสานงานเดียว
5. ติดตั้งใช้งานคลัสเตอร์ Ray บน GKE
ในขั้นตอนนี้ คุณจะทำให้คลัสเตอร์ KubeRay ใช้งานได้ในโหนด GKE และติดตั้งระบบไฟล์ Lustre โดยใช้ PersistentVolumeClaim (lustre-pvc) ที่ Cluster Toolkit จัดสรรให้โดยอัตโนมัติ
สร้างการกำหนดค่า RayCluster
สร้างไฟล์ชื่อ ray-cluster.yaml ซึ่งจะระบุโหนดหัวหน้าและโหนด Worker ของ KubeRay โดยใช้nvidia-b200ประเภทตัวเร่งและติดตั้งวอลุ่ม Lustre ที่ /lustre
cat << EOF > ray-cluster.yaml
apiVersion: ray.io/v1
kind: RayCluster
metadata:
name: ${CLUSTER_NAME}
namespace: default
spec:
rayVersion: '2.54.0'
headGroupSpec:
rayStartParams:
dashboard-host: '0.0.0.0'
template:
spec:
nodeSelector:
cloud.google.com/gke-accelerator: nvidia-b200
tolerations:
- key: "nvidia.com/gpu"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: ray-head
image: nvcr.io/nvidia/nemo-rl:v0.4.0
ports:
- containerPort: 6379
name: gcs-server
- containerPort: 8265
name: dashboard
- containerPort: 10001
name: client
resources:
limits:
cpu: "32"
memory: "1000Gi"
requests:
cpu: "8"
memory: "64Gi"
volumeMounts:
- mountPath: /lustre
name: lustre-storage
volumes:
- name: lustre-storage
persistentVolumeClaim:
claimName: lustre-pvc
workerGroupSpecs:
- groupName: gpu-worker-group
replicas: ${NUM_NODES}
minReplicas: ${NUM_NODES}
maxReplicas: ${NUM_NODES}
rayStartParams: {}
template:
spec:
nodeSelector:
cloud.google.com/gke-accelerator: nvidia-b200
tolerations:
- key: "nvidia.com/gpu"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: ray-worker
image: nvcr.io/nvidia/nemo-rl:v0.4.0
resources:
limits:
nvidia.com/gpu: "8"
cpu: "100"
memory: "1000Gi"
requests:
nvidia.com/gpu: "8"
cpu: "100"
memory: "1000Gi"
volumeMounts:
- mountPath: /lustre
name: lustre-storage
- mountPath: /dev/shm
name: dshm
volumes:
- name: lustre-storage
persistentVolumeClaim:
claimName: lustre-pvc
- name: dshm
emptyDir:
medium: Memory
EOF
เชื่อมต่อกับคลัสเตอร์
ตรวจสอบว่าเซสชัน Cloud Shell ได้รับการตรวจสอบสิทธิ์กับคลัสเตอร์ GKE แล้ว
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--region ${REGION} \
--project ${PROJECT_ID}
ใช้การกำหนดค่า RayCluster
ใช้การกำหนดค่าคลัสเตอร์ Ray
kubectl apply -f ray-cluster.yaml
ตรวจสอบสถานะคลัสเตอร์
ตรวจสอบการสร้างพ็อด
kubectl get pods -w
รอจนกว่าพ็อดส่วนหัวและพ็อดของ Worker จะเป็น Running
6. ส่งภาระงานการเรียนรู้แบบเสริมกำลัง
ในขั้นตอนนี้ คุณจะส่งงานการฝึก GRPO ของ NeMo-RL ไปยังคลัสเตอร์ Ray
เชื่อมต่อกับแดชบอร์ดของ Ray
หากต้องการส่งงานและดูเมตริก คุณต้องเชื่อมต่อกับแดชบอร์ด Ray เนื่องจากแดชบอร์ดอยู่ใน GKE ให้ใช้การส่งต่อพอร์ตเพื่อเข้าถึงจาก Cloud Shell โดยทำดังนี้
# Run this in a separate Cloud Shell tab or in the background
kubectl port-forward service/${CLUSTER_NAME}-head-svc 8265:8265 &
สร้างสคริปต์การดำเนินการ
สร้างไฟล์ชื่อ run_nemo_rl.sh สคริปต์นี้จะดำเนินการใน Worker ของคลัสเตอร์ Ray เราใช้ cat << EOF เพื่อป้อนตัวแปรสภาพแวดล้อมที่คุณตั้งค่าไว้ก่อนหน้านี้
cat << EOF > run_nemo_rl.sh
#!/bin/bash
set -ex
# Override job runtime conflicts (NeMo-RL passes os.environ to ray.init)
export RAY_OVERRIDE_JOB_RUNTIME_ENV=1
echo "--- Running on Ray Cluster ---"
cd /opt/nemo-rl
# Ensure directories exist on the high-speed Lustre drive
mkdir -p /lustre/huggingface_cache
mkdir -p /lustre/nemo_rl_qwen_72b_ds_cp
echo "Launching NeMo-RL GRPO training..."
uv run python examples/run_grpo_math.py \
--config examples/configs/grpo_math_70B_megatron.yaml \
policy.model_name='Qwen/Qwen2.5-72B-Instruct' \
policy.megatron_cfg.converter_type='Qwen2ForCausalLM' \
logger.wandb_enabled=False \
cluster.num_nodes=${NUM_NODES} \
cluster.gpus_per_node=${GPUS_PER_NODE} \
logger.wandb.name='nemo-rl-grpo-test1' \
grpo.max_num_steps=20 \
grpo.num_generations_per_prompt=8 \
grpo.num_prompts_per_step=32 \
policy.train_global_batch_size=256 \
checkpointing.enabled=True \
checkpointing.save_period=2 \
checkpointing.keep_top_k=2 \
checkpointing.metric_name=null \
checkpointing.checkpoint_dir=/lustre/nemo_rl_qwen_72b_ds_cp/nemo-rl-grpo-test1 \
data.dataset_name='DeepScaler'
EOF
chmod +x run_nemo_rl.sh
สร้างไฟล์ Ray Ignore
สร้างไฟล์ .rayignore เพื่อป้องกันไม่ให้ Ray อัปโหลดไดเรกทอรีขนาดใหญ่หรือไดเรกทอรีที่ไม่จำเป็น
cat << EOF > .rayignore
cluster-toolkit/
.git/
*.sh.log
EOF
สร้างการกำหนดค่าสภาพแวดล้อมรันไทม์
สร้างไฟล์ JSON เพื่อส่งตัวแปรสภาพแวดล้อมไปยังงาน Ray
cat << EOF > ray_runtime_env_nemo.json
{
"env_vars": {
"HF_TOKEN": "${HF_TOKEN}",
"WANDB_API_KEY": "${WANDB_API_KEY}",
"HF_HOME": "/lustre/huggingface_cache",
"GLOO_SOCKET_IFNAME": "eth0",
"NCCL_SOCKET_IFNAME": "eth0"
}
}
EOF
ส่งงาน
ใช้ Ray CLI เพื่อส่งงานไปยังปลายทางแดชบอร์ด หากไม่พบคำสั่ง ray ใน Cloud Shell คุณสามารถติดตั้งได้ด้วย pip install ray ดังนี้
ray job submit \
--address="http://localhost:8265" \
--working-dir . \
--runtime-env ray_runtime_env_nemo.json \
-- bash run_nemo_rl.sh
คุณจะเห็นบันทึกที่สตรีมในเทอร์มินัล Cloud Shell งานจะโหลดโมเดล เริ่มต้นใช้งาน Worker ของ Ray และเริ่มลูปการฝึก GRPO
7. ตรวจสอบประสิทธิภาพการฝึก
ในขั้นตอนนี้ คุณจะสังเกตประสิทธิภาพของระบบไฟล์ Lustre ระหว่างการฝึกและการตรวจสอบ
ตรวจสอบบันทึกการฝึก
เมื่อการฝึกดำเนินไป คุณจะเห็นบันทึกที่ระบุว่าระบบกำลังบันทึกจุดตรวจไปยัง /lustre/nemo_rl_qwen_72b_ds_cp/nemo-rl-grpo-test1 โปรดทราบว่าการสร้างจุดตรวจสอบจะเกิดขึ้นแบบไม่พร้อมกันและจะไม่บล็อก Worker ของ Ray เป็นเวลานาน
หากต้องการดูความเร็วของการตรวจสอบ ให้มองหาบรรทัดบันทึกที่ระบุจุดตรวจสอบที่บันทึกไว้
ดูเมตริก Lustre ใน Cloud Console
วิธีดูเมตริกสำหรับอินสแตนซ์ Lustre
- ใน คอนโซล Google Cloud ให้ค้นหา Managed Service for Lustre
- คลิกชื่ออินสแตนซ์ (เช่น
${CLUSTER_NAME}-lustreหรือrl-demo-gpu-lustre) - คลิกแท็บการตรวจสอบ
โดยคุณจะดูข้อมูลต่อไปนี้ได้
- อัตราการส่งข้อมูล (ไบต์/วินาที): ดูจุดสูงสุดระหว่างการตรวจสอบ
- ความจุ: ตรวจสอบว่าจุดตรวจสอบใช้พื้นที่เท่าใด
Lustre สามารถเขียนด้วยความเร็วสูงมากและเขียนจุดตรวจสอบได้ในเวลาอันสั้น
8. ล้างข้อมูลทรัพยากร
เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อทำลายโครงสร้างพื้นฐานที่จัดสรรทั้งหมด (คลัสเตอร์ GKE, Node Pool ของ GPU, อินสแตนซ์ Lustre ที่มีการจัดการ และเครือข่าย VPC) ในขั้นตอนเดียว
gcluster destroy "${CLUSTER_NAME}"
คำสั่งนี้จะทำงานแบบซิงโครนัสในเบื้องหน้า โดยจะทำลายโครงสร้างพื้นฐานทั้งหมดที่การติดตั้งใช้งานจัดการ และส่งบันทึกความคืบหน้าไปยังเทอร์มินัล โปรดรอให้คำสั่งเสร็จสมบูรณ์ก่อนปิดเซสชัน Cloud Shell
9. ขอแสดงความยินดี
คุณทำ Codelab Scale Reinforcement Learning with GKE and Managed Lustre เสร็จสมบูรณ์แล้ว
สิ่งที่คุณได้เรียนรู้
- วิธีใช้ชุดเครื่องมือคลัสเตอร์เพื่อจัดสรรคลัสเตอร์ GPU ของ GKE ด้วยอินสแตนซ์สปอตและพื้นที่เก็บข้อมูล Lustre ที่มีการจัดการ
- วิธีติดตั้งใช้งานคลัสเตอร์ KubeRay และเมานต์พื้นที่เก็บข้อมูล Lustre
- วิธีส่งภาระงานการฝึก GRPO ของ NeMo-RL
- วิธีสังเกตประสิทธิภาพของพื้นที่เก็บข้อมูลระหว่างการฝึก
ขั้นตอนถัดไป
- สำรวจฟีเจอร์อื่นๆ ของ NVIDIA NeMo-RL
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Cloud AI Hypercomputer
- อ่านเอกสารประกอบของ Managed Service for Lustre