במדריך הזה תלמדו איך לתזמן סביבת אימון מבוזרת ללמידת חיזוק (RL) ב-Google Kubernetes Engine (GKE). אתם יכולים להשתמש ב-Ray ובמסגרת NVIDIA NeMo RL כדי להגדיר סביבת אימון מבוזרת לצורך כוונון עדין של מודל.
המדריך הזה מתמקד בצינור עיבוד הנתונים לאימון של Group Relative Policy Optimization (GRPO) ב-GKE עם Ray ו-NeMo RL. GRPO הוא אלגוריתם ללמידה חיזוקית שנועד לשפר את יכולת ההסקה של מודל. האלגוריתם הזה חוסך בזיכרון ומפשט את תהליך הלמידה המחוזקת על ידי ביטול של רכיב ה-Critic, או מודל הערך, ושימוש בחישוב יחסי שמבוסס על קבוצה במקום זאת.
לפני שאתם מתחילים את המדריך הזה, אתם צריכים להשלים את המדריך כוונון ושינוי קנה המידה של למידת חיזוק באמצעות verl ב-GKE. במדריך הזה נעשה שימוש באותה הגדרת אשכול ובתצורה כמו במדריך בנושא כוונון עדין של RL ושינוי קנה מידה באמצעות verl.
רקע
בקטעים הבאים מופיעה סקירה כללית קצרה של המושגים שבהם משתמשים במדריך הזה.
למידת חיזוקים (RL)
ב-RL, המודלים לומדים מתוך ניסיון, מחקר ומשוב, ולא מתוך חיקוי סטטי. במהלך האימון המקדים, המודל לומד מה לומר, ובמהלך הלמידה ממשוב אנושי (RLHF), הוא לומד איך להיות מועיל, בטוח והגיוני. למידה מחוזקת משמשת כגשר בין מודל בסיס לבין מודל שעבר כוונון לתרחיש שימוש ספציפי.
אופטימיזציה יחסית של מדיניות קבוצתית (GRPO)
GRPO, אלגוריתם שזכה לפופולריות בזכות DeepSeek, מציע חלופה חסכונית בזיכרון ל-Proximal Policy Optimization (PPO) להתאמת LLM, על ידי הסרת מודל ה-Critic. במקום רשת Critic, GRPO יוצר קבוצה של תשובות לאותה הנחיה ומשתמש בתגמול הממוצע של הקבוצה הזו כבסיס להשוואה.
מידע נוסף זמין במאמר בנושא GRPO.
NVIDIA NeMo RL
NeMo RL היא ספריית קוד פתוח של NVIDIA לפוסט-טריינינג, שמיועדת ל-RL שניתן להתאמה לעומס. NeMo RL הוא חלק ממערכת NeMo הרחבה, והוא מאפשר ניסויים בקנה מידה קטן ב-GPU יחיד ופריסות מרובות צמתים באלפי GPU.
מידע נוסף זמין במאמר NVIDIA NeMo RL.
קבוצת הנתונים GSM8k
במדריך הזה משתמשים במערך הנתונים GSM8k, שמכיל 8,500 בעיות מילוליות במתמטיקה ברמה של בית ספר יסודי, באיכות גבוהה ובמגוון לשוני.
באמצעות GSM8k ו-GRPO, המודל יוצר קבוצה של n תשובות שונות לאותה בעיה. GRPO משווה את התשובות האלה לממוצע של הקבוצה. המודל מקבל תגמול גדול יותר על נתיבים שהם נכונים באופן עקבי והגיוניים בהשוואה לשאר הקבוצה. עם הזמן, המודל לומד שהדרך הכי אמינה למקסם את התגמול היא להסביר את השלבים בצורה ברורה, ולכן הוא מצמצם את התגמול על תשובות עם ביצועים נמוכים.
מידע נוסף זמין במאמר בנושא GSM8k.
מטרות
במדריך הזה מוסבר איך להגדיר RL ב-GKE באמצעות NeMo RL. לשם כך, צריך לבצע את השלבים הבאים:
- מכינים את הסביבה.
- הגדרת אשכול GKE עם מעבדי GPU מסוג B200 או H200.
- מגדירים את KubeRay לניהול אשכול Ray מבוזר.
- משתמשים ב-Managed Lustre לאחסון עם ביצועים גבוהים.
- מריצים משימת אימון של GRPO באמצעות NeMo RL.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים פרויקט ב- Google Cloud :
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API הנדרשים, אם הם עדיין לא מופעלים:
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com -
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים פרויקט ב- Google Cloud :
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם: Google Cloud
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את ממשקי ה-API הנדרשים, אם הם עדיין לא מופעלים:
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com -
מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/container.admin, roles/iam.serviceAccountAdmin, roles/storage.admin, roles/servicenetworking.networksAdmin, roles/compute.networkAdmin, roles/lustre.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט. -
USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה,myemail@example.com. -
ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
-
- יוצרים חשבון ב-Hugging Face, אם עדיין אין לכם חשבון.
- מוודאים שיש לכם אסימון של Hugging Face עם
read access. - אם אין לכם חשבון Weights & Biases (Wandb), אתם צריכים ליצור חשבון.
- יוצרים מפתח API של Wandb.
- מוודאים שלפרויקט Google Cloud שלכם יש מכסה מספקת ל-GPU מסוג B200 ו-H200. מידע נוסף זמין במאמרים תכנון מכסת GPU ומכסת GPU.
- מוודאים של Google Cloud פרויקט יש את המכסה הנדרשת ל-Managed Lustre. מידע נוסף זמין במאמר מכסות ומגבלות של Managed Lustre.
הכנת הסביבה
במדריך הזה משתמשים ב-Cloud Shell.
עוברים אל Google Cloud המסוף.
בחלק העליון של Google Cloud חלון המסוף, לוחצים על הלחצן Activate Cloud Shell.
מגדירים את משתני הסביבה הבאים:
מחליפים את הערכים הבאים:
-
YOUR_REGION: האזור ב-Compute Engine למישור הבקרה של אשכול GKE. -
YOUR_ZONE: האזור של הצמתים. בוחרים אזור שבו זמינים מעבדי GPU מסוג NVIDIA B200 או H200. -
YOUR_LUSTRE_ZONE: האזור של המכונה ב-Managed Lustre. בוחרים אזור שבו Managed Lustre זמין. כדי לשפר את הביצועים, להקטין את זמן האחזור ולמנוע עלויות של תעבורת נתונים יוצאת (egress) ברשת, צריך להשתמש באותו אזור כמוYOUR_ZONE. -
YOUR_CLUSTER_NAME: השם של אשכול GKE. -
YOUR_GPU_TYPE: המאיץ שהזמנתם בהזמנת הקיבולת של Compute Engine. צריך להזין אחד מהערכים הבאים:-
nvidia-b200: NVIDIA B200 (180 GB) nvidia-h200-141gb: NVIDIA H200 (141 GB)
-
-
YOUR_MACHINE_TYPE: סוג המכונה לשימוש:- למעבדי GPU מסוג NVIDIA B200 (180GB), צריך להשתמש בגרסה
a4-highgpu-8gואילך. - למעבדי GPU מסוג NVIDIA H200 (141GB), צריך להשתמש בגרסה
a3-ultragpu-8gואילך.
- למעבדי GPU מסוג NVIDIA B200 (180GB), צריך להשתמש בגרסה
-
YOUR_CPU_MACHINE_TYPE: סוג המכונה ב-Compute Engine עבור מאגר הצמתים שמוגדר כברירת מחדל ל-CPU. משתמשים בסוג מכונהhighmemעם לפחות 16 ליבות וירטואליות (vCPU) שנתמך באזור האשכול, כמוn4-highmem-16אוn2d-highmem-16. -
YOUR_RESERVATION_NAME: השם של הקצאת ה-GPU. -
YOUR_LUSTRE_NAME: השם של מכונת Lustre. -
YOUR_HF_TOKEN: האסימון שלכם ב-Hugging Face. -
YOUR_WANDB_API_KEY: מפתח ה-API של Wandb.
-
יוצרים את משתני הסביבה הבאים לרשת:
מחליפים את הערכים הבאים:
-
YOUR_NETWORK_NAME: התחילית שמשמשת ליצירת השם של רשת ה-VPC לאשכול GKE. -
YOUR_GVNIC_NETWORK_PREFIX: הקידומת של שם רשת gVNIC. אתם יכולים להשתמש בכל קידומת שתרצו. -
YOUR_RDMA_NETWORK_PREFIX: הקידומת של רשת הגישה הישירה לזיכרון (RDMA) מרחוק. אתם יכולים להשתמש בכל קידומת שתרצו.
-
אם הפלאגין KubeRay (בטא) ל-CLI של
kubectlעדיין לא מותקן, מתקינים אותו:הפלאגין הזה מספק פקודות לניהול עומסי עבודה של Ray ב-Kubernetes, כמו פתיחת סשנים אינטראקטיביים ושליחת משימות.
הגדרת התשתית
בקטע הזה, יוצרים רשתות VPC ואשכול GKE.
יצירת רשת VPC
יוצרים רשת VPC לממשק gVNIC:
יוצרים רשת VPC ורשתות משנה ל-RDMA שכוללות שמונה רשתות משנה לשמונה יחידות GPU:
יצירת אשכול GKE
אפשר להגדיר את NeMo RL באשכול GKE Standard.
יצירת אשכול Standard:
מקבלים פרטי כניסה לאשכול:
יוצרים את מאגר הצמתים של ה-GPU:
מתקינים את תוכנת ההתקנה של NCCL RDMA:
הגדרת מיפוי רשת
שומרים את המניפסט הבא בתור
network-mapping.yaml:החלת המניפסט:
הכנת האחסון
בקטע הזה יוצרים מכונה של Managed Lustre, שמקצה את האחסון בביצועים גבוהים שנדרש לעומס העבודה של ה-RL.
מקצים טווח כתובות IP לגישה לשירותים פרטיים:
חיבור הקישוריות:
יצירת מכונה של Managed Lustre:
גישה למכונה קיימת של Managed Lustre באמצעות מנהל התקן ה-CSI של Managed Lustre.
מחפשים את כתובת ה-IP של מכונת Managed Lustre.
שומרים את קובץ המניפסט הבא בשם
lustre-pv.yaml:מחילים את המניפסט:
שומרים את קובץ המניפסט הבא בשם
lustre-pvc.yaml:מחילים את המניפסט:
פריסת RayCluster
בקטע הזה משכפלים את מאגר הדוגמאות, מכינים את קובצי המניפסט ומפריסים את אשכול Ray:
משכפלים את המאגר לדוגמה ומבצעים checkout של הקומיט המאומת:
מנווטים לספריית העבודה:
בודקים את המניפסט של
values.yaml:מחליפים את
NCCL_TUNER_CONFIG_PATHבאחד מהערכים הבאים, בהתאם למאיץ שבו משתמשים במדריך הזה:- NVIDIA B200 (180 GB):
/usr/local/gib/configs/tuner_config_a4.txtpb - NVIDIA H200 (141 GB):
/usr/local/gib/configs/tuner_config_a3u.txtpb
במניפסט הזה, צומת הראש מנהל את העבודה ומארח את לוח הבקרה של Ray. צמתי ה-worker מריצים את משימות האימון.
- NVIDIA B200 (180 GB):
פורסים את אשכול Ray:
במדריך הזה משתמשים בשני צמתי עובד. אם רוצים לשנות את מספר צמתי העובדים, משנים את הערך של
REPLICA_COUNT.מוודאים שה-Pods שמארחים את הצמתים הראשיים והמשניים של Ray פועלים:
הפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE ray-cluster-kuberay-head-sw7dp 2/2 Running 0 33h ray-cluster-kuberay-worker-grp-0-worker-gkbxw 2/2 Running 0 33h ray-cluster-kuberay-worker-grp-0-worker-kdg62 2/2 Running 0 33hיכולות לעבור כ-10 דקות עד שה-Pods יתחילו לפעול.
מוודאים שאשכול Ray פועל:
הפלט אמור להיראות כך:
NAME NAMESPACE DESIRED WORKERS AVAILABLE WORKERS CPUS GPUS TPUS MEMORY CONDITION STATUS AGE ray-cluster-kuberay default 2 2 618 17 0 1573741824k RayClusterProvisioned ready 33h
הפעלת משימת ה-GRPO
אחרי שאשכול Ray מוכן, אתם יכולים לשלוח משימת Ray לאשכול Ray שפועל ב-GKE. NeMo RL מוריד את המודל באופן אוטומטי במהלך ההפעלה של משימת האימון של RL.
כדי לשלוח Ray Job, צריך להתחיל סשן אינטראקטיבי כדי להריץ את ה-Job.
כדי ליצור חיבור מקומי לאשכול Ray, מריצים את הפקודה הזו:
הפקודה הזו מפעילה העברה ליציאה אחרת בין המכונה המקומית לבין הצומת הראשי של Ray באשכול GKE. שימו לב שהטרמינל יהיה תפוס בזמן שהסשן פעיל. כדי להמשיך, צריך לפתוח מכונה נפרדת של הטרמינל.
בטרמינל נפרד, עוברים אל
kubernetes-engine-samples/ai-ml/nemo-rl-on-gke/nemoRL/gemma3-27b-itועורכים את הקובץgemma3-27b-gsm8k.sh:מחליפים את הערכים הבאים בקובץ
gemma3-27b-gsm8k.sh:-
YOUR_WANDB_API_KEY: מפתח ה-API של WandB. -
YOUR_HF_TOKEN: האסימון שלכם ב-Hugging Face.
בקובץ הזה אפשר לראות את ההגדרה להפעלת משימה עם מודל gemma3-27b-it במערך הנתונים GSM8k. כדי להשלים את צינור ההכשרה של GRPO, הסקריפט הזה מגדיר את הפרמטרים הבאים:
-
num_prompts_per_step: 16ו-num_generations_per_prompt: 32: מודל Gemma3-27b-it יוצר קבוצה גדולה של תשובות לכל הנחיה. במקרה כזה, המודל יפיק 512 תשובות (16 × 32 = 512). -
policy.generation.colocated.enabled=False: הפרמטר הזה משבית את התכונה של יצירת תשובות באותו מיקום, כלומר המודל לא יוצר תשובות באותו צומת שבו מתבצע תהליך האימון. ב-RL רגיל, אותם מעבדי GPU מטפלים גם באימון וגם ביצירה. בהגדרה הזו של NeMo RL, מקצים צמתים ספציפיים (שמנוהלים באמצעות הפרמטרpolicy.generation.colocated.resources) רק להסקת מסקנות של vLLM, בעוד ששאר האשכול מתמקד במתמטיקה של אימון כבד. הפרדה בין עומסי העבודה האלה מונעת תחרות על משאבים בין מאגרי האימון שדורשים הרבה זיכרון לבין עומסי העבודה של ההסקה שדורשים הרבה כוח מחשוב.
-
בחלון הטרמינל הראשוני, שולחים את המשימה:
במהלך הפעלת המשימה, הפלט מציג את תוצאות האימון, התזמון ומדדי הביצועים.
מעקב אחרי התקינות של משימת ה-GRPO
אחרי שמשימת Ray מסתיימת, NeMo RL שומר את נקודות הבדיקה בנתיב שהוגדר.
כדי לבדוק את הפלט של עבודת ה-GRPO, יוצרים סשן SSH למאגר
ray-head:מתקינים את כלי העץ apt בטרמינל של מאגר התגים
ray-head:מציגים את מבנה הספרייה של מאגר התגים
ray-head:הפלט אמור להיראות כך:
root@ray-cluster-kuberay-worker-grp-0-worker-gkbxw:/opt/nemo-rl# tree /data/nemo_rl_gemma3_27b_3_17/ /data/nemo_rl_gemma3_27b_3_17/ `-- step_10 |-- config.yaml |-- policy | |-- optimizer | | |-- __0_0.distcp | | |-- __10_0.distcp | | |-- __11_0.distcp | | |-- __12_0.distcp | | |-- __13_0.distcp | | |-- __14_0.distcp | | |-- __15_0.distcp | | |-- __1_0.distcp | | |-- __2_0.distcp | | |-- __3_0.distcp | | |-- __4_0.distcp | | |-- __5_0.distcp | | |-- __6_0.distcp | | |-- __7_0.distcp | | |-- __8_0.distcp | | `-- __9_0.distcp | |-- tokenizer | | |-- chat_template.jinja | | |-- special_tokens_map.json | | |-- tokenizer.json | | `-- tokenizer_config.json | `-- weights | |-- __0_0.distcp | |-- __10_0.distcp | |-- __11_0.distcp | |-- __12_0.distcp | |-- __13_0.distcp | |-- __14_0.distcp | |-- __15_0.distcp | |-- __1_0.distcp | |-- __2_0.distcp | |-- __3_0.distcp | |-- __4_0.distcp | |-- __5_0.distcp | |-- __6_0.distcp | |-- __7_0.distcp | |-- __8_0.distcp | `-- __9_0.distcp |-- train_dataloader.pt `-- training_info.json 6 directories, 39 files
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה, אתם יכולים למחוק את המשאבים הספציפיים או את הפרויקט שמכיל אותם.
מחיקת המשאבים
מחיקת אשכול Slurm:
מוחקים את אשכול GKE:
מוחקים את מערכת הקבצים של Lustre:
מחיקת קישור בין רשתות VPC שכנות (peering):
מוחקים את טווח כתובות ה-IP הפרטיות של Lustre:
מחיקת תת-רשתות של RDMA ו-gVNIC:
מחיקת הכללים של חומת האש והרשתות:
מחיקת הפרויקט
כדי למחוק פרויקט ב- Google Cloud :
gcloud projects delete PROJECT_ID