במדריך הזה נסביר איך להשתמש במערכת האקולוגית של NVIDIA NeMo באשכול אימון מנוהל לפיתוח מודלים של AI גנרטיבי מקצה לקצה. המדריך הזה כולל הוראות מפורטות לכל אחד מתהליכי העבודה הבאים, שונים אך קשורים זה לזה, וכל אחד מהם מוסבר בקטע נפרד:
- NVIDIA NeMo: כדי לפתח מודל בסיסי, פועלים לפי ההוראות האלה כדי לבצע אימון מוקדם בקנה מידה גדול, אימון מוקדם רציף (CPT) ושיפור מודל בהדרכה (SFT).
- NVIDIA NeMo-RL: כדי לבצע התאמה של המודל ושינוי העדפות, משתמשים בחלק הזה כדי להחיל טכניקות מתקדמות כמו למידת חיזוק (RL) כדי להתאים את המודל להוראות ולהעדפות של בני אדם.
בין אם אתם בונים מודל מאפס או משפרים מודל קיים, במאמר הזה מוסבר איך להגדיר את הסביבה, לנהל משימות מבוססות קונטיינרים ולהפעיל סקריפטים של אימון באשכול.
NVIDIA NeMo
NVIDIA NeMo framework היא פלטפורמה מקצה לקצה ליצירה, להתאמה אישית ולפריסה של מודלים של AI גנרטיבי. החלק הזה במדריך מיועד במיוחד למפתחים ולחוקרים שמתמקדים בשלבים הראשוניים של פיתוח מודלים. המדריך כולל הוראות מפורטות לשימוש ב-NeMo כדי לבצע אימון מוקדם בקנה מידה גדול, אימון מוקדם רציף (CPT) ואימון מוקדם מפוקח (SFT) באשכול אימון מנוהל.
במדריך הזה מוסבר תהליך העבודה המלא להרצת משימת אימון באמצעות מסגרת NeMo. התהליך מחולק לשני חלקים עיקריים: ההגדרה הראשונית של הסביבה שמתבצעת פעם אחת, והשלבים שחוזרים על עצמם להפעלת משימה.
מגדירים את הסביבה
לפני שמריצים עבודה, צריך להכין את הסביבה ולוודא שיש לכם קובץ אימג' של קונטיינר וסקריפטים נדרשים לאימון.
התקנה של NeMo-Run
pip install git+https://github.com/NVIDIA/NeMo-Run.git
הכנת קובץ אימג' של קונטיינר
יש שתי אפשרויות לקובץ האימג' של הקונטיינר: שימוש בקובץ אימג' מוכן מראש (מומלץ) או יצירת קובץ אימג' מותאם אישית.
שימוש בתמונה מוכנה מראש (מומלץ)
תמונות קונטיינר מוכנות מראש מסופקות בפורמט .squashfs. מעתיקים את התמונה המתאימה לאזור שלכם לספריית העבודה.
# Example for the US region
gcloud storage cp gs://vmds-containers-us/vmds_nemo_squashfs/nemo-20250721.sqsh .
יצירת קונטיינר בהתאמה אישית (מתקדם)
פועלים לפי השלבים האלה רק אם מאגרי התגים המוכנים מראש לא עונים על הצרכים שלכם.
ההליך הזה מראה איך להמיר קובץ אימג' של קונטיינר בהתאמה אישית לפורמט .squashfs באמצעות enroot.
שלב 1: אימות באמצעות Google Cloud.
משתמשים בפקודות הבאות כדי לוודא שגם Google Cloud חשבון המשתמש וגם מאגר Docker שבו מתארחת התמונה מאומתים:
gcloud auth login
gcloud auth configure-docker us-docker.pkg.dev
שלב 2: יוצרים את סקריפט ההמרה.
יוצרים קובץ בשם enroot-convert.sh ומוסיפים את התוכן של הסקריפט הבא. לפני שמריצים את הסקריפט הזה, צריך לעדכן את המשתנים REMOTE_IMG ו-LOCAL_IMG כך שיצביעו על קובץ אימג' של קונטיינר ועל נתיב הפלט שבחרתם.
#!/bin/bash
#SBATCH --gpus-per-node=8
#SBATCH --exclusive
#SBATCH --mem=0
#SBATCH --ntasks-per-node=1
# Run this script on the slurm login node:
# sbatch -N 1 enroot-convert.sh
set -x
set -e
# The remote docker image URI.
REMOTE_IMG="docker://us-docker.pkg.dev/{YOUR_CONTAINER_IMG_URI}:{YOUR_CONTAINER_IMAGE_TAG}"
# The local path to the to be imported enroot squash file.
LOCAL_IMG="${HOME}/my_nemo.sqsh"
# The path to the enroot config file.
TMP_ENROOT_CONFIG_PATH="/tmp/\$(id -u --name)/config/enroot"
# Download the docker image to each node.
srun -l -N "${SLURM_NNODES}" \
bash -c "
mkdir -p ${TMP_ENROOT_CONFIG_PATH};
echo 'machine us-docker.pkg.dev login oauth2accesstoken password $(gcloud auth print-access-token)' > ${TMP_ENROOT_CONFIG_PATH}/.credentials;
rm -f ${LOCAL_IMG};
ENROOT_CONFIG_PATH=${TMP_ENROOT_CONFIG_PATH} ENROOT_MAX_PROCESSORS=$(( $(nproc) / 2 )) enroot import -o ${LOCAL_IMG} ${REMOTE_IMG};
"
שלב 3: מריצים את הסקריפט ומאמתים את הפלט.
מריצים את הסקריפט בצומת ההתחברות של Slurm.
sbatch -N 1 enroot-convert.sh
אחרי שהעבודה מסתיימת, קובצי היומן של ההמרה נמצאים בקובץ בשם slurm-<JOB_ID>.out, ותמונת הקונטיינר הסופית נמצאת בנתיב שציינתם עבור LOCAL_IMG.
הורדת מתכוני האימונים
מתכוני האימון מאוחסנים במאגר פרטי של googlesource.com.
כדי לגשת אליהם באמצעות שורת הפקודה של Git, צריך קודם ליצור פרטי אימות.
יצירת פרטי כניסה לאימות.
עוברים לכתובת ה-URL הבאה ופועלים לפי ההוראות במסך. הפעולה הזו מגדירה את הסביבה המקומית לאימות מול המאגר. https://www.googlesource.com/new-password
משכפלים את המאגר.
אחרי שפרטי הכניסה מאומתים, מריצים את הפקודה הבאה כדי להוריד את המתכונים.
git clone -b release-allowlist-ga https://vertex-model-garden.googlesource.com/vertex-oss-training
הפעלת תהליך אימון
אחרי שמגדירים את הסביבה, אפשר להפעיל משימת אימון.
שלב 1: הגדרת משתני סביבה
יכול להיות שתצטרכו להגדיר את משתני הסביבה הבאים בשביל העבודה שלכם:
- נדרש
HF_TOKENכדי להוריד מודלים ומערכי נתונים מ-Hugging Face. - ה-
WANDB_API_KEYנדרש כדי להשתמש ב-Weights & Biases לניתוח ניסויים.
export HF_TOKEN=YOUR_HF_TOKEN
export WANDB_API_KEY=YOUR_WANDB_API_KEY
שלב 2: מריצים את סקריפט ההפעלה
עוברים לספריית העבודה ומריצים את הסקריפט run.py כדי להתחיל עבודה. בדוגמה הזו מופעלת עבודת אימון להדגמה עם Llama 3.1-2b.
# Set the working directory
export WORK_DIR=$HOME/vertex-oss-training/nemo
cd $WORK_DIR
gcloud storage cp
gs://vmds-containers-<region>/vmds_nemo_squashfs/nemo-20250721.sqsh nemo-demo.sqsh
# Launch the training job
export NEMORUN_HOME=$WORK_DIR && \
python3 run.py -e slurm --slurm-type hcc-a3m --partition a3m \
-d $WORK_DIR -i $WORK_DIR/nemo-demo.sqsh \
-s pretrain/llama3p1_2b_pt.py -n 2 \
--experiment-name nemo-demo-run
פרמטרים של הפעלה
- הערך של
--slurm-typeמוגדר על סמך סוג האשכול (לדוגמה,hcc-a3m,hcc-a3u,hcc-a4). - הערך של
--partitionצריך להיות מוגדר למחיצה זמינה. אפשר לבדוק את שמות המחיצות באמצעות הפקודהsinfo. - הסקריפט
run.pyמעלה באופן אוטומטי כמה ספריות למאגר Docker, כולל--log-dir,--cache-dirו---data-dir, אם הן מוגדרות.
מעקב אחרי סטטוס המשימה ויומנים
אחרי שמפעילים את המשימה, מוצג בלוק סטטוס:
Experiment Status for nemo-demo-run_1753123402
Task 0: nemo-demo-run
- Status: RUNNING
- Executor: SlurmExecutor on @localhost
- Job id: 75
- Local Directory: $NEMORUN_HOME/experiments/nemo-demo-run/nemo-demo-run_1753123402/nemo-demo-run
יומני ההפעלה נכתבים בנתיב שמוצג בשדה Local Directory בפלט הסטטוס. לדוגמה, אפשר למצוא את קובצי היומן בנתיב
דומה לזה:
$NEMORUN_HOME/experiments/nemo-demo-run/nemo-demo-run_1753123402/nemo-demo-run/<JOB_ID>.log
שגיאות נפוצות והצעות לפתרונות
בקטע הזה מתוארות בעיות נפוצות שעלולות לקרות במהלך הפעלת העבודות, ומומלצות פעולות לפתרון הבעיות האלה.
שגיאה: מחיצה לא תקינה
כברירת מחדל, המערכת מנסה להפעיל את העבודות במחיצה הכללית. אם המחיצה הכללית לא קיימת או לא זמינה, העבודה תיכשל עם השגיאה הבאה:
sbatch: error: invalid partition specified: general
sbatch: error: Batch job submission failed: Invalid partition name specified
פתרון:
מציינים מחיצה זמינה באמצעות הארגומנט --partition או -p בפקודת ההפעלה.
כדי לראות רשימה של המחיצות הזמינות, מריצים את הפקודה sinfo בצומת הכניסה של Slurm.
sinfo
הפלט מציג את שמות המחיצות הזמינות, כמו a3u בדוגמה הזו:
| PARTITION | AVAIL | TIMELIMIT | צמתים | STATE | NODELIST |
|---|---|---|---|---|---|
| a3u* | חץ למעלה | אינסופי | 2 | idle~ | alice-a3u-[2-3] |
| a3u* | חץ למעלה | אינסופי | 2 | ללא פעילות | alice-a3u-[0-1] |
שגיאה בהורדת טוקנייזר
יכול להיות שתיתקלו ב-OSError שקשור לקישור מקושר למכשיר אחר כשהסקריפט מנסה להוריד את tokenizer של GPT2:
OSError: [Errno 18] Invalid cross-device link: 'gpt2-vocab.json' -> '/root/.cache/torch/megatron/megatron-gpt-345m_vocab'
פתרונות:
יש שתי אפשרויות לפתרון הבעיה:
- אפשרות 1:
מריצים מחדש את העבודה. השגיאה הזו היא לרוב זמנית. הרצה מחדש של העבודה באמצעות אותו
--cache-dirעשויה לפתור את הבעיה. - אפשרות 2:
הורדה ידנית של קובצי ה-tokenizer. אם הפעלת העבודה מחדש נכשלת, צריך לבצע את השלבים הבאים:
- מורידים את שני הקבצים הבאים:
gpt2-vocab.jsongpt2-merges.txt
- מעבירים את הקבצים שהורדו אל ספריית המשנה
torch/megatron/בתוך ספריית המטמון (לדוגמה,<var>YOUR_CACHE_DIR</var>/torch/megatron/). - משנים את השם של הקבצים באופן הבא:
- שינוי השם של
gpt2-vocab.jsonל-megatron-gpt-345m_vocab. - שינוי השם של
gpt2-merges.txtל-megatron-gpt-345m_merges.
- שינוי השם של
- מורידים את שני הקבצים הבאים:
NVIDIA NeMo-RL
המסגרת NVIDIA NeMo-RL נועדה להתאים מודלים גדולים של שפה להעדפות ולהוראות של בני אדם. בקטע הזה מוסבר איך להשתמש ב-NeMo-RL באשכול כדי לבצע משימות מתקדמות של התאמה, כולל כוונון עדין מפוקח (SFT), כוונון העדפות (כמו אופטימיזציה ישירה של העדפות, או DPO) ולמידת חיזוק (RL).
המדריך כולל שני תהליכי עבודה עיקריים: הפעלת משימת אימון רגילה של אצווה ושימוש בסביבת הפיתוח האינטראקטיבית לצורך ניפוי באגים.
דרישות מוקדמות
לפני שמתחילים, יוצרים אשכול לפי ההוראות שבדף יצירת אשכול, או משתמשים באשכול קיים של Managed Training, אם יש כזה.
התחברות לצומת הכניסה של האשכול
כדי להתחבר לצומת הכניסה של האשכול, צריך למצוא את הפקודה הנכונה של Google Cloud CLI. לשם כך, עוברים לדף Google Compute Engine Virtual Machine במסוף Google Google Cloud ולוחצים על SSH > View Google Cloud CLI command (הצגת הפקודה של Google Cloud CLI). הוא ייראה בערך כך:
ssh $USER_NAME@machine-addr
דוגמה:
ssh $USER_NAME@nic0.sliua3m1-login-001.europe-north1-c.c.infinipod-shared-dev.internal.gcpnode.com
שימוש בקובץ אימג' של Docker מוכן מראש
קבצים שהומרו .sqsh מסופקים עבור קובצי אימג' בקונטיינר שנבנו מראש. אפשר לבחור מאגר לאזור ולהגדיר אותו ישירות כפרמטר של תמונת המאגר, או להוריד אותו למערכת הקבצים של האשכול.
כדי להגדיר אותו ישירות כפרמטר של קובץ אימג' של קונטיינר, משתמשים באחת מהנתיבים הבאים.
שימו לב שצריך להחליף את <region> באזור הספציפי שלכם (לדוגמה, europe, asia, us):
/gcs/vmds-containers-<region>/vmds_nemo_rl_squashfs/nemo_rl-h20260302.sqsh
כדי להוריד את התמונה לאחסון lustre של האשכול, משתמשים בפקודה הבאה:
gs://vmds-containers-<region>/vmds_nemo_rl_squashfs/nemo_rl-h20260302.sqsh DESTINATION
הורדת הקוד
כדי לקבל גישה למתכון ההדרכה באמצעות git CLI, צריך להיכנס לכתובת https://www.googlesource.com/new-password. אפשר להוריד את המתכון באמצעות הפקודה הבאה:
cd $HOME
git clone -b release-allowlist-ga https://vertex-model-garden.googlesource.com/vertex-oss-training
הפעלת משימות
שלב 1: מגדירים משתני סביבה.
כדי לשלוף מודלים ונתונים מ-Hugging Face, יכול להיות שיהיה צורך להגדיר את HF_TOKEN.
כדי להשתמש ב-Weights & Biases לניתוח ניסויים, צריך להגדיר את WANDB_API_KEY. מעדכנים את המשתנים האלה בקובץ הבא:
קובץ לעדכון: $HOME/vertex-oss-training/nemo_rl/configs/auth.sh
אם אתם לא רוצים להשתמש ב-Weights & Biases, צריך להגדיר את logger.wandb_enabled ל-False
בסקריפט ההפעלה.
שלב 2: מורידים או מעתיקים את קובץ המאגר לתיקיית ההפעלה.
הנה מספר דוגמאות.
gcloud storage cp \
gs://vmds-containers-<region>/vmds_nemo_rl_squashfs/nemo_rl-h20260302.sqsh \
$HOME/vertex-oss-training/nemo_rl/nemo_rl-h20260302.sqsh
# OR
/gcs/vmds-containers-<region>/vmds_nemo_rl_squashfs/nemo_rl-h20260302.sqsh \
$HOME/vertex-oss-training/nemo_rl/nemo_rl-h20260302.sqsh
cd $HOME/vertex-oss-training/nemo_rl/
# Where region is either `us`, `asia`, or `europe`
שלב 3: מכינים או משכפלים את מאגר NeMo-RL.
יוצרים שיבוט של קוד NeMo-RL אם הוא עדיין לא קיים. שימו לב שאולי תצטרכו להשתמש ב-git submodule update --init --recursive אם כבר שיבטתם את המאגר בלי הדגל --recursive.
git clone https://github.com/NVIDIA-NeMo/RL --recursive
שלב 4: מפעילים את עבודת האימון.
sbatch -N <num_nodes> launch.sh --cluster_type hcc-a3m --job_script algorithms/dpo.sh
כאשר:
- המאפיין
--cluster-typeמוגדר על סמך סוג האשכול:- A3-Mega:
hcc-a3m - A3-Ultra:
hcc-a3u - A4:
hcc-a4 - A3H:
hcc-a3h
- A3-Mega:
- צריך להגדיר את
--partitionבהתאם, ואפשר להשתמש ב-sinfoכדי לבדוק את המחיצות של slurm.
אחרי שהעבודה מתחילה, נוצרת ספרייה חדשה שנקראת על שם מזהה העבודה ב-SLURM במיקום הנוכחי. בתוך התיקייה הזו נמצאים כל היומנים ונקודות הבדיקה ששייכים לעבודה הזו. באופן ספציפי יותר, בתוך התיקייה הזו תמצאו את התיקיות והקבצים הבאים:
-
checkpoints/← הספרייה הזו מותקנת בתוך מאגר NeMo-RL ומכילה את כל נקודות הבדיקה מהאימון. -
ray-logs/← בספרייה הזו יש יומנים מ-ray head ומ-ray workers. -
nemo_rl_output.log→ הקובץ הזה מכיל את יומני Slurm מהעבודה שנשלחה. -
attach.sh(רק למשימות אינטראקטיביות) ← זהו סקריפט bash שמאפשר לכם להתחבר למשימה אינטראקטיבית. אם העבודה מופעלת בהצלחה, יכול להיות שיחלפו כמה דקות עד שהקובץ הזה ייווצר.
פיתוח באמצעות NeMo-RL
הגדרה אינטראקטיבית
יש שתי אפשרויות לפיתוח אינטראקטיבי מהיר באמצעות NeMo-RL.
nemorlinteractive
זו פקודת עזר פשוטה שמאפשרת לבחור צומת GPU מהאשכול (נניח צומת מספר 5), ואז היא מעבירה אתכם למאגר פעיל של NeMo-RL בתוך הצומת שבחרתם. הפקודה הזו שימושית לתהליכי עבודה עם צומת יחיד.
כדי להשתמש ב-nemorlinteractive, צריך לבצע את השלבים המקדימים הבאים:
- מספקים את כל אסימוני האימות שרוצים (לדוגמה, HF ו-WandB) שנטענו לעבודת ה-Job בקובץ
configs/auth.sh. מגדירים את משתנה הסביבה
CLUSTER_TYPEבהתאם להנחיות הבאות:export CLUSTER_TYPE="hcc-a3m" # --> if you have A3-Mega cluster export CLUSTER_TYPE="hcc-a3u" # --> if you have A3-Ultra cluster export CLUSTER_TYPE="hcc-a4" # --> If you have A4 cluster export CLUSTER_TYPE="hcc-a3h" # --> If you have A3H clusterמייבאים את
nemorlinteractiveבטרמינל bash על ידי הפעלת הסקריפטbash_utils.sh:source bash_utils.shמריצים את הפקודה
nemorlinteractive. לדוגמה:# Assuming you want to take the compute node number 5. nemorlinteractive 5
הפעלה אינטראקטיבית
האפשרות הזו מאפשרת להריץ עומסי עבודה באופן אינטראקטיבי בכמה צמתי מחשוב. משימות אינטראקטיביות מתאימות במיוחד לניפוי באגים ולתרחישי שימוש באימות. עומסי העבודה האלה שומרים את הצומת לזמן בלתי מוגבל עד שהמפתח מחליט שהניפוי הסתיים ושהוא רוצה לשחרר את המשאבים.
כדי להשתמש באפשרות הזו, צריך לפעול לפי השלבים הבאים:
מספקים את כל אסימוני האימות שרוצים (לדוגמה HF ו-WandB) שנטענו למשימה בקובץ configs/auth.sh.
sbatch -N <num_nodes> launch.sh --cluster_type hcc-a3m --interactive
ממתינים 2-5 דקות, ואז אמור להופיע
<job_id>/attach.sh.כדי לעקוב אחרי ההתקדמות של בדיקת ההשקה, לוחצים על
<job_id>/nemo_rl_output.logכדי לראות את ההתקדמות של סקריפט ההשקה, ועל<job_id>/ray_logs/כדי לראות את ההתקדמות של השקת ראש ה-Ray והעובדים.מתחברים לחיפוש העבודה האינטראקטיבי. הסקריפט הזה מאפשר להתחבר מחדש גם אם החיבור נותק:
bash <job_id>/attach.sh
המאמרים הבאים
הפעלת עומס עבודה מוכן מראש מאמתת את הסטטוס התפעולי של האשכול. השלב הבא הוא להפעיל אפליקציית אימון מותאמת אישית משלכם.
- הפעלת עומס עבודה מותאם אישית: אורזים את קוד האימון במאגר ושולחים את המאגר כ-
CustomJobלאשכול האימון. התהליך הזה כולל הגדרת העבודה בסביבה מבוזרת. - מעקב אחרי משימות האימון: אפשר לעקוב אחרי ההתקדמות, ניצול המשאבים והיומנים של המשימות שפועלות באשכול באמצעות מסוף Google Cloud או Cloud Logging.
- צפייה באשכול: אחרי שמריצים את הבדיקות, בודקים את הסטטוס של האשכול ושל הצמתים הנפרדים שלו.
- ניהול האשכול: עדכון ההגדרה של האשכול או מחיקה שלו כדי לנהל את העלויות.
- ארגון משימות באמצעות צינורות של Gemini Enterprise Agent Platform: אחרי שמריצים משימות באופן ידני, אפשר ליצור צינור כדי לארגן את תהליכי העבודה של האימון ולהפוך את התהליך לאוטומטי.