1. مقدمة
إذا كنت تفضّل تشغيل النصوص البرمجية المجمّعة مباشرةً بدون البرنامج التعليمي المفصّل، يمكنك العثور عليها في مستودع GoogleCloudPlatform/devrel-demos.
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية نشر مسار تدريب عالي الأداء لـ "التعلّم المعزّز" (RL) باستخدام Google Kubernetes Engine (GKE) وManaged Lustre.
تنتج أحمال عمل التعلّم المعزّز، لا سيما تلك التي تستخدم خوارزميات مثل Group Relative Policy Optimization (GRPO)، كميات هائلة من البيانات أثناء "إنشاء التجربة" وتتطلّب إنشاء نقاط حفظ متكرّرة. يمكن أن يؤدي تخزين الكائنات العادي إلى حدوث اختناقات أثناء عمليات الإدخال والإخراج المكثّفة هذه، ما يؤدي إلى عدم الاستفادة من أدوات التسريع باهظة الثمن.
ستستخدم Managed Lustre، وهو نظام ملفات متوازٍ، لإزالة هذه المؤثِّرات السلبية وتحقيق سرعة معالجة بيانات أعلى للتدريب.
الإجراءات التي ستنفذّها
- ضبط متغيرات البيئة لمجموعة Ray تستند إلى وحدة معالجة الرسومات
- توفير مجموعة من وحدات معالجة الرسومات (GPU) الفورية على GKE ومثيل Managed Lustre باستخدام Cluster Toolkit
- نشر مجموعة KubeRay وتحميل نظام ملفات Lustre
- أرسِل وحدة عمل تدريب NeMo-RL.
- مراقبة معدّل أعلى لنقل البيانات ووقت الاستجابة المنخفض لنقاط التحقّق باستخدام Cloud Monitoring

المتطلبات
- متصفّح ويب، مثل Chrome
- مشروع Google Cloud تم تفعيل الفوترة فيه
هذا الدرس التطبيقي حول الترميز مخصّص للمستخدمين الفنيين المتقدّمين ومهندسي المنصات وباحثي الذكاء الاصطناعي الذين يعرفون مفاهيم GKE والتخزين.
إجمالي المدة المقدَّرة: من 45 إلى 60 دقيقة بالإضافة إلى ساعتين من وقت التدريب
2. قبل البدء
إنشاء مشروع على Google Cloud
- في Google Cloud Console، اختَر مشروعًا على 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
تثبيت Cluster Toolkit
يستخدم هذا الدرس التطبيقي حول الترميز Cluster Toolkit (gcluster) لنشر مجموعة GKE. للحصول على تعليمات حول كيفية إعداد Cluster Toolkit، يُرجى الاطّلاع على دليل إعداد Cluster Toolkit.
تفعيل واجهات برمجة التطبيقات
نفِّذ هذا الأمر في Cloud Shell لتفعيل جميع واجهات برمجة التطبيقات المطلوبة:
gcloud services enable \
container.googleapis.com \
lustre.googleapis.com \
compute.googleapis.com \
servicenetworking.googleapis.com
3- ضبط متغيرات البيئة
للحفاظ على اتساق الأوامر في هذا الدرس التطبيقي حول الترميز، عليك إعداد بعض متغيّرات البيئة.
أنشئ ملفًا باسم 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 وManaged Lustre باستخدام Cluster Toolkit
في هذه الخطوة، ستستخدم "مجموعة أدوات إنشاء المجموعات" (gcluster) لنشر مجموعة GKE مع وحدات معالجة الرسومات Spot وتوفير مساحة تخزين Managed Lustre تلقائيًا باستخدام برنامج تشغيل Lustre CSI وPersistentVolumeClaim (lustre-pvc) الذي تم إعداده مسبقًا.
إعداد المخطط التفصيلي
قبل النشر، راجِع مخطط examples/gke-a4/gke-a4.yaml (للحصول على التفاصيل، اطّلِع على إنشاء مجموعة A4):
- تفعيل Managed 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)، والربط بين شبكتين باستخدام ميزة "الوصول إلى الخدمات الخاصة" (PSA)، ونظام الملفات Managed Lustre، وبرنامج تشغيل Lustre CSI، وإضافة RayOperator، وطلب مساحة التخزين في Kubernetes (lustre-pvc) تلقائيًا في عملية نشر منسَّقة واحدة.
5- تفعيل مجموعة Ray على GKE
في هذه الخطوة، ستنشئ مجموعة KubeRay على عقد GKE وتثبّت نظام ملفات Lustre باستخدام PersistentVolumeClaim (lustre-pvc) الذي توفّره أداة Cluster Toolkit تلقائيًا.
إنشاء إعدادات RayCluster
أنشئ ملفًا باسم ray-cluster.yaml. يحدّد هذا الإعداد عقدَي 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
انتظِر إلى أن تصبح وحدات head وworker Running.
6. إرسال حمل عمل للتعلّم التعزيزي
في هذه الخطوة، سترسل مهمة تدريب NeMo-RL GRPO إلى مجموعة 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. سيتم تنفيذ هذا النص البرمجي على العاملين في مجموعة 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
أنشئ ملف .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
إرسال مهمة الترجمة
استخدِم واجهة سطر الأوامر (CLI) في Ray لإرسال المهمة إلى نقطة نهاية لوحة البيانات. إذا لم يتم العثور على الأمر 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. ستحمّل المهمة النموذج، وستبدأ العاملين في Ray، وستبدأ حلقة تدريب GRPO.
7. مراقبة أداء التدريب
في هذه الخطوة، ستراقب أداء نظام ملفات Lustre أثناء التدريب وإنشاء نقاط التحقّق.
التحقّق من سجلّات التدريب
مع تقدّم التدريب، ستظهر لك سجلّات تشير إلى أنّه يتم حفظ نقاط التحقّق في /lustre/nemo_rl_qwen_72b_ds_cp/nemo-rl-grpo-test1. يُرجى العِلم أنّ عملية إنشاء نقاط التحقّق تتم بشكل غير متزامن ولا تحظر العاملين في Ray لفترة طويلة جدًا.
لعرض سرعة إنشاء نقاط التحقّق، ابحث عن أسطر السجلّ التي تشير إلى نقاط التحقّق المحفوظة.
عرض مقاييس Lustre في Cloud Console
للاطّلاع على مقاييس نسخة Lustre، اتّبِع الخطوات التالية:
- في Google Cloud Console، ابحث عن Managed Service for Lustre.
- انقر على اسم مثيلك (على سبيل المثال،
${CLUSTER_NAME}-lustreأوrl-demo-gpu-lustre). - انقر على علامة التبويب المراقبة.
يمكنك هنا ملاحظة ما يلي:
- معدل نقل البيانات (بايت/ثانية): اطّلِع على الارتفاعات المفاجئة أثناء إنشاء نقاط التحقّق.
- السعة: يمكنك تتبُّع مقدار المساحة التي تستهلكها نقاط التحقّق.
يمكن لـ Lustre الكتابة بسرعة عالية جدًا، وكتابة نقاط التحقّق في أقل وقت ممكن
8. تنظيف الموارد
نفِّذ الأمر التالي في Cloud Shell لإيقاف تشغيل جميع البنية الأساسية التي تم توفيرها (مجموعة GKE ومجموعات عقد وحدات معالجة الرسومات ومثيل Managed Lustre وشبكة VPC) في خطوة واحدة:
gcluster destroy "${CLUSTER_NAME}"
يتم تنفيذ هذا الأمر بشكل متزامن في المقدّمة، ما يؤدي إلى إيقاف جميع البنية الأساسية التي تديرها عملية النشر وعرض سجلّات التقدّم في نافذة الأوامر. انتظِر إلى أن يكتمل الأمر تمامًا قبل إغلاق جلسة Cloud Shell.
9. تهانينا
لقد أكملت بنجاح الدرس التطبيقي حول الترميز توسيع نطاق التعلّم المعزّز باستخدام GKE وManaged Lustre.
ما تعلّمته
- كيفية استخدام Cluster Toolkit لتوفير مجموعة وحدات معالجة الرسومات (GPU) في GKE مع مثيلات Spot ومساحة تخزين Lustre المُدارة
- كيفية نشر مجموعة KubeRay وتثبيت مساحة تخزين Lustre
- كيفية إرسال عبء عمل تدريب GRPO في NeMo-RL
- كيفية مراقبة أداء التخزين أثناء التدريب
الخطوات التالية
- استكشاف المزيد من ميزات NVIDIA NeMo-RL
- مزيد من المعلومات حول Google Cloud AI Hypercomputer
- راجِع مستندات Managed Service for Lustre.