מפעילים את מודל חיזוי מזג האוויר של WRF באמצעות Fluid Numerics' Slurm-GCP

1. מבוא

קונטיננטלי, ארה"ב

עדכון אחרון:5 במאי 2021

מה תפַתחו

ב-Codelab הזה, אתם מתכוונים לפרוס אשכול מחשוב ביצועים (HPC) עם התאמה אוטומטית לעומס (auto-scaling) ב-Google Cloud באמצעות מתזמן המשימות של Slurm. נשתמש בדוגמה של פריסת Terraform שבה פורסים את האשכול הזה כאשר WRF® מותקן דרך Spack. לאחר מכן תשתמשו בתשתית הזו כדי להריץ את בנצ'מרק CONUS ל-2.5 ק"מ או את בנצ'מרק CONUS ל-12 ק"מ.

מה תלמדו

  • איך להגדיר כללי מדיניות של ניהול זהויות והרשאות גישה (IAM) להפעלת אשכול HPC ב-Google Cloud Platform
  • איך לפרוס אשכול HPC מבוסס-ענן באמצעות מתזמן המשימות של Slurm
  • איך להריץ ®WRF במקביל ב-Google Cloud באמצעות משימת Slurm באצווה

מה צריך להכין

2. תצורה

הפעלת ממשקי Google Cloud API

כדי ליצור ממשקי API של משאבי Google Cloud ולהשתמש בהם, צריך להפעיל אותם.

gcloud services enable compute.googleapis.com 

הגדרת כללי מדיניות IAM

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

ב-Google Cloud, הממשק OS Login API מקצה פרטי משתמשי POSIX מחשבונות Google Workspace, Cloud Identity ו-Gmail. בנוסף, השירות OS Login משתלב עם מערכת ניהול זהויות והרשאות גישה (IAM) של GCP, כדי לקבוע אם משתמשים יכולים לקבל הרשאות להסלים הרשאות במערכות Linux.

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

  • יצירה/מחיקה של מכונות VM של Google Compute Engine (GCE)
  • SSH למכונות וירטואליות של GCE

57883cb8acc09653.png

כדי להקצות לעצמכם את תפקידי ה-IAM הנדרשים להשלמת המדריך הזה, במסוף Google Cloud:

  1. מעבר לדף IAM & אדמין > IAM בתפריט 'מוצרים ושירותים'.
  2. לוחצים על '+הוספה' שליד החלק העליון של הדף.
  3. מקלידים את הטקסט של חשבון Google Workspace, חשבון Cloud Identity או חשבון Gmail בקטע 'חברים חדשים'
  4. מוסיפים את התפקידים הבאים : Compute Admin, Compute OS Login ו-Service Account User
  5. לוחצים על שמירה.

ההתחברות שלך כוללת עכשיו את ההרשאות הנדרשות ליצירת אשכול HPC.

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

$ gcloud projects get-iam-policy YOUR_PROJECT --flatten="bindings[].members" --format='table(bindings.role)' --filter="bindings.members=user:EMAIL_ADDRESS"

הפקודה הזו תפיק את הפלט:

ROLE
roles/compute.osLogin
roles/iam.serviceAccountUser
roles/compute.admin

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

בקטע הזה, תפרסו אשכול HPC עם התאמה אוטומטית לעומס (auto-scaling), כולל מתזמן המשימות של Slurm. היא זהה לאפשרות 'מכסה גבוהה', אבל סוג המכונה קטן יותר ומספר יחידות ה-vCPU שנעשה בו שימוש קטן יותר.

  1. פותחים את Cloud Shell ב-GCP.
  2. שכפול המאגר FluidNumerics/slurm-gcp
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. משנים לספריית WRF:
cd  ~/slurm-gcp/tf/examples/wrf
  1. תיצרו ותבדקו תוכנית שטח. מגדירים את משתני הסביבה WRF_NAME, WRF_PROJECT ו-WRF_ZONE כדי לציין את שם האשכול, הפרויקט ב-GCP ואת התחום שבו רוצים לפרוס.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME="wrf-small"
  1. בפעם הראשונה שמריצים terraform, צריך להריץ את הפקודה init:
terraform init
  1. יוצרים את התוכנית באמצעות פקודת make, שתריץ את terraform
make plan
  1. פורסים את האשכול. תהליך ההתקנה וההגדרה עשוי להימשך עד שעתיים. במהלך הפריסה יותקנו ה-WRF וכל יחסי התלות שלו.
make apply
  1. SSH לצומת login שנוצר בשלב הקודם. אפשר לראות את הצומת הזה בשלב הקודם (כנראה נקרא wrf-small-login0). כדי לעשות זאת, לוחצים על לחצן SSH שלצד רשימת המכונות הווירטואליות בתפריט המסוף Compute Engine -> מופע של מכונה וירטואלית.

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

export CLUSTER_LOGIN_NODE=$(gcloud compute instances list --zones ${WRF_ZONE} --filter="name ~ .*login" --format="value(name)" | head -n1)

gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone ${WRF_ZONE}

  1. לאחר ההתחברות לצומת ההתחברות, כדי לאמת את הגדרת האשכול, בודקים שמודול ה-wrf זמין.
$ module load gcc && module load openmpi && module avail
-------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/openmpi/4.0.5-eagetxh/gcc/9.2.0 --------------------------------------
   hdf5/1.10.7    netcdf-c/4.7.4    netcdf-fortran/4.5.3    parallel-netcdf/1.12.1    wrf/4.2

------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/gcc/9.2.0 -------------------------------------------------
   hwloc/2.2.0      libiconv/1.16          libpng/1.6.37     nasm/2.15.05            openmpi/4.0.5 (L,D)    time/1.9              zlib/1.2.11
   jasper/2.0.16    libjpeg-turbo/2.0.4    libtirpc/1.2.6    ncurses/5.9.20130511    perl/5.16.3            util-macros/1.19.1
   krb5/1.15.1      libpciaccess/0.16      libxml2/2.9.10    numactl/2.0.14          tcsh/6.22.02           xz/5.2.2

--------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/Core ----------------------------------------------------
   gcc/9.2.0 (L)

---------------------------------------------------------------------- /apps/modulefiles ----------------------------------------------------------------------
   openmpi/v4.1.x
  1. צריך לוודא שהתוכן שמפורט למטה ב-/apps/share/conus-12km.
$  ls -1 /apps/share/conus-12km/
FILE:2018-06-17_00
FILE:2018-06-17_03
FILE:2018-06-17_06
FILE:2018-06-17_09
FILE:2018-06-17_12
geo_em.d01.nc
geogrid.log
met_em.d01.2018-06-17_00:00:00.nc
met_em.d01.2018-06-17_03:00:00.nc
met_em.d01.2018-06-17_06:00:00.nc
met_em.d01.2018-06-17_09:00:00.nc
met_em.d01.2018-06-17_12:00:00.nc
metgrid.log
namelist.input
namelist.wps
ungrib.log
wrfbdy_d01
wrfinput_d01

4. להריץ את נקודת ההשוואה CONUS של 12 ק"מ

כדי להריץ את נקודת ההשוואה CONUS של 12 ק"מ, צריך לשלוח משימת אצווה של Slurm. מצגות הקלט של נקודת ההשוואה הזו כלולות בתמונת ה-VM מסוג wrf-gcp בקטע /apps/share/benchmarks/conus-12km.

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

  1. מעתיקים את קובץ האצווה לדוגמה wrf-conus.sh מהכתובת /apps/share
cp /apps/share/wrf-conus12.sh ~/
  1. פותחים את wrf-conus.sh בכלי לעריכת טקסט כדי לוודא שהשדות --partition ו---ntasks מוגדרים כראוי. צריך להגדיר את מספר המשימות כמספר רמות ה-MPI שבהן רוצים להשתמש כדי לבצע את המשימה. בהדגמה הזו, מספר המשימות שווה למספר ה-vCPU שנעשה בו שימוש למשימה, והוא לא יכול לחרוג מהמכסה הזמינה שלכם.
#!/bin/bash
#SBATCH --partition=wrf
#SBATCH --ntasks=24
#SBATCH --ntasks-per-node=8
#SBATCH --mem-per-cpu=2g
#SBATCH --cpus-per-task=1
#SBATCH --account=default
#
# /////////////////////////////////////////////// #

WORK_PATH=${HOME}/wrf-benchmark/
SRUN_FLAGS="-n $SLURM_NTASKS --cpu-bind=threads"

. /apps/share/spack.sh
module load gcc/9.2.0
module load openmpi
module load hdf5 netcdf-c netcdf-fortran wrf

mkdir -p ${WORK_PATH}
cd ${WORK_PATH}
ln -s ${INSTALL_ROOT}/share/conus-12km/* .
ln -s $(spack location -i wrf)/run/* .

srun $MPI_FLAGS ./wrf.exe
  1. שליחת המשימה באצווה באמצעות sbatch.
sbatch wrf-conus12.sh
  1. מחכים שהמשימה תסתיים. נקודת ההשוואה הזו מוגדרת להפעלת תחזית ל-6 שעות. התהליך נמשך כ-3 שעות ויש לה 24 דירוגים. יש לך אפשרות לעקוב אחר סטטוס העבודה באמצעות squeue.
  2. כשהמשימה תסתיים, עליכם לבדוק את התוכן של rsl.out.0000 כדי לוודא שאתם רואים את ההצהרה (wrf: Success COMPLETE WRF). הסיומת המספרית תהיה שונה אם הרצתם את המשימה יותר מפעם אחת, למשל, טעיתם בהגדרת תצורה ונאלצתם להפעיל אותה מחדש.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

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

בקטע הזה, תפרסו אשכול HPC עם התאמה אוטומטית לעומס (auto-scaling), כולל מתזמן המשימות של Slurm ב-GCP.

  1. פותחים את Cloud Shell ב-GCP.
  2. שכפול המאגר FluidNumerics/slurm-gcp
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. משנים לספריית WRF:
cd  ~/slurm-gcp/tf/examples/wrf
  1. תיצרו ותבדקו תוכנית שטח. מגדירים את משתני הסביבה WRF_NAME, WRF_PROJECT, WRF_ZONE, WRF_MAX_NODE ו-WRF_MACHINE_TYPE כדי לציין את שם האשכול, הפרויקט ב-GCP, את התחום שבו רוצים לפרוס, את מספר הצמתים המקסימלי ואת סוג המכונה. בנצ'מרק של 2.5 ק"מ ל-CONUS, אנחנו ממליצים להשתמש במכונות מסוג c2-standard-60 עם לפחות 8 צמתים זמינים של משימות ריצה עם דירוג של 480 MPI.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME=wrf-large
export WRF_MAX_NODE=5
export WRF_MACHINE_TYPE="c2-standard-60"
  1. אם לא ביצעת את הפעולה הזו למעלה, צריך להריץ את הפקודה terraform init כדי להפעיל terraform:
terraform init
  1. יוצרים את התוכנית באמצעות פקודת make.
make plan
  1. פורסים את האשכול. תהליך ההתקנה וההגדרה עשוי להימשך עד שעתיים. במהלך הפריסה יותקנו ה-WRF וכל יחסי התלות שלו.
make apply
  1. SSH לצומת login שנוצר בשלב הקודם. אפשר לראות את הצומת הזה בשלב הקודם (כנראה נקרא wrf-large-login0). כדי לעשות זאת, לוחצים על לחצן SSH שלצד רשימת המכונות הווירטואליות בתפריט המסוף Compute Engine -> מופע של מכונה וירטואלית.

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

export CLUSTER_LOGIN_NODE=$(gcloud compute instances list --zones ${WRF_ZONE} --filter="name ~ .*login" --format="value(name)" | head -n1)

gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone ${WRF_ZONE}

הפקודה השנייה אמורה לגרום לחיבור לצומת Slurm Login.

  1. לאחר ההתחברות לצומת ההתחברות, כדי לאמת את הגדרת האשכול, בודקים שמודול ה-wrf זמין.
$ module load gcc && module load openmpi && module avail
-------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/openmpi/4.0.5-eagetxh/gcc/9.2.0 --------------------------------------
   hdf5/1.10.7    netcdf-c/4.7.4    netcdf-fortran/4.5.3    parallel-netcdf/1.12.1    wrf/4.2

------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/gcc/9.2.0 -------------------------------------------------
   hwloc/2.2.0      libiconv/1.16          libpng/1.6.37     nasm/2.15.05            openmpi/4.0.5 (L,D)    time/1.9              zlib/1.2.11
   jasper/2.0.16    libjpeg-turbo/2.0.4    libtirpc/1.2.6    ncurses/5.9.20130511    perl/5.16.3            util-macros/1.19.1
   krb5/1.15.1      libpciaccess/0.16      libxml2/2.9.10    numactl/2.0.14          tcsh/6.22.02           xz/5.2.2

--------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/Core ----------------------------------------------------
   gcc/9.2.0 (L)

---------------------------------------------------------------------- /apps/modulefiles ----------------------------------------------------------------------
   openmpi/v4.1.x
  1. צריך לוודא שהתוכן שמפורט למטה ב-/apps/share/conus-2.5km.
$ ls -1 /apps/share/conus-2.5km
FILE:2018-06-17_00
FILE:2018-06-17_03
FILE:2018-06-17_06
FILE:2018-06-17_09
FILE:2018-06-17_12
geo_em.d01.nc
geogrid.log
gfs.0p25.2018061700.f000.grib2
gfs.0p25.2018061700.f003.grib2
gfs.0p25.2018061700.f006.grib2
gfs.0p25.2018061700.f009.grib2
gfs.0p25.2018061700.f012.grib2
met_em.d01.2018-06-17_00:00:00.nc
met_em.d01.2018-06-17_03:00:00.nc
met_em.d01.2018-06-17_06:00:00.nc
met_em.d01.2018-06-17_09:00:00.nc
met_em.d01.2018-06-17_12:00:00.nc
metgrid.log
namelist.input
namelist.wps
ungrib.log
wrfbdy_d01
wrfinput_d01

6. להריץ את נקודת ההשוואה CONUS של 2.5 ק"מ

כדי להריץ את נקודת ההשוואה CONUS של 2.5 ק"מ, צריך לשלוח משימת אצווה של סלור. מצגות הקלט של נקודת ההשוואה הזו כלולות בתמונת ה-VM מסוג wrf-gcp בקטע /apps/share/benchmarks/conus-2.5km.

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

  1. מעתיקים את קובץ האצווה לדוגמה wrf-conus.sh מהכתובת /apps/share
cp /apps/share/wrf-conus2p5.sh ~/
  1. פותחים את wrf-conus.sh בכלי לעריכת טקסט כדי לוודא שהשדות --partition ו---ntasks מוגדרים כראוי. צריך להגדיר את המחיצה ל-c2-60. צריך להגדיר את מספר המשימות כמספר רמות ה-MPI שבהן רוצים להשתמש כדי לבצע את המשימה. בהדגמה הזו, מספר המשימות שווה למספר ה-vCPU שנעשה בו שימוש למשימה, והוא לא יכול לחרוג מהמכסה הזמינה שלכם.
#!/bin/bash
#SBATCH --partition=c2-60
#SBATCH --ntasks=480
#SBATCH --ntasks-per-node=60
#SBATCH --mem-per-cpu=2g
#SBATCH --cpus-per-task=1
#SBATCH --account=default
#
# /////////////////////////////////////////////// #

WORK_PATH=${HOME}/wrf-benchmark/
SRUN_FLAGS="-n $SLURM_NTASKS --cpu-bind=threads"

. /apps/share/spack.sh
module load gcc/9.2.0
module load openmpi
module load hdf5 netcdf-c netcdf-fortran wrf

mkdir -p ${WORK_PATH}
cd ${WORK_PATH}
ln -s ${INSTALL_ROOT}/share/conus-2.5km/* .
ln -s $(spack location -i wrf)/run/* .

srun $MPI_FLAGS ./wrf.exe
  1. שליחת המשימה באצווה באמצעות sbatch.
sbatch wrf-conus2p5.sh
  1. מחכים שהמשימה תסתיים. נקודת ההשוואה הזו מוגדרת להפעלת תחזית ל-6 שעות. התחזית תסתיים תוך כשעה ויש לה 480 דירוגים. יש לך אפשרות לעקוב אחר סטטוס העבודה באמצעות squeue.
  2. כשהמשימה תסתיים, עליכם לבדוק את התוכן של rsl.out.0000 כדי לוודא שאתם רואים את ההצהרה (wrf: Success COMPLETE WRF). הסיומת המספרית תהיה שונה אם הרצתם את המשימה יותר מפעם אחת, למשל, טעיתם בהגדרת תצורה ונאלצתם להפעיל אותה מחדש.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

7. מזל טוב

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

מנקה

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

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

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

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

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

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

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

מחיקת משאבים ספציפיים

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