פריסת אשכול HPC עם התאמה אוטומטית לעומס (auto-scaling) באמצעות Slurm

1. סקירה כללית

הגעת ל-Google Codelab להרצת אשכול Slurm ב-Google Cloud Platform! בסוף השיעור, אמורה להיות לכם הבנה טובה לגבי קלות הקצאת ההרשאות וההפעלה של אשכול Slurm עם התאמה אוטומטית לעומס (auto-scaling).

c16fa310c142ac6f.png

עבדו ב-Google Cloud עם SchedMD כדי לפרסם סדרת כלים שמקלות על השקת מנהל עומסי העבודה של Slurm ב-Compute Engine, ועל הרחבת האשכול הקיים באופן דינמי כשיש צורך במשאבים נוספים. השילוב הזה נבנה על ידי המומחים ב-SchedMD בהתאם לשיטות המומלצות של Slurm.

אם בכוונתך להשתמש בשילובים של Slurm on Google Cloud Platform, או אם יש לך שאלות, כדאי להצטרף ל-Google Cloud קבוצת דיון של קהילת Slurm!

מידע על סלרום

a739730a41acff0a.png

תרשים ארכיטקטורה בסיסי של אשכול סלור עצמאי ב-Google Cloud Platform.

Slurm הוא אחד ממנהלי עומסי העבודה המובילים עבור אשכולות HPC ברחבי העולם. Slurm מספקת מערכת בקוד פתוח לניהול עומסי עבודה (workload) ותזמון משימות, עם קוד פתוח, עמידות בכשלים ומערכת לתזמון משימות, לאשכולות Linux קטנים וגדולים. השימוש ב-slam לא מחייב שינויים בליבה (kernel) והוא עצמאי יחסית. כמנהל של עומסי עבודה (workload) של אשכול, יש ל-Slum שלוש פונקציות מרכזיות:

  1. הוא מקצה למשתמשים גישה בלעדית או לא בלעדית למשאבים (צמתים מחשוב) למשך פרק זמן מסוים, כדי שיוכלו לבצע עבודה.
  2. הוא מספק מסגרת להתחלת עבודה, לביצוע ולמעקב אחריהן (בדרך כלל משימה מקבילה) על קבוצת הצמתים שהוקצו.
  3. הוא משמש כבוררות לגבי המשאבים על ידי ניהול תור של עבודות בהמתנה.

מה תלמדו

  • איך להגדיר אשכול Slurm באמצעות Terraform
  • איך מריצים משימה באמצעות SLURM
  • איך לשלוח שאילתות על מידע על אשכולות ולעקוב אחרי משימות פעילות ב-SLURM
  • איך להתאים צמתים לעומס (auto-scaling) כדי להתאים לפרמטרים ולדרישות ספציפיים של משימות
  • איפה מוצאים עזרה עם סלרום

דרישות מוקדמות

  • חשבון Google Cloud Platform ופרויקט עם חיוב
  • חוויית Linux בסיסית

2. הגדרה

הגדרת סביבה בקצב עצמאי

יוצרים פרויקט

אם אין לכם עדיין חשבון Google (Gmail או G Suite), עליכם ליצור חשבון. נכנסים למסוף Google Cloud Platform ( console.cloud.google.com) ופותחים את הדף 'ניהול משאבים':

359c06e07e6d699f.png

לוחצים על Create Project.

25c23d651abb837b.png

מזינים את שם הפרויקט. חשוב לזכור את מזהה הפרויקט (מודגש באדום בצילום המסך שלמעלה). מזהה הפרויקט חייב להיות שם ייחודי בכל הפרויקטים ב-Google Cloud. אם שם הפרויקט הוא לא ייחודי, מערכת Google Cloud תיצור מזהה פרויקט אקראי על סמך שם הפרויקט.

בשלב הבא צריך להפעיל את החיוב ב-Developers Console כדי להשתמש במשאבים של Google Cloud.

ההרצה של Codelab הזה לא אמורה לעלות לך יותר מכמה דולרים, אבל היא יכולה להיות גבוהה יותר אם תחליטו להשתמש במשאבים רבים יותר או אם תשאירו אותם פועלים (עיינו בקטע 'סיכום' בסוף המסמך). מחשבון התמחור של Google Cloud Platform זמין כאן.

משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$.

Google Cloud Shell

אומנם אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.

הפעלת Google Cloud Shell

ממסוף GCP, לוחצים על הסמל של Cloud Shell בסרגל הכלים שבפינה השמאלית העליונה:

dbad104cef962719.png

לאחר מכן לוחצים על Start Cloud Shell:

4e50db320508ac88.png

התהליך של הקצאה והתחברות לסביבה נמשך רק כמה רגעים:

20b0aa80492144d.png

למכונה הווירטואלית הזו נטען כל כלי הפיתוח הדרושים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, וכך משפרת משמעותית את ביצועי הרשת ומפשטת את האימות. אם לא את כולן, ניתן לבצע חלק גדול מהעבודה בשיעור ה-Lab הזה באמצעות דפדפן אינטרנט או מכשיר Google Chromebook.

אחרי החיבור ל-Cloud Shell, אתם אמורים לראות שכבר בוצע אימות ושהפרויקט כבר מוגדר לפי הפרויקט PROJECT_ID:

$ gcloud auth list

הפלט של הפקודה:

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
$ gcloud config list project

הפלט של הפקודה:

[core]
project = <PROJECT_ID>

אם מזהה הפרויקט לא מוגדר בצורה נכונה, תוכלו להגדיר אותו באמצעות הפקודה הבאה:

$ gcloud config set project <PROJECT_ID>

הפלט של הפקודה:

Updated property [core/project].

3. הכנה ובדיקה של הגדרות Slurm ב-Terraform

הורדת Slurm Terraform Configuration

בסשן של Cloud Shell, מריצים את הפקודה הבאה כדי לשכפל (להוריד) את מאגר Git שמכיל את ה-Slurm לקובצי Google Cloud Platform Terraform:

git clone https://github.com/SchedMD/slurm-gcp.git

כדי לעבור לספריית ההגדרות של פריסת Slurm:

cd slurm-gcp

הגדרת tfvars של Slurm ב-Terraform

הקובץ Basic.tfvars.example מפרט את תצורת הפריסה, כולל הרשת, המכונות והאחסון שרוצים לפרוס. מעתיקים אותו לקובץ חדש, שנקרא 'קובץ tfvars', ועורכים אותו לפי הצורך.

cd tf/example/basic
cp basic.tfvars.example basic.tfvars

בסשן של Cloud Shell, פותחים את קובץ ה-tfvars basic.tfvars. אתם יכולים להשתמש בעורך שורת הפקודה המועדף עליכם (vi, nano, emacs וכו') או להשתמש בעורך הקוד של Cloud Console כדי לראות את תוכן הקובץ:

214f43ba6c917aa.png

בודקים את התוכן של קובץ ה-tfvars.

cluster_name = "g1"
project      = "<project>"
zone         = "us-west1-b"

# network_name            = "<existing network name>"
# subnetwork_name         = "<existing subnetwork name>"
# shared_vpc_host_project = "<vpc host project>"

# disable_controller_public_ips = true
# disable_login_public_ips      = true
# disable_compute_public_ips    = true

# suspend_time  = 300

controller_machine_type = "n1-standard-2"
controller_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
controller_disk_type    = "pd-standard"
controller_disk_size_gb = 50
# controller_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# controller_service_account = "default"
# controller_scopes          = ["https://www.googleapis.com/auth/cloud-platform"]
# cloudsql = {
#   server_ip = "<cloudsql ip>"
#   user      = "slurm"
#   password  = "verysecure"
#   db_name   = "slurm_accounting"
# }
# controller_secondary_disk      = false
# controller_secondary_disk_size = 100
# controller_secondary_disk_type = "pd-ssd"
#
# When specifying an instance template, specified controller fields will
# override the template properites.
# controller_instance_template = null

login_machine_type = "n1-standard-2"
login_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
login_disk_type    = "pd-standard"
login_disk_size_gb = 20
# login_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# login_node_count = 1
# login_node_service_account = "default"
# login_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]
#
# When specifying an instance template, specified login fields will
# override the template properties.
# login_instance_template = null

# Optional network storage fields
# network_storage is mounted on all instances
# login_network_storage is mounted on controller and login instances
# network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/home"
#   local_mount   = "/home"
#   fs_type       = "nfs"
#   mount_options = null
# }]
#
# login_network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/net_storage"
#   local_mount   = "/shared"
#   fs_type       = "nfs"
#   mount_options = null
# }]

# compute_node_service_account = "default"
# compute_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]

partitions = [
  { name                 = "debug"
    machine_type         = "n1-standard-2"
    static_node_count    = 0
    max_node_count       = 10
    zone                 = "us-west1-b"
    image                ="projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
    image_hyperthreads   = false
    compute_disk_type    = "pd-standard"
    compute_disk_size_gb = 20
    compute_labels       = {}
    cpu_platform         = null
    gpu_count            = 0
    gpu_type             = null
    network_storage      = []
    preemptible_bursting = false
    vpc_subnet           = null
    exclusive            = false
    enable_placement     = false
    regional_capacity    = false
    regional_policy      = {}
    instance_template    = null
  },
  #  { name                 = "partition2"
  #    machine_type         = "n1-standard-16"
  #    static_node_count    = 0
  #    max_node_count       = 20
  #    zone                 = "us-west1-b"
  #    image                = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
  #    image_hyperthreads   = false
  #
  #    compute_disk_type    = "pd-ssd"
  #    compute_disk_size_gb = 20
  #    compute_labels       = {
  #      key1 = "val1"
  #      key2 = "val2"
  #    }
  #    cpu_platform         = "Intel Skylake"
  #    gpu_count            = 8
  #    gpu_type             = "nvidia-tesla-v100"
  #    network_storage      = [{
  #      server_ip     = "none"
  #      remote_mount  = "<gcs bucket name>"
  #      local_mount   = "/data"
  #      fs_type       = "gcsfuse"
  #      mount_options = "file_mode=664,dir_mode=775,allow_other"
  #    }]
  #    preemptible_bursting = true
  #    vpc_subnet           = null
  #    exclusive            = false
  #    enable_placement     = false
  #
  #    ### NOTE ####
  #    # regional_capacity is under development. You may see slowness in
  #    # deleting lots of instances.
  #    #
  #    # With regional_capacity : True, the region can be specified in the zone.
  #    # Otherwise the region will be inferred from the zone.
  #    zone = "us-west1"
  #    regional_capacity    = True
  #    # Optional
  #    regional_policy      = {
  #        locations = {
  #            "zones/us-west1-a" = {
  #                preference = "DENY"
  #            }
  #        }
  #    }
  #
  #    When specifying an instance template, specified compute fields will
  #    override the template properties.
  #    instance_template = "my-template"
]

בקובץ tfvars הזה יש מספר שדות להגדרה. השדה היחיד שצריך להגדיר הוא הפרויקט. אפשר להשתמש בכל שאר ההגדרות שבדוגמה כמו שהן, אבל לשנות אותן בהתאם למצב שלכם. תיאור מפורט יותר של אפשרויות ההגדרה זמין כאן.

  • cluster_name: שם אשכול Slurm
  • project: מזהה הפרויקט ב-Google Cloud של המיקום שבו המשאבים ייפרסו
  • zone: האזור ב-Google Cloud שמכיל את המופעים של הבקר וההתחברות של האשכול הזה – מידע נוסף
  • network_name: רשת של ענן וירטואלי פרטי (VPC) כדי לפרוס את אשכול ה-Slum בתוך
  • subnetwork_name: רשת משנה של ענן וירטואלי פרטי כדי לפרוס את אשכול ה-Slum בתוך
  • shared_vpc_host_project: רשת ה-VPC המשותפת לפריסת אשכול Slurm בתוך
  • disable_controller_public_ips: להקצות כתובת IP חיצונית לבקר Slurm?
  • disable_login_public_ips: להקצות כתובת IP חיצונית לצומת ההתחברות של Slurm?
  • disable_compute_login_ips: להקצות כתובת IP חיצונית לצומת ההתחברות של Slurm?
  • suspend_time: משך הזמן שצריך להמתין אחרי שצומת לא פעיל לפני השעיית הצומת
  • controller_machine_type: סוג מכונה של צומת בקר
  • controller_image: תמונת GCP שמשמשת ליצירת מופע של בקר Slurm
  • controller_disk_type: סוג דיסק האתחול של מכונת הבקר.
  • controller_disk_size_gb: הגודל של דיסק האתחול של מכונת בקר
  • controller_labels: תוויות שצריך לצרף למופע של בקר
  • controller_service_account: חשבון שירות לשימוש במופע של נאמן המידע
  • controller_scopes: היקף הגישה של מופע הבקר.
  • cloudsql: שרת Google CloudSQL לשימוש כמסד הנתונים מסוג Slurm במקום לארח מסד נתונים במכונה של בקר
  • server_ip: כתובת IP של שרת CloudSQL
  • user: שם משתמש ב-CloudSQL
  • סיסמה: הסיסמה ל-CloudSQL
  • db_name: שם מסד הנתונים ב-CloudSQL
  • controller_secondary_disk: להוסיף דיסק משני לאחסון של שרת NFS?
  • controller_secondary_disk_type: סוג הדיסק המשני של הבקר.
  • controller_secondary_disk_size_gb: גודל הדיסק המשני של הבקר
  • controller_instance_template: התבנית של מכונת GCP שבה צריך להשתמש במופע של בקר. כל שדות המחשוב שצוינו יבטלו את מאפייני התבנית. דוגמה אם מציינים בקר_image, הוא יחליף את התמונה בתבנית של המכונה.
  • login_machine_type: סוג מופע של צומת התחברות (SSH-accessible)
  • login_image: תמונת GCP ששימשה ליצירת מופע ההתחברות של Slurm
  • login_disk_type: סוג דיסק האתחול של מכונת ההתחברות
  • login_disk_size_gb: הגודל של דיסק האתחול של מכונת ההתחברות
  • login_labels: תוויות שצריך לצרף למופע של חשבון ההתחברות
  • login_node_count: מספר צמתים להתחברות שצריך ליצור
  • login_node_service_account: חשבון שירות לשימוש במופעים של ההתחברות
  • login_node_scopes: היקף הגישה של מופע ההתחברות
  • login_instance_template: התבנית למופע של GCP שבה צריך להשתמש עבור מופע ההתחברות. כל שדות המחשוב שצוינו יבטלו את מאפייני התבנית. דוגמה אם מציינים התחברות_image, היא תחליף את התמונה בתבנית של המכונה.
  • network_storage: אחסון ברשת לטעינה בכל הצמתים. השדות יתווספו ישירות ל-fstab. אפשר לחזור על הפעולה כדי לבצע טעינות נוספות.
  • server_ip: כתובת ה-IP של שרת האחסון
  • remote_mount: שם טעינת האחסון (שם מערכת הקבצים)
  • local_mount: ספריית טעינה מקומית
  • fs_type: סוג מערכת הקבצים (NFS, CIFS, Lustre, GCSFuse הותקנה אוטומטית)
  • mount_options: אפשרויות טעינה (למשל defaults,_netdev)
  • login_network_storage: אחסון רשת לטעינה בצמתים של התחברות ובקר. NFS , CIFS , Lustre ו-GCSFuse יותקנו באופן אוטומטי. אפשר לחזור על הפעולה כדי לבצע טעינות נוספות.
  • server_ip: כתובת ה-IP של שרת האחסון
  • remote_mount: שם טעינת האחסון (שם מערכת הקבצים)
  • local_mount: ספריית טעינה מקומית
  • fs_type: סוג מערכת הקבצים (NFS, CIFS, Lustre, GCSFuse הותקנה אוטומטית)
  • mount_options: אפשרויות טעינה (למשל defaults,_netdev)
  • compute_node_service_account: חשבון השירות לשימוש במכונות המחשוב
  • compute_node_scopes: היקף הגישה של מכונות המחשוב
  • מחיצות: הגדרת מחיצות סלור. אפשר לחזור על הפעולה במחיצות נוספות.
  • name: שם המחיצה
  • machine_type: סוג המכונה של צומתי Compute
  • static_node_count: מספר צומתי מחשוב שפועלים כל הזמן
  • max_node_count: המספר המקסימלי של צומתי מחשוב מותרים – 64K לכל היותר
  • zone: אזור ב-Google Cloud שיכיל את המשאבים של המחיצה הזו – מידע נוסף
  • תמונה: סוג מכונה של צומת תמונות מחשוב
  • image_hyperthreads: הפעלה או השבתה של hyperthreading במכונה
  • compute_disk_type: סוג דיסק האתחול של מכונת מחשוב (pd-standard, pd-ssd)
  • compute_disk_size_gb: הגודל של דיסק האתחול של מכונת מחשוב
  • compute_labels: תוויות לצירוף למכונת המחשוב
  • cpu_platform::נדרשת פלטפורמת מעבד (CPU) מינימלית לכל צומתי המחשוב
  • gpu_count: מספר יחידות ה-GPU לצירוף לכל מכונה במחיצה.
  • gpu_type: סוג GPU לצירוף למכונות של המחיצה
  • network_storage: אחסון רשת לטעינה בכל צומתי המחשוב במחיצה. השדות יתווספו ישירות ל-fstab. אפשר לחזור על הפעולה כדי לבצע טעינות נוספות.
  • server_ip: כתובת ה-IP של שרת האחסון
  • remote_mount: שם טעינת האחסון (שם מערכת הקבצים)
  • local_mount: ספריית טעינה מקומית
  • fs_type: סוג מערכת הקבצים (NFS, CIFS, Lustre, GCSFuse הותקנה אוטומטית)
  • mount_options: אפשרות טעינה
  • preemptible_bursting: האם המופעים יהיו זמניים?
  • vpc_subnet: רשת משנה של ענן וירטואלי פרטי כדי לפרוס את מחיצת Slurm בתוך
  • בלעדי: הפעלת Slurm כדי להקצות צמתים שלמים למשימות
  • enable_placement: מפעילים כללי מדיניות בנושא מיקומי מודעות שבהם המכונות ימוקמו בסמוך זו לזו לצורך זמן אחזור קצר של הרשת בין המופעים.
  • regional_capacity: הרשאה למיקום של מכונה בכל תחום באזור על סמך הזמינות
  • regional_policy: אם area_capacity נכון, המדיניות הזו היא לקבוע באיזה אזור להשתמש ובאיזה תחומים לא צריך להשתמש
  • Instance_template: תבנית המכונה של GCP לשימוש במכונות מחשוב. כל שדות המחשוב שצוינו יבטלו את מאפייני התבנית. דוגמה אם תציינו תמונה, היא תחליף את התמונה בתבנית של המכונה.

תצורה מתקדמת

אם תרצו, תוכלו להתקין חבילות ותוכנות נוספות כחלק מתהליך פריסת האשכול. תוכלו להתקין תוכנה באשכול slurm בכמה דרכים שמפורטות במאמר 'התקנת אפליקציות באשכול Slurm ב-Compute Engine', או על ידי התאמה אישית של התמונה שנפרסה על ידי Slurm. בשלב הזה, Slurm פורסת תמונת VM ב-SchedMD, שמבוססת על תמונת ה-VM של Google Cloud HPC, ומעליה מותקן Slurm.

כדי להשתמש בתמונה משלכם, עליכם ליצור תמונה עם הגדרות אישיות שמבוססות על תמונת ה-VM הציבורית של SchedMD, שרשומה בקובץ ה-tfvars. לאחר מכן, מחליפים את ה-URI של התמונה שצוין בקובץ ה-tfvars בתמונה שלכם ובודקים את השינוי.

פתרון בעיות

במהלך ה-Codelab הזה, עיינו בקטע פתרון בעיות במאגר ReadMe של מאגר Slurm-GCP.

הבעיות הנפוצות ביותר שנתקלו הן טעויות בהגדרת קובץ tfvars והגבלות מכסות. ה-Codelab הזה תוכנן לפעול במסגרת מכסת המכסה הרגילה של משתמש חדש, במסגרת הקרדיט שניתן בחינם למשתמש חדש בסך 300$. אם ניסיון ליצור מכונות וירטואליות נכשל, צריך לבדוק את הקובץ /var/log/slurm/resume.log בצומת הבקר כדי לבדוק אם יש שגיאות API.

4. פריסה ואימות של ההגדרות

פורסים את התצורה

בסשן של Cloud Shell, מריצים את הפקודה הבאה מהתיקייה slurm-gcp/tf/example:

terraform init
terraform apply -var-file=basic.tfvars

תתבקשו לאשר את הפעולות שמתוארות, בהתאם להגדרות שקבעתם. מזינים yes (כן). כדי להתחיל בפריסה. אפשר גם לראות את ההגדרות שרוצים לפרוס על ידי הרצת 'terraform plan'.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

הפעולה עשויה להימשך מספר דקות, לכן יש להתאזר בסבלנות.

בסיום הפריסה, יתקבל פלט דומה לזה:

Apply complete! Resources: 8 added, 0 changed, 0 destroyed.

Outputs:

controller_network_ips = [
  [
    "10.0.0.2",
  ],
]
login_network_ips = [
  [
    "10.0.0.3",
  ],
]

אימות היצירה של מכונת VM

פותחים את תפריט הניווט ובוחרים באפשרות Compute Engine > מכונות וירטואליות

d5832bdd527794ed.png

אמורים להופיע בקרונים ומכונה וירטואלית להתחברות:

7a1fc9603758d58d.png

בקטע VM instances, בודקים את שתי המכונות הווירטואליות שנוצרו על ידי Terraform.

אם תשנו את השדה cluster_name, השמות יהיו שונים.

  • בקרי g1
  • g1-login0

5. התחברות לאשכול Slurm

גישה לאשכול סלרום

חוזרים לכרטיסייה Code Editor או Cloud Shell. מריצים את הפקודה הבאה כדי להתחבר למכונה, תוך החלפת הטווח של <ZONE> בתחום הצומת g1-login0 (אמור להיות us-central1-b):

gcloud compute ssh g1-login0 --zone=<ZONE>

הפקודה הזו תכניס אותך למכונה הווירטואלית g1-login0.

שיטה נוספת לגישה קלה לצומת ההתחברות היא באמצעות לחיצה על 'SSH' הלחצן שליד g1-login0 VM בדף המכונות הווירטואליות כדי לפתוח כרטיסייה חדשה עם חיבור SSH.

8c373a87d13620f7.png

אם זו הפעם הראשונה שאתם משתמשים ב-Cloud Shell, יכול להיות שתוצג הודעה כמו ההודעה הבאה שבה תתבקשו ליצור מפתח SSH:

WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/home/user/.ssh] before being
 able to generate SSH keys.

Do you want to continue (Y/n)?

אם כן, מזינים Y. אם מתבקשים לבחור ביטוי סיסמה, משאירים אותו ריק על ידי הקשה על Enter פעמיים.

אם ההודעה הבאה מופיעה במהלך ההתחברות:

*** Slurm is currently being configured in the background. ***
A terminal broadcast will announce when installation and configuration is
complete.

ממתינים ולא ממשיכים בשיעור ה-Lab עד שרואים את ההודעה הבאה (כ-5 דקות):

*** Slurm login setup complete ***

אחרי שרואים את ההודעה שלמעלה, צריך להתנתק ולהתחבר שוב ל-g1-login0 כדי להמשיך בשיעור ה-Lab. כדי לעשות זאת, מקישים על CTRL + C כדי לסיים את המשימה.

לאחר מכן מריצים את הפקודה הבאה להתנתקות ממכונה:

exit

עכשיו מתחברים מחדש ל-VM של ההתחברות. מריצים את הפקודה הבאה כדי להתחבר למכונה, תוך החלפת הערך <ZONE> באזור של הצומת g1-login0:

gcloud compute ssh g1-login0 --zone=<ZONE>

כמו למעלה, ייתכן שתצטרכו להמתין דקה או שתיים עד שתוכלו להתחבר וכל ההיבטים של ההגדרה יושלמו.

סיור בכלים של Slurm ב-CLI

התחברת לצומת ההתחברות ל-Slaurm של האשכול. זהו הצומת ייעודי לאינטראקציה של משתמשים ואדמין, לתזמון משימות Slurm ולפעילות ניהולית.

נריץ כמה פקודות כדי להציג את שורת הפקודה Slurm.

מריצים את הפקודה sinfo כדי להציג את הסטטוס של המשאבים באשכול:

sinfo

פלט לדוגמה של sinfo מופיע בהמשך. sinfo מדווח על הצמתים הזמינים באשכול, על מצב הצמתים האלה ועל מידע אחר כמו המחיצה, הזמינות וכל מגבלת זמן שהצמתים האלה מוטלים.

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ g1-compute-0-[0-9]

אפשר לראות את 10 הצמתים שלנו, בהתאם ל-"max_node_count" של מחיצת ניפוי הבאגים מתוך 10, מסומנים כ"לא פעיל~". (הצומת נמצא במצב לא פעיל ולא מוקצה, ומוכן להוצאה).

לאחר מכן, מפעילים את פקודת squeue כדי להציג את הסטטוס של התור של האשכול:

squeue

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

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

פקודות Slurm , srun ו-'sbatch' משמשות להרצת משימות שמצורפות לתור. 'srun' מפעיל משימות מקבילות ויכול לשמש כ-wrapper עבור mpirun. 'Sbatch' משמש לשליחת משימה באצווה כדי להירדם, ויכול לקרוא ל-srunk פעם אחת או פעמים רבות בתצורות שונות. 'Sbatch' יכולים לקחת סקריפטים באצווה, או להשתמש בהם עם האפשרות -wrap כדי להריץ את כל המשימה משורת הפקודה.

קדימה, נריץ משימה כדי לראות את Slurm בפעולה ונכנס לעבודה בתור!

6. הרצת משימת סלרום והתאמת גודל האשכול

הרצת משימת סלרום והתאמת גודל האשכול

עכשיו, אחרי שחילנו את צביר סלורם, נריץ משימה ונרחיב את האשכול.

ה-"sbatch" משמשת להרצת פקודות וסקריפטים של Slurm באצווה. נריץ סקריפט Sbatch פשוט שיריץ את 'שם המארח' במכונות הווירטואליות שלנו שמותאמים לעומס (auto-scaling).

כשאתם מחוברים אל g1-login0, מריצים את הפקודה הבאה:

sbatch -N2 --wrap="srun hostname"

הפקודה הזו מפעילה את הפקודה מסוג Slurm באצווה. הוא מציין ש-sbatch יריץ 2 צמתים עם הערך 'N-' כאפשרות. הוא גם מציין שכל אחד מהצמתים האלה יריץ 'שם מארח מופעל'. בפקודה ' -wrap' כאפשרות.

כברירת מחדל, sbatch יכתוב את הפלט שלו ב-"slurm-%j.out" בספריית העבודה, הפקודה תרוץ ממנה, כאשר %j יוחלף במזהה המשימה בהתאם לדפוסי שמות הקבצים ב-Slurm. בקובץ ה-sbatch לדוגמה שלנו, מריצים את התיקייה /home של המשתמש, שהיא מערכת קבצים משותפת המבוססת על NFS שמתארחת בבקר כברירת מחדל. כך צמתי המחשוב יכולים לשתף נתוני קלט ופלט אם יש צורך. בסביבת ייצור, אחסון העבודה צריך להיות נפרד מהאחסון בבית או באחסון הביתי כדי למנוע פגיעה בביצועים על פעולות האשכול. אפשר לציין טעינות נפרדות של אחסון בקובץ tfvars בפרמטר 'network_storage'. אפשרויות.

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

Submitted batch job 2

אנחנו יכולים להשתמש במזהה המשימה שמוחזר על ידי פקודת ה-sbatch כדי לעקוב אחרי ביצוע המשימה והמשאבים וגם לנהל אותם. מריצים את הפקודה הבאה כדי להציג את תור המשימות של Slurm:

squeue

סביר להניח שהמשימה שביצעתם תופיע כך:

JOBID PARTITION               NAME     USER ST       TIME  NODES   NODELIST(REASON)
    2     debug g1-compute-0-[0-1] username  R       0:10      2 g1-compute-0-[0-1]

מכיוון שלא הוקצו לנו צמתי מחשוב, Slurm תיצור באופן אוטומטי מכונות מחשוב בהתאם לדרישות המשימה. האופי האוטומטי של התהליך הזה כולל שני יתרונות. ראשית, הוא מבטל את העבודה שנדרשת בדרך כלל באשכול HPC של צמתים להקצאת הרשאות ידנית, הגדרת התוכנה, שילוב הצומת באשכול, ולאחר מכן פריסת המשימה. שנית, הוא מאפשר למשתמשים לחסוך כסף כי צמתים לא פעילים שאינם בשימוש מוקטנים עד ליצירת המספר המינימלי של צמתים.

אפשר להריץ את הפקודה sinfo כדי לצפות באשכול Slurm שמסתובב:

sinfo

יוצגו הצמתים הרשומים ברצף ב-'alloc#' כלומר, מוקצים את הצמתים:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2 alloc#  g1-compute-0-[0-1]

אפשר גם לעיין בקטע 'מכונות וירטואליות' במסוף Google Cloud כדי לראות את הצמתים החדשים שהוקצו. לפני שהמשימה תוקצה לצמתים החדשים שיוקצו, צריך לחכות כמה דקות להפעלת הצמתים ולהפעיל את Slurm. בקרוב רשימת מכונות ה-VM תיראה כך:

9997efff595f1e.png

אחרי שהצמתים מריצים את המשימה, המכונות עוברות ל-"alloc" כלומר, המשימות מוקצות למשימה:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2  alloc g1-compute-0-[0-1]

אחרי שהמשימה מסתיימת, היא כבר לא תופיע ברשימת המשימות צמתים ב-sinfo יחזרו למצב 'לא פעיל'. . הפעלת 'רצף' מדי פעם עד שהעבודה תסתיים, אחרי דקה או שתיים.

קובץ הפלט slurm-%j.out ייכתב לתיקיית הבית /המשותף של NFS, ויכיל את שמות המארחים. פותחים או סורקים את קובץ הפלט (בדרך כלל slurm-2.out), התוכן של קובץ הפלט יכיל:

g1-compute-0-0
g1-compute-0-1

כל הכבוד, הרצתם משימה והגדלתם את אשכול ה-Slurm!

7. הפעלה של משימת MPI

עכשיו נריץ משימת MPI בכל הצמתים שלנו. כאשר אתה מחובר אל g1-login0, השתמש ב-wget כדי להוריד תוכנית MPI הכתובה בשפת התכנות C:

wget https://raw.githubusercontent.com/mpitutorial/mpitutorial/gh-pages/tutorials/mpi-hello-world/code/mpi_hello_world.c

כדי להשתמש בכלים של OpenMPI, תצטרכו לטעון את המודולים של OpenMPI באמצעות הרצת הפקודה הבאה:

module load openmpi

נשתמש ב-"mpicc" כדי להדר את קוד ה-MPI C. מריצים את הפקודה הבאה:

mpicc mpi_hello_world.c -o mpi_hello_world

הפעולה הזו מהדרת את קוד ה-C שלנו לקוד מכונה, כדי שנוכל להריץ את הקוד בכל האשכול דרך Slurm.

לאחר מכן, משתמשים בכלי לעריכת טקסט המועדף עליכם כדי ליצור סקריפט אצווה בשם "helloworld_batch":

vi helloworld_batch

מקלידים i כדי להיכנס למצב vi Insert.

העתיקו והדביקו את הטקסט הבא בקובץ כדי ליצור סקריפט sbatch פשוט:

#!/bin/bash
#
#SBATCH --job-name=hello_world
#SBATCH --output=hello_world-%j.out
#
#SBATCH --nodes=2

srun mpi_hello_world

כדי לשמור את עורך הקוד ולצאת ממנו, לוחצים על Escape ומקלידים " :wq" ללא מירכאות.

הסקריפט הזה מגדיר את סביבת הביצוע והמשימות של Slurm באצווה. ראשית, סביבת הביצוע מוגדרת כ-bash. בשלב הבא, הסקריפט מגדיר קודם את אפשרויות Slurm באמצעות התג ' #SBATCH' שם המשימה מוגדר כ-'hello_world'.

קובץ הפלט מוגדר כ-"hello_world_%j.out" כאשר %j מוחלף במזהה המשימה בהתאם לדפוסי שמות הקבצים ב-Slurm. קובץ הפלט הזה נכתב לספרייה שממנה מופעל סקריפט ה-sbatch. בדוגמה שלנו, זוהי התיקייה /home של המשתמש, שהיא מערכת קבצים משותפת שמבוססת על NFS. כך צמתי המחשוב יכולים לשתף נתוני קלט ופלט אם יש צורך. בסביבת ייצור, אחסון העבודה צריך להיות נפרד מהאחסון בבית או באחסון הביתי כדי למנוע פגיעה בביצועים על פעולות האשכול.

לבסוף, מספר הצמתים שהסקריפט הזה צריך לרוץ בהם מוגדר כ-2.

לאחר הגדרת האפשרויות, ניתנות פקודות להפעלה. הסקריפט הזה יריץ את הקוד mpi_hello_world באופן מקביל באמצעות פקודת ה-srun, שהיא תחליף לגרסה המחודשת של הפקודה mpirun.

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

sbatch helloworld_batch

הרצת המשימה תחזיר מזהה משימה של המשימה המתוזמנת. לדוגמה:

Submitted batch job 3

הפעולה הזו תריץ את הפקודה hostname בשני צמתים, עם משימה אחת לכל צומת, ותדפיס את הפלט לקובץ hello_world-3.out.

מכיוון שכבר הוקצו לנו 2 צמתים, המשימה הזו תרוץ במהירות.

עוקבים אחר ההמשך עד שהמשימה תסתיים ולא תופיע יותר ברשימה:

squeue

אחרי שמסיימים לפתוח את הקובץ hello_world-3.out או לאשר שהוא פועל ב-g1-compute-0-[0-1]:

Hello world from processor g1-compute-0-0, rank 0 out of 2 processors
Hello world from processor g1-compute-0-1, rank 1 out of 2 processors

אחרי 5 דקות של חוסר פעילות (ניתן להגדרה באמצעות השדה suspended_time של YAML או השדה suspendedTime ב-slurm.conf), צומתי המחשוב שהוקצו באופן דינמי לא יוקצו לשחרור משאבים. כדי לבדוק זאת, אפשר להריץ sinfo מדי פעם ולבדוק שגודל האשכול חוזר ל-0:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ g1-compute-0-[0-9]

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

8. סיכום

מעולה! יצרת אשכול Slurm ב-Google Cloud Platform, והשתמשת בתכונות החדשות שלו כדי להתאים אוטומטית את האשכול לעומס (workload) כדי לתת מענה לעומסי העבודה (workload) שלך. אתם יכולים להשתמש במודל הזה כדי להריץ מגוון משימות, ולהתאים אותו למאות מכונות תוך דקות פשוט באמצעות בקשת הצמתים ב-Slam.

כדי להמשיך ללמוד להשתמש ב-Slurm ב-GCP, כדאי להמשיך עם " בניית אשכולות HPC מאוחדים עם Slurm" Codelab. ה-Codelab הזה ידריך אתכם איך להגדיר שני אשכולות Slurm מאוחדים בענן, כדי לייצג את האופן שבו ניתן להשיג איחוד מרובה אשכולות, בארגון או בענן.

אתם מפתחים משהו מגניב באמצעות הפונקציונליות החדשה מבוססת-GCP של Slurm? יש לך שאלות? יש לך הצעה לתכונה? אפשר לפנות עוד היום לצוות Google Cloud דרך אתר שירותי המחשוב עתיר הביצועים (HPC) של Google Cloud, או לשוחח איתנו בצ'אט ב-Google Cloud קבוצת דיון של Slurm!

ניקוי הפריסה של Terraform

יציאה מהצומת ב-Slurm:

exit

ניתן לאפשר לצמתים שמותאמים לעומס (auto-scaling) לפני מחיקת הפריסה. אפשר גם למחוק את הצמתים האלה באופן ידני באמצעות הפקודה "gcloud compute instances delete <Instance Name> " עבור כל מכונה, או על ידי שימוש ב-GUI של המסוף כדי לבחור מספר צמתים וללחוץ על "Delete".

כדי להסיר את הפריסה של Terraform בסיום, מריצים את הפקודה הבאה מ-Google Cloud Shell אחרי שמתנתקים מ-g1-login0:

cd ~/slurm-gcp/tf/examples/basic
terraform destroy -var-file=basic.tfvars

כשמופיעה בקשה, מקלידים yes כדי להמשיך. הפעולה הזו עשויה להימשך כמה דקות, יש להתאזר בסבלנות.

מחיקת הפרויקט

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

  • בתפריט הניווט, בוחרים באפשרות IAM & Admin (אדמין)
  • לאחר מכן לוחצים על 'הגדרות' בתפריט המשנה
  • לוחצים על סמל פח האשפה עם הטקסט "מחיקת פרויקט"
  • פועלים לפי ההנחיות.

הנושאים שטיפלנו בהם

  • איך לפרוס את Slurm ב-GCP באמצעות Terraform.
  • איך מריצים משימה באמצעות Slurm ב-GCP.
  • איך לשלוח שאילתות על מידע על אשכולות ולעקוב אחרי משימות שרצות ב-Slurm.
  • איך להתאים באופן אוטומטי לצמתים באמצעות Slurm ב-GCP, כדי להתאים לדרישות ולפרמטרים ספציפיים של משימות.
  • איך להדר והרצה של אפליקציות MPI ב-Slurm ב-GCP.

חיפוש תמיכה לסלפורות

אם אתם זקוקים לתמיכה בשימוש בשילובים האלה בסביבות בדיקה או ייצור, תוכלו לפנות ישירות ל-SchedMD באמצעות דף יצירת הקשר שלהם כאן: https://www.schedmd.com/contact.php

אפשר גם להשתמש במדריכים הזמינים לפתרון בעיות:

לסיום, תוכלו גם לפרסם את השאלה קבוצת הדיון של Slurm נמצאת כאן: https://groups.google.com/g/google-cloud-slurm-discuss

מידע נוסף

משוב

אפשר לשלוח משוב על Codelab זה באמצעות הקישור הזה. מילוי המשוב נמשך פחות מ-5 דקות. תודה!