Ejecuta el modelo de previsión del clima de la WRF con datos numéricos fluidos' Slurm-GCP

1. Introducción

Territorio continental de EE.UU.

Última actualización: 05/05/2021

Qué compilarás

En este codelab, implementarás un clúster de computación de alto rendimiento (HPC) con ajuste de escala automático en Google Cloud con el programador de trabajos de Slurm. Usarás un ejemplo de implementación de Terraform que implementa este clúster con WRF® instalado a través de Spack. Luego, usarás esta infraestructura para ejecutar la comparativa de CONUS de 2.5 km o la comparativa de CONUS de 12 km.

Qué aprenderás

  • Cómo configurar políticas de Identity and Access Management (IAM) para operar un clúster de HPC en Google Cloud
  • Cómo implementar un clúster de HPC nativo de la nube con el programador de trabajos de Slurm
  • Cómo ejecutar WRF® en paralelo en Google Cloud con un trabajo por lotes de Slurm

Lo que necesitarás

2. Configuración

Habilita las APIs de Google Cloud

Para crear y usar recursos de Google Cloud, se deben habilitar las APIs.

gcloud services enable compute.googleapis.com 

Configura políticas de IAM

En HPC, existen distinciones claras entre los administradores y los usuarios del sistema. Por lo general, los administradores del sistema tienen "acceso raíz", lo que les permite administrar y operar recursos de procesamiento. Por lo general, los usuarios del sistema son investigadores, científicos e ingenieros de aplicaciones que solo necesitan usar los recursos para ejecutar trabajos.

En Google Cloud, la API de Acceso al SO aprovisiona información del usuario de POSIX desde cuentas de Google Workspace, Cloud Identity y Gmail. Además, el inicio de sesión en SO se integra con el sistema de administración de identidades y accesos (IAM) de GCP para determinar si se debe permitir que los usuarios aumenten sus privilegios en los sistemas Linux.

En este instructivo, suponemos que desempeñas los roles de administrador del sistema y administrador de Compute Engine. Configuraremos las políticas de IAM para otorgarte los permisos suficientes para realizar las siguientes tareas:

  • Crear o borrar instancias de VM de Google Compute Engine (GCE)
  • Establece una conexión SSH a instancias de VM de GCE

57883cb8acc09653.png

Para otorgarte los roles de IAM necesarios para completar este instructivo, en la consola de Google Cloud, haz lo siguiente:

  1. En el menú Productos y servicios, navega a IAM y administración > IAM.
  2. Haz clic en “+ Agregar” cerca de la parte superior de la página.
  3. En "Nuevos miembros", escribe tu cuenta de Google Workspace, tu cuenta de Cloud Identity o tu cuenta de Gmail.
  4. Agrega los siguientes roles : Administrador de Compute, Acceso al SO de Compute y Usuario de cuenta de servicio.
  5. Haz clic en Guardar.

Ahora tu acceso tiene los permisos necesarios para iniciar la creación del clúster de HPC.

Para verificar que asignaste los roles correctos, abre Cloud Shell y ejecuta el siguiente comando, reemplazando YOUR_PROJECT y EMAIL_ADDRESS por tu proyecto y dirección de correo electrónico.

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

Este comando generará el siguiente resultado:

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

3. Cuota baja: Implementa un clúster de HPC con ajuste de escala automático con Terraform

En esta sección, implementarás un clúster de HPC con ajuste de escala automático que incluye el programador de trabajos de Slurm. Esta opción es idéntica a la de cuota alta, excepto que el tipo de máquina y la cantidad de CPU virtuales que se usan son menores.

  1. Abre Cloud Shell en GCP.
  2. Clona el repositorio FluidNumerics/slurm-gcp
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. Cambia al directorio WRF:
cd  ~/slurm-gcp/tf/examples/wrf
  1. Crea y revisa un plan de Terraform. Establece las variables de entorno WRF_NAME, WRF_PROJECT y WRF_ZONE para especificar el nombre de tu clúster, tu proyecto de GCP y la zona en la que deseas realizar la implementación.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME="wrf-small"
  1. La primera vez que ejecutes Terraform, debes ejecutar el comando init:
terraform init
  1. Crea el plan con el comando make, que ejecutará terraform.
make plan
  1. Implemente el clúster: El proceso de instalación y configuración puede tardar hasta 2 horas. Durante la implementación, se instalarán WRF y todas sus dependencias.
make apply
  1. Establece una conexión SSH al nodo de acceso que creaste en el paso anterior. Puedes ver este nodo en el paso anterior (probablemente se llame wrf-small-login0). Para ello, haz clic en el botón SSH que se encuentra junto a la lista de instancias de VM en el elemento de menú de la consola Compute Engine -> Instancia de VM.

Opción: Este par de comandos de gcloud determinará el nombre del nodo de acceso y establecerá una conexión SSH con él:

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 vez que te conectes al nodo de acceso, para verificar la configuración del clúster, comprueba que el módulo wrf esté disponible.
$ 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 que /apps/share/conus-12km tenga el contenido que se indica a continuación.
$  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. Ejecuta la comparativa de CONUS de 12 km

Para ejecutar la comparativa de CONUS de 12 km, enviarás un trabajo por lotes de Slurm. Los mazos de entrada para esta comparativa se incluyen en la imagen de VM de wrf-gcp en /apps/share/benchmarks/conus-12km.

Para esta sección, debes conectarte por SSH al nodo de acceso del clúster.

  1. Copia el archivo por lotes de ejemplo wrf-conus.sh de /apps/share
cp /apps/share/wrf-conus12.sh ~/
  1. Abre wrf-conus.sh en un editor de texto para verificar que --partition y --ntasks estén configurados correctamente. La cantidad de tareas debe establecerse en la cantidad de rangos de MPI que deseas usar para iniciar el trabajo. Para esta demostración, la cantidad de tareas equivale a la cantidad de CPU virtuales que se usan para el trabajo y no debe exceder la cuota disponible.
#!/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. Envía el trabajo por lotes con sbatch.
sbatch wrf-conus12.sh
  1. Espera a que se complete el trabajo. Este comparativo se configura para ejecutar una previsión de 6 horas, que tarda aproximadamente 3 horas en completarse con 24 rangos. Puedes supervisar el estado de tu trabajo con squeue.
  2. Cuando se complete el trabajo, verifica el contenido de rsl.out.0000 para comprobar que veas la instrucción "wrf: SUCCESS COMPLETE WRF". El sufijo numérico será diferente si ejecutaste el trabajo más de una vez, p.ej., si te equivocaste en un parámetro de configuración y tuviste que volver a ejecutarlo.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

5. Cuota alta: Implementa un clúster de HPC con ajuste de escala automático con Terraform

En esta sección, implementarás un clúster de HPC con ajuste de escala automático que incluye el programador de trabajos de Slurm en GCP.

  1. Abre Cloud Shell en GCP.
  2. Clona el repositorio FluidNumerics/slurm-gcp
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. Cambia al directorio WRF:
cd  ~/slurm-gcp/tf/examples/wrf
  1. Crea y revisa un plan de Terraform. Establece las variables de entorno WRF_NAME, WRF_PROJECT, WRF_ZONE, WRF_MAX_NODE y WRF_MACHINE_TYPE para especificar el nombre de tu clúster, tu proyecto de GCP, la zona en la que deseas realizar la implementación, la cantidad máxima de nodos y el tipo de máquina. Para la comparativa de 2.5 km de CONUS, recomendamos usar instancias c2-standard-60 con al menos 8 nodos disponibles para ejecutar trabajos con 480 rangos de 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. Si no lo hiciste antes, debes ejecutar terraform init para iniciar Terraform:
terraform init
  1. Crea el plan con el comando make.
make plan
  1. Implemente el clúster: El proceso de instalación y configuración puede tardar hasta 2 horas. Durante la implementación, se instalarán WRF y todas sus dependencias.
make apply
  1. Establece una conexión SSH al nodo de acceso que creaste en el paso anterior. Puedes ver este nodo en el paso anterior (probablemente se llame wrf-large-login0). Para ello, haz clic en el botón SSH que se encuentra junto a la lista de instancias de VM en el elemento de menú de la consola Compute Engine -> Instancia de VM.

Opción: Este par de comandos de gcloud determinará el nombre del nodo de acceso y establecerá una conexión SSH con él:

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}

El segundo comando debería conectarte al nodo de acceso de Slurm.

  1. Una vez que te conectes al nodo de acceso, para verificar la configuración del clúster, comprueba que el módulo wrf esté disponible.
$ 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 que /apps/share/conus-2.5km tenga el contenido que se indica a continuación.
$ 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. Ejecuta la comparativa de CONUS de 2.5 km

Para ejecutar la comparativa de CONUS de 2.5 km, enviarás un trabajo por lotes de Slurm. Los mazos de entrada para esta comparativa se incluyen en la imagen de VM de wrf-gcp en /apps/share/benchmarks/conus-2.5km.

Para esta sección, debes conectarte por SSH al nodo de acceso del clúster.

  1. Copia el archivo por lotes de ejemplo wrf-conus.sh de /apps/share
cp /apps/share/wrf-conus2p5.sh ~/
  1. Abre wrf-conus.sh en un editor de texto para verificar que --partition y --ntasks estén configurados correctamente. La partición debe establecerse en c2-60. La cantidad de tareas debe establecerse en la cantidad de rangos de MPI que deseas usar para iniciar el trabajo. Para esta demostración, la cantidad de tareas equivale a la cantidad de CPU virtuales que se usan para el trabajo y no debe exceder la cuota disponible.
#!/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. Envía el trabajo por lotes con sbatch.
sbatch wrf-conus2p5.sh
  1. Espera a que se complete el trabajo. Esta comparativa está configurada para ejecutar un pronóstico de 6 horas, que tarda aproximadamente 1 hora en completarse con 480 rangos. Puedes supervisar el estado de tu trabajo con squeue.
  2. Cuando se complete el trabajo, verifica el contenido de rsl.out.0000 para comprobar que veas la instrucción "wrf: SUCCESS COMPLETE WRF". El sufijo numérico será diferente si ejecutaste el trabajo más de una vez, p.ej., si te equivocaste en un parámetro de configuración y tuviste que volver a ejecutarlo.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

7. Felicitaciones

En este codelab, creaste un clúster de HPC nativo de la nube con ajuste de escala automático y ejecutaste una simulación paralela de WRF® en Google Cloud.

Realiza una limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este codelab:

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el codelab.

Precaución: Borrar un proyecto tiene las siguientes consecuencias:

  • Se borra todo en el proyecto. Si usaste un proyecto existente para este codelab, cuando lo borres, también borrarás cualquier otro trabajo que hayas realizado en el proyecto.
  • Se pierden los ID personalizados de proyectos. Cuando creaste este proyecto, es posible que hayas creado un ID del proyecto personalizado que desees utilizar en el futuro. Para conservar las URLs que usan el ID del proyecto, como una URL de appspot.com, borra los recursos seleccionados dentro del proyecto en lugar de borrar todo el proyecto.

Si planeas explorar varios codelabs y guías de inicio rápido, la reutilización de proyectos puede ayudarte a evitar exceder los límites de las cuotas del proyecto.

  1. En la consola de Cloud, ve a la página Administrar recursos. Ir a la página Administrar recursos
  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar dc096e8341a05fec.png.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.

Borra los recursos individuales

  1. Abre Cloud Shell y navega al directorio de ejemplo de WRF.
cd  ~/slurm-gcp/tf/examples/wrf
  1. Ejecuta make destroy para borrar todos los recursos.
make destroy