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 באצווה
מה צריך להכין
- חשבון Gmail עם מפתח SSH מצורף, או Google Workspace, Cloud Identity
- פרויקט ב-Google Cloud Platform שהחיוב מופעל בו
- תפקיד 'בעלי הפרויקט' בפרויקט GCP
- מכסה מספקת של Compute Engine (480 מעבדים c2 של vCPU ו-PD 500GB – דיסק סטנדרטי)
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
כדי להקצות לעצמכם את תפקידי ה-IAM הנדרשים להשלמת המדריך הזה, במסוף Google Cloud:
- מעבר לדף IAM & אדמין > 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 עם התאמה אוטומטית לעומס (auto-scaling) באמצעות Terraform
בקטע הזה, תפרסו אשכול HPC עם התאמה אוטומטית לעומס (auto-scaling), כולל מתזמן המשימות של 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
- תיצרו ותבדקו תוכנית שטח. מגדירים את משתני הסביבה
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 לצומת 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}
- לאחר ההתחברות לצומת ההתחברות, כדי לאמת את הגדרת האשכול, בודקים שמודול ה-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. להריץ את נקודת ההשוואה CONUS של 12 ק"מ
כדי להריץ את נקודת ההשוואה CONUS של 12 ק"מ, צריך לשלוח משימת אצווה של Slurm. מצגות הקלט של נקודת ההשוואה הזו כלולות בתמונת ה-VM מסוג wrf-gcp בקטע /apps/share/benchmarks/conus-12km.
בקטע הזה צריך להיות SSH מחובר לצומת login של האשכול
- מעתיקים את קובץ האצווה לדוגמה wrf-conus.sh מהכתובת /apps/share
cp /apps/share/wrf-conus12.sh ~/
- פותחים את 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
- שליחת המשימה באצווה באמצעות 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 עם התאמה אוטומטית לעומס (auto-scaling) באמצעות Terraform
בקטע הזה, תפרסו אשכול HPC עם התאמה אוטומטית לעומס (auto-scaling), כולל מתזמן המשימות של 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
- תיצרו ותבדקו תוכנית שטח. מגדירים את משתני הסביבה
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"
- אם לא ביצעת את הפעולה הזו למעלה, צריך להריץ את הפקודה
terraform init
כדי להפעיל terraform:
terraform init
- יוצרים את התוכנית באמצעות פקודת make.
make plan
- פורסים את האשכול. תהליך ההתקנה וההגדרה עשוי להימשך עד שעתיים. במהלך הפריסה יותקנו ה-WRF וכל יחסי התלות שלו.
make apply
- 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.
- לאחר ההתחברות לצומת ההתחברות, כדי לאמת את הגדרת האשכול, בודקים שמודול ה-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. להריץ את נקודת ההשוואה CONUS של 2.5 ק"מ
כדי להריץ את נקודת ההשוואה CONUS של 2.5 ק"מ, צריך לשלוח משימת אצווה של סלור. מצגות הקלט של נקודת ההשוואה הזו כלולות בתמונת ה-VM מסוג wrf-gcp בקטע /apps/share/benchmarks/conus-2.5km.
בקטע הזה צריך להיות SSH מחובר לצומת login של האשכול
- מעתיקים את קובץ האצווה לדוגמה wrf-conus.sh מהכתובת /apps/share
cp /apps/share/wrf-conus2p5.sh ~/
- פותחים את 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
- שליחת המשימה באצווה באמצעות 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 מבוסס-ענן עם התאמה אוטומטית לעומס (auto-scaling), והרצתם סימולציית WRF® מקבילה ב-Google Cloud Platform!
מנקה
כדי להימנע מצבירת חיובים בחשבון Google Cloud Platform עבור המשאבים ששימשו ב-Codelab הזה:
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם עבור Codelab.
זהירות: למחיקת פרויקט יש את ההשפעות הבאות:
- התוכן של הפרויקט נמחק כולו. אם השתמשתם בפרויקט קיים ב-Codelab הזה, כשמוחקים אותו, נמחקות גם כל העבודה האחרות שביצעתם בפרויקט.
- מאבדים את מזהה הפרויקט בהתאמה אישית. כשיצרתם את הפרויקט, יכול להיות שיצרתם מזהה פרויקט מותאם אישית שבו תרצו להשתמש בעתיד. כדי לשמור על כתובות ה-URL שמשתמשות במזהה הפרויקט, כמו appspot.com, צריך למחוק את המשאבים שנבחרו בפרויקט אבל לא את הפרויקט כולו.
אם אתם מתכננים להיעזר בכמה מעבדי קוד ומדריכים למתחילים, שימוש חוזר בפרויקטים יכול לעזור לכם להימנע מחריגה ממכסות הפרויקטים.
- במסוף Cloud, עוברים לדף Manage resources. כניסה לדף Manage resources
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ואז לוחצים על מחיקה .
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת משאבים ספציפיים
- פותחים את Cloud Shell ועוברים לספריית הדוגמאות wrf.
cd ~/slurm-gcp/tf/examples/wrf
- מריצים את האפשרות 'השמדת' כדי למחוק את כל המשאבים.
make destroy