הרצת הדמיות דינמיות מולקולריות של גרומאקס באמצעות נוזלים מספריים' Slurm-GCP

1. מבוא

עדכון אחרון: 25 באפריל 2022

מה תפַתחו

ב-Codelab הזה, תפרסו אשכול מחשוב ביצועים (HPC) עם התאמה לעומס (auto-scaling) ב-Google Cloud.פריסה של Terraform יוצרת את האשכול הזה עם גרומאקים מותקנים דרך Spack. האשכול ינוהל באמצעות מתזמן המשימות של Slurm. לאחר יצירת האשכול, תפעילו את benchMEM, benchPEP או benchRIBs.

מה תלמדו

  • איך לפרוס אשכול HPC שתומך במתזמן המשימות של Slurm
  • איך להריץ סימולציות של דינמיקה מולקולרית עם האצה של GPU ב-Gromacs ב-Google Cloud, באמצעות משימת Slurm באצווה

מה צריך להכין

2. הגדרה

כדי להשלים את ה-Codelab הזה , צריך להפעיל את ממשקי ה-API של Compute Engine ושל Cloud Build. כדי להפעיל את ממשקי ה-API של Compute Engine ו-Cloud Build, עליכם לפתוח את Cloud Shell ולהריץ את הפקודות הבאות. חשוב לזכור להחליף את project-id ב- שלמטה.

gcloud config set project <PROJECT_ID>
gcloud services enable compute.googleapis.com
gcloud services enable cloudbuild.googleapis.com

זהירות: אם אתם מתכננים להשתמש ב-SSH של צד שלישי (למשל OpenSSH) כדי להתחבר לאשכול, חשוב שתצרפו מפתח SSH לפרופיל Cloud Identity שלכם באמצעות OS Login. מידע נוסף על הוספת מפתחות SSH לפרופיל Cloud Identity

3. [אופציונלי] יצירת תמונת VM של GCP באמצעות Gramacs

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

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

צינור עיבוד הנתונים של Gromacs Cloud Build במאגר של RCC Apps כולל את ההוראות הנדרשות להתקנת Gumacs. בתהליך ההתקנה נעשה שימוש ב-Packer כדי לפרוס מכונה וירטואלית (VM) שמתקינה את Spack, והמהדר (compiler) GCC@9.2.0 ו-Gromacs@2021.2 מופעלים, כשהאצת GPU מופעלת.

  1. פותחים את Cloud Shell ב-GCP.
  2. שכפול המאגר של FluidNumerics/rcc-apps
cd ~
git clone https://github.com/FluidNumerics/rcc-apps.git
  1. יצירת התמונה באמצעות Google Cloud Build.
cd rcc-apps
gcloud builds submit . --config=gromacs/cloudbuild.yaml --project=<PROJECT_ID> --async

אפשר לבדוק את הסטטוס של תהליך ה-build במרכז הבקרה של Google Cloud Build

תהליך ה-build יכול להימשך שעתיים. כדי להאיץ את זה,כדאי לשנות את הסכימה של קובץ תצורת build כדי לשנות את סוג המכונה כדי לשפר את הביצועים של ה-build. אפשר לעשות זאת באמצעות משתנה ה-build _MACHINE_TYPE. לדוגמה:

gcloud builds submit . --config=gromacs/cloudbuild.yaml --project=<PROJECT_ID> --async --substitutions=_MACHINE_TYPE=n2-standard-64

בסיום ה-build תהיה לכם תמונת VM זמינה בפרויקט ב-Google Cloud, ותוכלו להשתמש בה כדי לפרוס את האשכול.

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

בקטע הזה תשתמשו ב-Terraform כדי לפרוס אשכול HPC עם התאמה אוטומטית לעומס (auto-scaling), כאשר מתזמן המשימות של Slurm מותקן. האשכול הזה ייפרס עם צומתי מחשוב שלכל אחד מהם יש 8 vCPU ו-GPU אחד של Nvidia® Tesla V100.

  1. פותחים את Cloud Shell ב-GCP.
  2. שכפול המאגר של FluidNumerics/rcc-apps
cd ~
git clone https://github.com/FluidNumerics/rcc-apps.git
  1. שינוי לספריית tromacs terraform:
cd ~/rcc-apps/gromacs/tf/slurm
  1. תיצרו ותבדקו תוכנית שטח. מגדירים את משתני הסביבה GMX_NAME, GMX_PROJECT ו-GMX_ZONE כדי לציין את שם האשכול, הפרויקט ב-GCP ואת התחום שבו רוצים לפרוס. אם לא ברור לך איזו הערה אפשר לבדוק בהמשך
export GMX_PROJECT=<PROJECT_ID>
export GMX_ZONE=<ZONE> 
export GMX_NAME="gromacs" 
  1. אם יצרתם תמונת VM משלכם בקטע הקודם ב-Codelab הזה, צריך להגדיר גם את משתנה הסביבה GMX_IMAGE

ייצוא GMX_IMAGE="projects/${GMX_PROJECT}/global/images/gromacs-gcp-foss-previous"

  1. יוצרים את התוכנית באמצעות פקודת make, שתריץ את terraform init && terraform plan.
make plan
  1. פורסים את האשכול. תהליך ההגדרה נמשך רק כמה דקות, מכיוון ש-Gromacs ויחסי התלות שלו מותקנים מראש באשכול.
make apply
  1. SSH לצומת login שנוצר בשלב הקודם. אפשר לראות את הצומת הזה בשלב הקודם (כנראה נקרא gromacs-login0). כדי לעשות זאת, לוחצים על לחצן SSH שלצד רשימת המכונות הווירטואליות בתפריט המסוף Compute Engine -> מופע של מכונה וירטואלית.

אפשרות: צמד פקודות gcloud שיגדיר את שם הצומת של ההתחברות ואת ה-SSH צריך:

export CLUSTER_LOGIN_NODE=$(gcloud compute instances list --zones ${GMX_ZONE} --filter="name ~ .*login" --format="value(name)" | head -n1)
gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone ${GMX_ZONE}
  1. לאחר ההתחברות לצומת ההתחברות, כדי לאמת את הגדרת האשכול, יש לוודא ש-Gromacs מותקנת
$ spack find gromacs
==> In environment /apps/spack-pkg-env
==> Root specs
gromacs@2021.2 +cuda~mpi

==> 1 installed package
-- linux-centos7-x86_64 / gcc@9.2.0 -----------------------------
gromacs@2021.2
  1. צריך לוודא שהתוכן שמפורט למטה ב-/opt/share/gromacs.
$ ls /opt/share/gromacs/
benchMEM.tpr benchPEP-h.tpr benchPEP.tpr benchRIB.tpr

5. הפעלת נקודת ההשוואה ב-BnchRIB

Gromacs היא תוכנת מחקר שמשמשת להדמיה של דינמיקה מולקולרית ולחישוב מבנים מולקולריים בכפוף למגבלות של צמצום אנרגיה. נקודות ההשוואה שמופיעות בתמונת ה-VM ב-Codelab מתמקדות בדינמיקה מולקולרית, בהתפתחות של מערכות של אטומים.

בדינמיקה מולקולרית, המיקומים, המהירויות והתאוצות של אטומים מדומים באמצעות חוקי התנועה של ניוטון :

638fa1fba54c3874.png

כאשר, וקטור מיקום הוא המיקום של האטום i, t הוא זמן, 72a717ea69626d54.png הוא המסה של האטום i ו-b5e52e17becb80ec.png הוא הכוח הלא-מקושר על האטום i עקב האטום j ו-538199b3881cd305.png הם הכוחות שנובעים מאינטראקציות קשורות. בהתחשב בטמפרטורה, בלחץ, במיקומים של האטום ובמהירויות האטומים, הכוחות מחושבים והמערכת משולבת מבחינה מספרית כדי לקבל מהירויות אטום ומיקומים חדשים. התהליך הזה חוזר על עצמו כדי לדמות את הדינמיקה המולקולרית במשך פרק זמן נתון.

תמונת Gramacs (זו שיצרת או זו שסיפקת) כוללת שלוש נקודות השוואה

  1. benchMEM
  2. benchRIB
  3. benchPEP

נקודות ההשוואה האלה מגיעות מ-Dr. נקודות ההשוואה של Free Gumacs של קוצנר , הן קבוצה סטנדרטית של סימולציות של דינמיקה מולקולרית חולפת. כל נקודת השוואה משתנה במספר האטומים ובמשך הסימולציה. ההגדרות הרלוונטיות לכל סימולציה מפורטות בטבלה הבאה.

מדד / נקודת השוואה

benchMEM

benchRIB

benchPEP

מספר עדכוני ה-Atom

81,743

2,136,412

12,495,503

גודל מערכת / nm

10.8 x 10.2 x 9.6

31.2 x 31.2 x 31.2

50.0 x 50.0 x 50.0

Time Step / fs

2

4

2

חיתוך Radii / nm

1

1

1.2

ריווח של רשתות PME / nm

0.12

0.135

0.16

כדי להריץ את נקודת ההשוואה, צריך לשלוח משימת אצווה של Slurm. כברירת מחדל, הסקריפט המאצווה שסופק מפעיל את נקודת ההשוואה ב-BnchRIB. חבילות הקלט שמגדירות את ההגדרות של נקודות ההשוואה שסופקו כלולות בתמונה של ה-VM של Gramacs בקטע /opt/share/gromacs. בנוסף, סקריפט bash לדוגמה להרצת Gumacs זמין ב-/opt/share.

בקטע הזה, צריך SSH לצומת login של האשכול

  1. שליחת משימה באצווה באמצעות פקודת sbatch
$ sbatch --ntasks=1 --cpus-per-task=8 --gres=gpu:1 --out=gromacs.out /opt/share/gromacs_bench.sh

הפעולה הזו תעביר את המשימה לתור לביצוע ו-Slurm יקצה לכם צומת מחשוב. כשמריצים את sinfo, רואים שצומת מחשוב נמצא במצב alloc#, כלומר צומת המחשוב מוקצה למשימה שלכם אבל הוא בתהליך הקצאה. לאחר שהמשימה תפעל, הצומת יוגדר למצב alloc.

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
gromacs*     up   infinite      1 alloc# gromacs-compute-0-0
$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                 2   gromacs gromacs_      joe  R       0:02      1 gromacs-compute-0-0
$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
gromacs*     up   infinite      1  alloc gromacs-compute-0-0

מחכים שהמשימה תסתיים. נקודת ההשוואה (benchRIB) שמוגדרת כברירת מחדל מדמה כ-8 מיליון אטומים ומוגדרת להפעלה של 5,000 שלבי זמן (עם 4 שלבים/fs) והשלמת הפעולה נמשכת כ-6 דקות. אתם יכולים לעקוב אחרי סטטוס המשימה באמצעות הפקודה הבאה:

watch squeue

כשהמשימה נעלמת מהתור, אפשר לצאת באמצעות Ctrl-C.

  1. בסיום המשימה, אמורה להופיע ספרייה בשם run/ שמכילה את פלט הסימולציה (בקטע run/MEM) וקובץ יומן בספרייה הנוכחית בשם gromacs.out. הספרייה run/MEM מכילה שני קבצים: ener.edr ו-md.log. הקובץ ener.edr מאחסן את האנרגיות, הטמפרטורה, הלחץ, גודל הקופסה, הצפיפות ווריאנטים של המערכת בפורמט בינארי ונייד. כפי שהתוסף מרמז, הקובץ md.log מכיל יומנים עבור הסימולציה של Garmacs, וכן מידע על ביצועי הסימולציה, בנוסף למידע על רישום המידע מפתרונות החלקיקים ומפתרונות ה-PME. התוכן של gromacs.out מכיל פלט סטנדרטי מ-gmx mdrun צריך להיות דומה לזה שמוצג בהמשך.
$ tail -n9 gromacs.out
step 5000, remaining wall clock time:     0 s          
               Core t (s)   Wall t (s)        (%)
       Time:     3085.342      385.683      800.0
                 (ns/day)    (hour/ns)
Performance:        4.481        5.356

GROMACS reminds you: "I never thought of stopping, and I just hated sleeping. I can't imagine having a better life." (Barbara McClintock)

OK

6. מזל טוב

בשיעור ה-Codelab הזה, יצרתם אשכול HPC מבוסס-ענן עם התאמה אוטומטית לעומס (auto-scaling), והרצתם סימולציית דינמיקה מולקולרית מואצת של GPU עם Gramacs ב-Google Cloud!

מנקה

כדי לא לצבור חיובים לחשבון Google Cloud עבור המשאבים שבהם השתמשתם ב-Codelab הזה:

מומלץ: למחוק את אשכול ה-HPC באמצעות Terraform

  1. פותחים את המעטפת של Cloud Shell ועוברים לספרייה לדוגמה gromacs/tf/slurm.
cd ~/rcc-apps/gromacs/tf/slurm
  1. מריצים את האפשרות 'השמדת' כדי למחוק את כל המשאבים.
make destroy

או, מוחקים את הפרויקט (היעיל וההרסני ביותר)

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם עבור Codelab.

זהירות: למחיקת פרויקט יש את ההשפעות הבאות:

  • התוכן של הפרויקט נמחק כולו. אם השתמשתם בפרויקט קיים ב-Codelab הזה, כשמוחקים אותו, נמחקות גם כל העבודה האחרות שביצעתם בפרויקט.
  • מאבדים את מזהה הפרויקט בהתאמה אישית. כשיצרתם את הפרויקט, יכול להיות שיצרתם מזהה פרויקט מותאם אישית שבו תרצו להשתמש בעתיד. כדי לשמור על כתובות ה-URL שמשתמשות במזהה הפרויקט, כמו appspot.com, צריך למחוק את המשאבים שנבחרו בפרויקט אבל לא את הפרויקט כולו.

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

  1. במסוף Cloud, עוברים לדף Manage resources. כניסה לדף Manage resources
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ואז לוחצים על מחיקה c01e35138ac49503.png.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.