במדריך הזה מוסבר איך לאמן מודל שפה גדול (LLM) באשכול Slurm עם כמה צמתים וכמה מעבדי GPU ב- Google Cloud. המודל שבו משתמשים במדריך הזה מבוסס על מודל Qwen2 עם 1.5 מיליארד פרמטרים. באשכול Slurm נעשה שימוש בשתי מכונות וירטואליות (VM) מסוג a4-highgpu-8g, שבכל אחת מהן יש 8 מעבדי NVIDIA B200 GPU.
שני התהליכים העיקריים שמתוארים במדריך הזה הם:
- פריסת אשכול Slurm ברמת ייצור עם ביצועים גבוהים באמצעותGoogle Cloud Cluster Toolkit. כחלק מהפריסה הזו, אתם יוצרים קובץ אימג' של VM בהתאמה אישית עם התוכנה הנדרשת שמותקנת מראש. בנוסף, אתם מגדירים מכונה משותפת של Filestore ורשת RDMA במהירות גבוהה.
- אחרי פריסת האשכול, מריצים משימת אימון מראש מבוזרת באמצעות קבוצת הסקריפטים שמצורפת למדריך הזה. המשימה משתמשת בספריית Hugging Face Accelerate.
המדריך הזה מיועד למהנדסי למידת מכונה (ML), לחוקרים, למנהלי פלטפורמות ולמפעילי פלטפורמות, וגם למומחי נתונים ו-AI שרוצים לפרוס אשכולות Slurm עם ביצועים גבוהים ב- Google Cloud כדי לאמן מודלים גדולים של שפה (LLM).
מטרות
- ניגשים למודל Qwen2 באמצעות Hugging Face.
- מכינים את הסביבה.
- ליצור ולפרוס אשכול Slurm מסוג A4 ברמת ייצור.
- מאמנים את המודל Qwen2 באמצעות הספרייה Accelerate.
- עוקבים אחרי המשימה.
- מנקים.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
בעזרת מחשבון העלויות אתם יכולים להעריך את העלויות בהתאם לשימוש הצפוי.
לפני שמתחילים
-
התקינו את ה-CLI של Google Cloud.
-
הגדירו שה-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). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com
-
נותנים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/serviceusage.serviceUsageAdmin, roles/compute.osAdminLogin, roles/iap.tunnelResourceAccessorgcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט. -
USER_IDENTIFIER: המזהה של חשבון המשתמש שלכם. . דוגמאות מופיעות במאמר ייצוג המשתמשים במאגרי כוח עבודה בכללי מדיניות IAM. -
ROLE: התפקיד ב-IAM שאתם נותנים לחשבון המשתמש.
-
- מפעילים את חשבון השירות שמוגדר כברירת מחדל בפרויקט ב- Google Cloud :
gcloud iam service-accounts enable PROJECT_NUMBER-compute@ \ --project=PROJECT_ID
מחליפים את PROJECT_NUMBER במספר הפרויקט. כדי לבדוק את מספר הפרויקט, קראו את המאמר קבלת פרויקט קיים.
- מקצים את התפקיד "עריכה" (
roles/editor) לחשבון השירות שמוגדר כברירת מחדל:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@" \ --role=roles/editor
- יצירת פרטי כניסה לאימות מקומי בחשבון המשתמש:
gcloud auth application-default login
- מפעילים את OS Login בפרויקט:
gcloud compute project-info add-metadata --metadata=enable-oslogin=TRUE
- נכנסים לחשבון Hugging Face או יוצרים חשבון.
איך ניגשים ל-Qwen2 באמצעות Hugging Face
כדי להשתמש ב-Hugging Face כדי לגשת ל-Qwen2:
התקנת Cluster Toolkit
Cluster Toolkit הוא כלי בקוד פתוח שמפשט את הפריסה של עומסי עבודה של מחשוב עתיר ביצועים (HPC), בינה מלאכותית (AI) ולמידת מכונה (ML) ב- Google Cloud. למידע נוסף על השימוש ב-CLI של gcluster ועל ניהול אשכולות, קראו את הסקירה הכללית של Cluster Toolkit.
מכינים את הגרסה של Cluster Toolkit:
מורידים את הגרסה:
מגדירים את הנתיב של
gcluster:
הכנת הסביבה
כדי להכין את הסביבה:
מגדירים את משתני הסביבה שמוגדרים כברירת מחדל:
מחליפים את מה שכתוב בשדות הבאים:
-
YOUR_PROJECT_ID: שם הפרויקט ב- Google Cloud שבו רוצים ליצור את אשכול GKE. -
YOUR_CLUSTER_NAME: השם של אשכול Slurm שרוצים ליצור. -
YOUR_ZONE: האזור שבו נמצאת ההזמנה. -
YOUR_REGION,: האזור שבו נמצאת ההזמנה. -
RESERVATION_NAME: כתובת ה-URL או השם של ההזמנה שבה רוצים להשתמש כדי ליצור את אשכול Slurm. -
YOUR_GCS_BUCKET: שם הקטגוריה שבה מאוחסנות התוצאות מנקודת הבדיקה של האימון. לפני שיוצרים את הקטגוריה, חשוב להכיר את הדרישות לבחירת שמות לקטגוריות. -
YOUR_HF_TOKEN: הטוקן של Hugging Face שיצרתם בשלב קודם.
-
יוצרים קטגוריה של Cloud Storage:
יצירת אשכול Slurm מסוג A4
כדי ליצור אשכול Slurm מסוג A4:
יוצרים את הקובץ
a4high-slurm-deployment.yaml:משתמשים בפקודה
gcluster createכדי ליצור את המניפסטים של Terraform:מתקנים את המניפסטים:
פורסים את האשכול:
הפקודה
gcluster deployהיא תהליך דו-שלבי:בשלב הראשון נוצרת תמונה מותאמת אישית עם כל התוכנות שמותקנות מראש. השלב הזה יכול להימשך עד 50 דקות.
בשלב השני, האשכול נפרס באמצעות קובץ האימג' בהתאמה אישית. התהליך הזה בדרך כלל נמשך פחות זמן מהשלב הראשון.
אם השלב הראשון מצליח אבל השלב השני נכשל, אפשר לנסות לפרוס שוב את אשכול Slurm ולדלג על השלב הראשון:
הכנת עומס העבודה
כדי להכין את עומס העבודה, פועלים לפי השלבים הבאים:
יצירת סקריפטים של עומסי עבודה
כדי ליצור את הסקריפטים שבהם ישתמש עומס העבודה של האימון, פועלים לפי השלבים הבאים:
כדי להגדיר את הסביבה הווירטואלית של Python, יוצרים את הקובץ
install_environment.shעם התוכן הבא:כדי לציין את ההגדרות של משימת הכוונון, יוצרים את הקובץ
accelerate_config.yamlעם התוכן הבא:כדי לציין את המשימות שהמשימות יריצו באשכול Slurm, יוצרים את הקובץ
submit.slurmעם התוכן הבא:כדי לציין את יחסי התלות של משימת הכוונון, יוצרים קובץ
requirements.txtעם התוכן הבא:
הערה: במדריך הזה לא משתמשים בגרסאות העדכניות ביותר של יחסי התלות של NVIDIA ו-PyTorch. אם אתם צריכים יחסי תלות חדשים יותר, עיינו במסמכי התיעוד של NVIDIA ובמסמכי התיעוד של PyTorch.כדי להוריד את מערך הנתונים, להמיר אותו לאסימונים ולעבד אותו מראש לפורמט שמוכן לאימון, יוצרים קובץ
preprocess_data.pyעם התוכן הבא:כדי לציין את ההוראות למשימה, יוצרים קובץ
train.pyעם התוכן הבא:
העלאת סקריפטים לאשכול Slurm
כדי להעלות לאשכול Slurm את הסקריפטים שיצרתם בקטע הקודם, פועלים לפי השלבים הבאים:
מגדירים את המשתנה
LOGIN_NODEעל ידי אחזור השם של צומת ההתחברות של האשכול:המשתנה
LOGIN_NODEמאחסן ערך שדומה ל-${CLUSTER_NAME}-login-001.יוצרים כלל של חומת אש:
מעלים את הסקריפטים לספריית הבית של צומת ההתחברות:
התחברות לאשכול Slurm
מתחברים לאשכול Slurm באמצעות התחברות לצומת ההתחברות דרך SSH:
התקנת frameworks וכלים
אחרי שמתחברים לצומת ההתחברות, מתקינים את הכלים והמסגרות:
מגדירים סביבה וירטואלית של Python עם כל יחסי התלות הנדרשים:
התחלת האימון מראש של עומס העבודה
כדי להתחיל לאמן את עומס העבודה:
שולחים את המשימה למתזמן של Slurm:
בצומת ההתחברות באשכול Slurm, אפשר לעקוב אחרי התקדמות המשימה באמצעות בדיקה של קובצי הפלט שנוצרו בספרייה
home:אם המשימה מתחילה לפעול, בקובץ
.errמופיע סרגל התקדמות שמתעדכן ככל שהמשימה מתקדמת.
מעקב אחרי עומס העבודה
אתם יכולים לעקוב אחרי השימוש ביחידות ה-GPU באשכול Slurm כדי לוודא שמשימת הכוונון פועלת ביעילות. כדי לעשות את זה, פותחים את הקישור הבא בדפדפן:
https://console.cloud.google.com/monitoring/metrics-explorer?project=PROJECT_ID&pageState=%7B%22xyChart%22%3A%7B%22dataSets%22%3A%5B%7B%22timeSeriesFilter%22%3A%7B%22filter%22%3A%22metric.type%3D%5C%22agent.googleapis.com%2Fgpu%2Futilization%5C%22%20resource.type%3D%5C%22gce_instance%5C%22%22%2C%22perSeriesAligner%22%3A%22ALIGN_MEAN%22%7D%2C%22plotType%22%3A%22LINE%22%7D%5D%7D%7D
לחלופין, אפשר להזין את הפקודה ישירות בטרמינל:
כשעוקבים אחרי עומס העבודה, אפשר לראות את הפרטים הבאים:
שימוש ביחידות GPU: אם משימת הכוונון תקינה, השימוש בכל 16 יחידות ה-GPU (שמונה יחידות GPU לכל מכונה וירטואלית באשכול) אמור לעלות ולהתייצב ברמה מסוימת במהלך האימון. בדיקה
משך העבודה: העבודה אמורה להימשך כשעה.
הורדת המודל
אחרי שהמשימה תרוץ בהצלחה, המודל המאומן יישמר בספרייה ~/qwen2-from-scratch-on-smollm-fineweb/ בצומת ההתחברות. מכיוון שהספרייה המשותפת הקבועה הזו מותקנת בכל הצמתים באשכול, נקודות הבדיקה של המודל נשארות זמינות גם אחרי שהמשימה מסתיימת או שההקצאה של צומתי המחשוב מבוטלת.
כדי להוריד את המודל השמור מצומת ההתחברות למכונה המקומית, משתמשים בפקודה gcloud compute scp, כמו בדוגמה הבאה:
אחרי שמורידים את המודל, אפשר:
- טעינת המודל להסקת מסקנות: משתמשים ב-framework של Hugging Face Transformers כדי לטעון את הספרייה
qwen2-trained-model/ולהסיק מסקנות באמצעות המודל החדש של Qwen2 שאומן. - כוונון עדין נוסף: משתמשים בנקודת הבדיקה השמורה כנקודת התחלה לכוונון עדין נוסף במערך נתונים ספציפי יותר.
- העלאת המודל ל-Hugging Face Hub: משתפים את המודל המאומן על ידי העלאה שלו ל-Hugging Face Hub.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים.
איך מוחקים את המשאבים
כדי למחוק את אשכול Slurm, מריצים את הפקודה
gcluster destroy:כדי למחוק את הקטגוריה של Cloud Storage:
כדי למחוק קובץ אימג' של Packer, פותחים את דפדפן האינטרנט, עוברים לדף הבא, מחפשים את קובץ האימג' הספציפי ולוחצים על Delete.
כדי למחוק את כל רשתות ה-VPC, כללי חומת האש, הנתבים, כתובות ה-IP ורשתות המשנה שמשויכים לפרויקט:
מחיקת הפרויקט
כדי למחוק פרויקט ב- Google Cloud :
gcloud projects delete PROJECT_ID