הפעלת עומסי עבודה מוכנים מראש

אם אתם רוצים להשתמש ב-Vertex AI Managed Training, אתם יכולים לפנות לנציג המכירות שלכם כדי לקבל גישה.

במדריך הזה נסביר איך להשתמש במערכת האקולוגית של 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, צריך קודם ליצור פרטי אימות.

  1. יצירת פרטי כניסה לאימות.

    נכנסים לכתובת ה-URL הבאה ופועלים לפי ההוראות במסך. הפעולה הזו מגדירה את הסביבה המקומית לאימות מול המאגר. https://www.googlesource.com/new-password

  2. משכפלים את המאגר.

    אחרי שפרטי הכניסה מאומתים, מריצים את הפקודה הבאה כדי להוריד את המתכונים.

    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.json
      • gpt2-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
  • צריך להגדיר את --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, צריך לבצע את השלבים המקדימים הבאים:

  1. מספקים את כל אסימוני האימות שרוצים (לדוגמה, HF ו-WandB) שנטענו לעבודת ה-Job בקובץ configs/auth.sh.
  2. מגדירים את משתנה הסביבה 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
    
  3. מייבאים את nemorlinteractive בטרמינל bash על ידי הפעלת הסקריפט bash_utils.sh:

    source bash_utils.sh
    
  4. מריצים את הפקודה 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 head ו-workers.

  • מתחברים לחיפוש העבודה האינטראקטיבי. הסקריפט הזה מאפשר להתחבר מחדש גם אם החיבור נותק:

bash <job_id>/attach.sh

המאמרים הבאים

הפעלת עומס עבודה מוכן מראש מאמתת את הסטטוס התפעולי של האשכול. השלב הבא הוא להפעיל אפליקציית אימון מותאמת אישית משלכם.

  • להריץ עומס עבודה מותאם אישית משלכם: אורזים את קוד האימון במאגר ושולחים את המאגר כ-CustomJob לאשכול האימון. התהליך הזה כולל הגדרת העבודה לסביבה מבוזרת.
  • מעקב אחרי משימות האימון: אפשר לעקוב ביעילות אחרי ההתקדמות, ניצול המשאבים והיומנים של המשימות שפועלות באשכול באמצעות מסוף Google Cloud או Cloud Logging.
  • ניהול האשכול: אחרי שמריצים את הבדיקות, בודקים את הסטטוס של האשכול או מוחקים אותו כדי לנהל את העלויות.
  • תזמור משימות באמצעות Vertex AI Pipelines: אחרי שמריצים משימות באופן ידני, אפשר ליצור צינור עיבוד נתונים כדי לתזמר את תהליכי העבודה של האימון ולאחר מכן להפוך את התהליך לאוטומטי.