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

אם אתם מעוניינים בגישה ל-Gemini Enterprise Agent Platform 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 והעובדים.

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

bash <job_id>/attach.sh

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

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