Esegui il modello di previsione meteorologica WRF con Fluid Numerics' Slurm-GCP

1. Introduzione

Stati Uniti continentali

Ultimo aggiornamento: 05/05/2021

Cosa creerai

In questo codelab, eseguirai il deployment di un cluster di computing ad alte prestazioni (HPC) con scalabilità automatica su Google Cloud con lo scheduler di job Slurm. Utilizzerai un deployment Terraform di esempio che esegue il deployment di questo cluster con WRF® installato tramite Spack. Poi, utilizzerai questa infrastruttura per eseguire il benchmark CONUS 2,5 km o il benchmark CONUS 12 km.

Cosa imparerai

  • Come configurare i criteri Identity and Access Management (IAM) per il funzionamento di un cluster HPC su Google Cloud
  • Come eseguire il deployment di un cluster HPC nativo per il cloud con lo scheduler di job Slurm
  • Come eseguire WRF® in parallelo su Google Cloud utilizzando un job batch Slurm

Cosa ti serve

2. Configurazione

Abilita API Google Cloud

Per creare e utilizzare le API delle risorse Google Cloud, queste devono essere abilitate.

gcloud services enable compute.googleapis.com 

Imposta criteri IAM

Nel calcolo ad alte prestazioni, esistono distinzioni chiare tra amministratori di sistema e utenti di sistema. Gli amministratori di sistema in genere dispongono dell'"accesso root", che consente loro di gestire e utilizzare le risorse di calcolo. Gli utenti di sistema sono in genere ricercatori, scienziati e ingegneri delle applicazioni che devono utilizzare le risorse solo per eseguire i job.

Su Google Cloud, l'API OS Login esegue il provisioning dei dati utente POSIX dagli account Google Workspace, Cloud Identity e Gmail. Inoltre, OS Login si integra con il sistema Identity and Access Management (IAM) di GCP per determinare se agli utenti deve essere consentito di aumentare i privilegi sui sistemi Linux.

In questo tutorial, presupponiamo che tu ricopra i ruoli di amministratore di sistema e amministratore di Compute Engine. Configureremo i criteri IAM per concederti autorizzazioni sufficienti per svolgere le seguenti attività

  • Creare/eliminare istanze VM di Google Compute Engine (GCE)
  • Accedere tramite SSH alle istanze VM GCE

57883cb8acc09653.png

Per concederti i ruoli IAM necessari per completare questo tutorial, nella console Google Cloud:

  1. Vai a IAM e amministrazione > IAM nel menu Prodotti e servizi.
  2. Fai clic su "+ Aggiungi" nella parte superiore della pagina.
  3. Digita il tuo account Google Workspace, Cloud Identity o Gmail in "Nuovi membri".
  4. Aggiungi i seguenti ruoli : Compute Admin, Compute OS Login e Service Account User.
  5. Fai clic su Salva

Ora il tuo accesso dispone delle autorizzazioni necessarie per avviare la creazione del cluster HPC.

Per verificare di aver assegnato i ruoli corretti, apri Cloud Shell ed esegui il comando seguente, sostituendo YOUR_PROJECT e EMAIL_ADDRESS con il tuo progetto e il tuo indirizzo email.

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

Questo comando produrrà l'output:

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

3. Quota bassa: esegui il deployment di un cluster HPC a scalabilità automatica con Terraform

In questa sezione, eseguirai il deployment di un cluster HPC a scalabilità automatica, incluso lo scheduler dei job Slurm. Questa opzione è identica a Quota elevata, tranne per il fatto che il tipo di macchina utilizzato è più piccolo e il numero di vCPU utilizzate è inferiore.

  1. Apri Cloud Shell su GCP.
  2. Clona il repository FluidNumerics/slurm-gcp
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. Passa alla directory WRF:
cd  ~/slurm-gcp/tf/examples/wrf
  1. Crea e rivedi un piano Terraform. Imposta le variabili di ambiente WRF_NAME, WRF_PROJECT e WRF_ZONE per specificare il nome del cluster, il progetto GCP e la zona in cui vuoi eseguire il deployment.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME="wrf-small"
  1. La prima volta che esegui Terraform, devi eseguire il comando init:
terraform init
  1. Crea il piano con il comando make, che eseguirà terraform
make plan
  1. Esegui il deployment del cluster. La procedura di installazione e configurazione può richiedere fino a 2 ore. Durante il deployment, verranno installati WRF e tutte le relative dipendenze.
make apply
  1. Connettiti tramite SSH al nodo login creato nel passaggio precedente. Puoi vedere questo nodo nel passaggio precedente (probabilmente chiamato wrf-small-login0). Puoi farlo facendo clic sul pulsante SSH accanto all'elenco delle istanze VM nella voce di menu della console Compute Engine -> Istanza VM.

Opzione:questa coppia di comandi gcloud determina il nome del nodo di accesso e vi accede tramite 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. Una volta connesso al nodo di accesso, per verificare la configurazione del cluster, controlla che il modulo wrf sia disponibile.
$ 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. Verifica che /apps/share/conus-12km contenga i contenuti elencati di seguito.
$  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. Esegui il benchmark CONUS 12 km

Per eseguire il benchmark CONUS 12 km, invierai un job batch Slurm. I file di input per questo benchmark sono inclusi nell'immagine VM wrf-gcp in /apps/share/benchmarks/conus-12km.

Per questa sezione, devi connetterti tramite SSH al nodo login del cluster

  1. Copia il file batch di esempio wrf-conus.sh da /apps/share
cp /apps/share/wrf-conus12.sh ~/
  1. Apri wrf-conus.sh in un editor di testo per verificare che --partition e --ntasks siano impostati correttamente. Il numero di attività deve essere impostato sul numero di ranghi MPI che vuoi utilizzare per avviare il job. Per questa dimostrazione, il numero di attività è equivalente al numero di vCPU utilizzate per il job e non deve superare la quota disponibile.
#!/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. Invia il job batch utilizzando sbatch.
sbatch wrf-conus12.sh
  1. Attendi il completamento del job. Questo benchmark è configurato per eseguire una previsione di 6 ore, che richiede circa 3 ore per essere completata con 24 classifiche. Puoi monitorare lo stato del tuo job con squeue.
  2. Al termine del job, controlla i contenuti di rsl.out.0000 per verificare che venga visualizzata l'istruzione "wrf: SUCCESS COMPLETE WRF". Il suffisso numerico sarà diverso se hai eseguito il job più di una volta, ad esempio se hai impostato in modo errato una configurazione e hai dovuto eseguirla di nuovo.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

5. Quota elevata: esegui il deployment di un cluster HPC a scalabilità automatica con Terraform

In questa sezione, eseguirai il deployment di un cluster HPC a scalabilità automatica, incluso lo scheduler di job Slurm in GCP.

  1. Apri Cloud Shell su GCP.
  2. Clona il repository FluidNumerics/slurm-gcp
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. Passa alla directory WRF:
cd  ~/slurm-gcp/tf/examples/wrf
  1. Crea e rivedi un piano Terraform. Imposta le variabili di ambiente WRF_NAME, WRF_PROJECT, WRF_ZONE, WRF_MAX_NODE e WRF_MACHINE_TYPE per specificare il nome del cluster, il progetto Google Cloud, la zona in cui vuoi eseguire il deployment, il numero massimo di nodi e il tipo di macchina. Per il benchmark CONUS 2,5 km, ti consigliamo di utilizzare istanze c2-standard-60 con almeno 8 nodi disponibili per eseguire job con 480 ranghi 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. Se non l'hai fatto in precedenza, devi eseguire terraform init per avviare Terraform:
terraform init
  1. Crea il piano con il comando make.
make plan
  1. Esegui il deployment del cluster. La procedura di installazione e configurazione può richiedere fino a 2 ore. Durante il deployment, verranno installati WRF e tutte le relative dipendenze.
make apply
  1. Connettiti tramite SSH al nodo login creato nel passaggio precedente. Puoi vedere questo nodo nel passaggio precedente (probabilmente chiamato wrf-large-login0). Puoi farlo facendo clic sul pulsante SSH accanto all'elenco delle istanze VM nella voce di menu della console Compute Engine -> Istanza VM.

Opzione:questa coppia di comandi gcloud determina il nome del nodo di accesso e vi accede tramite 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}

Il secondo comando dovrebbe connetterti al nodo di accesso Slurm.

  1. Una volta connesso al nodo di accesso, per verificare la configurazione del cluster, controlla che il modulo wrf sia disponibile.
$ 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. Verifica che /apps/share/conus-2.5km contenga i contenuti elencati di seguito.
$ 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. Esegui il benchmark CONUS 2,5 km

Per eseguire il benchmark CONUS 2,5 km, invierai un job batch Slurm. I mazzi di input per questo benchmark sono inclusi nell'immagine VM wrf-gcp in /apps/share/benchmarks/conus-2.5km.

Per questa sezione, devi connetterti tramite SSH al nodo login del cluster

  1. Copia il file batch di esempio wrf-conus.sh da /apps/share
cp /apps/share/wrf-conus2p5.sh ~/
  1. Apri wrf-conus.sh in un editor di testo per verificare che --partition e --ntasks siano impostati correttamente. La partizione deve essere impostata su c2-60. Il numero di attività deve essere impostato sul numero di ranghi MPI che vuoi utilizzare per avviare il job. Per questa dimostrazione, il numero di attività è equivalente al numero di vCPU utilizzate per il job e non deve superare la quota disponibile.
#!/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. Invia il job batch utilizzando sbatch.
sbatch wrf-conus2p5.sh
  1. Attendi il completamento del job. Questo benchmark è configurato per eseguire una previsione di 6 ore, che richiede circa 1 ora per essere completata con 480 classifiche. Puoi monitorare lo stato del tuo job con squeue.
  2. Al termine del job, controlla i contenuti di rsl.out.0000 per verificare che venga visualizzata l'istruzione "wrf: SUCCESS COMPLETE WRF". Il suffisso numerico sarà diverso se hai eseguito il job più di una volta, ad esempio se hai impostato in modo errato una configurazione e hai dovuto eseguirla di nuovo.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

7. Complimenti

In questo codelab hai creato un cluster HPC cloud-native con scalabilità automatica ed eseguito una simulazione WRF® parallela su Google Cloud.

Pulizia

Per evitare che al tuo account Google Cloud Platform vengano addebitati costi relativi alle risorse utilizzate in questo codelab:

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto creato per il codelab.

Attenzione: l'eliminazione di un progetto ha i seguenti effetti:

  • L'intero contenuto del progetto viene eliminato. Se hai utilizzato un progetto esistente per questo codelab, quando lo eliminerai, eliminerai anche tutto il lavoro che hai svolto nel progetto.
  • Gli ID progetto personalizzati non sono più disponibili. Quando hai creato questo progetto, potresti aver creato un ID progetto personalizzato che vuoi utilizzare in futuro. Per conservare gli URL che utilizzano l'ID progetto, ad esempio un URL appspot.com, elimina le risorse selezionate all'interno del progetto anziché eliminare l'intero progetto.

Se intendi esplorare più codelab e guide rapide, puoi riutilizzare i progetti ed evitare così di superare i limiti di quota.

  1. In Cloud Console, vai alla pagina Gestisci risorse. Vai alla pagina Gestisci risorse
  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina dc096e8341a05fec.png.
  3. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.

Elimina le singole risorse

  1. Apri Cloud Shell e vai alla directory di esempio wrf
cd  ~/slurm-gcp/tf/examples/wrf
  1. Esegui make destroy per eliminare tutte le risorse.
make destroy