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

1. מבוא

משלוחים בתוך 48 המדינות של ארה"ב היב

עדכון אחרון: 2021-05-05

מה תפַתחו

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

מה תלמדו

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

מה צריך

2. הגדרות אישיות

הפעלת Cloud APIs

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

gcloud services enable compute.googleapis.com 

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

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

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

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

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

57883cb8acc09653.png

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

  1. בתפריט 'מוצרים ושירותים', עוברים אל IAM & Admin ‏> 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 עם התאמה אוטומטית לעומס באמצעות Terraform

בקטע הזה תפרסו אשכול HPC עם התאמה אוטומטית לעומס, כולל מתזמן המשימות 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. יוצרים תוכנית Terraform ובודקים אותה. מגדירים את משתני הסביבה 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 לצומת הכניסה שנוצר בשלב הקודם. אפשר לראות את הצומת הזה בשלב הקודם (כנראה ששמו wrf-small-login0). כדי לעשות זאת, לוחצים על הלחצן SSH שליד רשימת מכונות ה-VM בפריט התפריט Compute Engine -> VM instance במסוף.

אפשרות: צמד הפקודות הבא של 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. הרצת ההשוואה לשוק של ארה"ב היבשתית ברזולוציה של 12 ק"מ

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

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

  1. מעתיקים את קובץ האצווה לדוגמה wrf-conus.sh מ-‎ /apps/share
cp /apps/share/wrf-conus12.sh ~/
  1. פותחים את wrf-conus.sh בכלי לעריכת טקסט כדי לוודא שהערכים של --partition ו---ntasks מוגדרים בצורה נכונה. מספר המשימות צריך להיות שווה למספר דרגות ה-MPI שרוצים להשתמש בהן כדי להפעיל את העבודה. לצורך ההדגמה הזו, מספר המשימות שווה למספר המעבדים הווירטואליים שמשמשים לעבודה, והוא לא יכול להיות גבוה מהמכסה הזמינה.
#!/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 עם התאמה אוטומטית לעומס באמצעות Terraform

בקטע הזה נסביר איך לפרוס אשכול HPC עם התאמה אוטומטית לעומס, כולל מתזמן המשימות 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. יוצרים תוכנית Terraform ובודקים אותה. מגדירים את משתני הסביבה WRF_NAME,‏ WRF_PROJECT,‏ WRF_ZONE,‏ WRF_MAX_NODE ו-WRF_MACHINE_TYPE כדי לציין את שם האשכול, את פרויקט GCP, את האזור שבו רוצים לבצע פריסה, את המספר המקסימלי של הצמתים ואת סוג המכונה. לצורך בנצ'מרק של 2.5 ק"מ בארה"ב הרציפה, מומלץ להשתמש במכונות 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 לצומת הכניסה שנוצר בשלב הקודם. אפשר לראות את הצומת הזה בשלב הקודם (כנראה ששמו wrf-large-login0). כדי לעשות זאת, לוחצים על הלחצן SSH שליד רשימת מכונות ה-VM בפריט התפריט Compute Engine -> VM instance במסוף.

אפשרות: צמד הפקודות הבא של 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.

  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. הרצת ההשוואה לשוק של ארה"ב היבשתית ברזולוציה של 2.5 ק"מ

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

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

  1. מעתיקים את קובץ האצווה לדוגמה wrf-conus.sh מ-‎ /apps/share
cp /apps/share/wrf-conus2p5.sh ~/
  1. פותחים את wrf-conus.sh בכלי לעריכת טקסט כדי לוודא שהערכים של --partition ו---ntasks מוגדרים בצורה נכונה. המחיצה צריכה להיות c2-60. מספר המשימות צריך להיות שווה למספר דרגות ה-MPI שרוצים להשתמש בהן כדי להפעיל את העבודה. לצורך ההדגמה הזו, מספר המשימות שווה למספר המעבדים הווירטואליים שמשמשים לעבודה, והוא לא יכול להיות גבוה מהמכסה הזמינה.
#!/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 מבוסס-ענן עם התאמה אוטומטית לעומס, והרצתם סימולציה מקבילית של WRF®‎ ב-Google Cloud Platform.

סידור וארגון

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

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

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

זהירות: כשמוחקים פרויקט:

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

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

  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 כדי למחוק את כל המשאבים.
make destroy