1. מבוא

עדכון אחרון: 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
מה צריך
- חשבון Gmail עם מפתח SSH מצורף, או Google Workspace, Cloud Identity
- פרויקט ב-Google Cloud Platform שבו מופעל חיוב
- תפקיד בעלי הפרויקט בפרויקט GCP
- מכסת Compute Engine מספקת (480 c2 vCPUs ו-500GB PD-Standard Disk)
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

כדי להקצות לעצמכם את תפקידי ה-IAM הדרושים להשלמת המדריך הזה, במסוף Google Cloud:
- בתפריט 'מוצרים ושירותים', עוברים אל IAM & Admin > IAM.
- לוחצים על '+הוספה' בחלק העליון של הדף.
- מזינים את החשבון ב-Google Workspace, את החשבון ב-Cloud Identity או את חשבון Gmail בקטע 'חברים חדשים'.
- מוסיפים את התפקידים הבאים : Compute Admin, Compute OS Login ו-Service Account User
- לוחצים על שמירה.
עכשיו יש להתחבר לחשבון עם ההרשאות שנדרשות כדי ליצור את אשכול ה-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 שבו נעשה שימוש קטן יותר.
- פותחים את Cloud Shell ב-GCP.
- משכפלים את המאגר FluidNumerics/slurm-gcp
cd ~ git clone https://github.com/FluidNumerics/slurm-gcp.git
- עוברים לספרייה WRF:
cd ~/slurm-gcp/tf/examples/wrf
- יוצרים תוכנית Terraform ובודקים אותה. מגדירים את משתני הסביבה
WRF_NAME,WRF_PROJECTו-WRF_ZONEכדי לציין את השם של האשכול, את פרויקט GCP ואת האזור שבו רוצים לבצע פריסה.
export WRF_PROJECT=<PROJECT ID> export WRF_ZONE=<ZONE> export WRF_NAME="wrf-small"
- בפעם הראשונה שמריצים את Terraform, צריך להריץ את הפקודה
init:
terraform init
- יוצרים את התוכנית באמצעות הפקודה make, שתריץ את
terraform
make plan
- פורסים את האשכול. תהליך ההתקנה וההגדרה יכול להימשך עד שעתיים. במהלך הפריסה, יותקנו WRF וכל יחסי התלות שלו.
make apply
- מתחברים באמצעות 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}
- אחרי שמתחברים לצומת הכניסה, כדי לאמת את הגדרת האשכול, בודקים אם מודול ה-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
- צריך לוודא שהתוכן של
/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 לצומת הכניסה של האשכול.
- מעתיקים את קובץ האצווה לדוגמה wrf-conus.sh מ- /apps/share
cp /apps/share/wrf-conus12.sh ~/
- פותחים את 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
- שולחים את משימת האצווה באמצעות sbatch.
sbatch wrf-conus12.sh
- ממתינים לסיום העבודה. ההשוואה לשוק מוגדרת להרצת תחזית ל-6 שעות, שנמשכת כ-3 שעות עם 24 דירוגים. אפשר לעקוב אחרי סטטוס העבודה באמצעות
squeue. - כשהעבודה מסתיימת, בודקים את התוכן של 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.
- פותחים את Cloud Shell ב-GCP.
- משכפלים את המאגר FluidNumerics/slurm-gcp
cd ~ git clone https://github.com/FluidNumerics/slurm-gcp.git
- עוברים לספרייה WRF:
cd ~/slurm-gcp/tf/examples/wrf
- יוצרים תוכנית 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"
- אם לא עשיתם את זה בשלב הקודם, אתם צריכים להריץ את הפקודה
terraform initכדי להפעיל את Terraform:
terraform init
- יוצרים את התוכנית באמצעות הפקודה make.
make plan
- פורסים את האשכול. תהליך ההתקנה וההגדרה יכול להימשך עד שעתיים. במהלך הפריסה, יותקנו WRF וכל יחסי התלות שלו.
make apply
- מתחברים באמצעות 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.
- אחרי שמתחברים לצומת הכניסה, כדי לאמת את הגדרת האשכול, בודקים אם מודול ה-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
- צריך לוודא שהתוכן של
/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 לצומת הכניסה של האשכול.
- מעתיקים את קובץ האצווה לדוגמה wrf-conus.sh מ- /apps/share
cp /apps/share/wrf-conus2p5.sh ~/
- פותחים את 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
- שולחים את משימת האצווה באמצעות sbatch.
sbatch wrf-conus2p5.sh
- ממתינים לסיום העבודה. ההשוואה לשוק מוגדרת להפעלת תחזית ל-6 שעות, שמשך ההשלמה שלה הוא כשעה עם 480 דירוגים. אפשר לעקוב אחרי סטטוס העבודה באמצעות
squeue. - כשהעבודה מסתיימת, בודקים את התוכן של 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 או מדריכים למתחילים, מומלץ להשתמש שוב באותו פרויקט כדי לא לחרוג ממכסות הפרויקטים.
- במסוף Cloud, נכנסים לדף Manage resources. כניסה לדף Manage resources
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על מחיקה
. - כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת המשאבים הבודדים
- פותחים את Cloud Shell ועוברים לספריית הדוגמה של WRF.
cd ~/slurm-gcp/tf/examples/wrf
- מריצים את הפקודה make destroy כדי למחוק את כל המשאבים.
make destroy