1. Introducción

Ú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
- Cuenta de Gmail con una clave SSH adjunta, o Google Workspace, Cloud Identity
- Proyecto de Google Cloud Platform con la facturación habilitada
- Rol de propietario del proyecto en tu proyecto de GCP
- Cuota suficiente de Compute Engine (480 CPU virtuales de c2 y 500 GB de disco PD estándar)
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

Para otorgarte los roles de IAM necesarios para completar este instructivo, en la consola de Google Cloud, haz lo siguiente:
- En el menú Productos y servicios, navega a IAM y administración > IAM.
- Haz clic en “+ Agregar” cerca de la parte superior de la página.
- En "Nuevos miembros", escribe tu cuenta de Google Workspace, tu cuenta de Cloud Identity o tu cuenta de Gmail.
- Agrega los siguientes roles : Administrador de Compute, Acceso al SO de Compute y Usuario de cuenta de servicio.
- 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.
- Abre Cloud Shell en GCP.
- Clona el repositorio FluidNumerics/slurm-gcp
cd ~ git clone https://github.com/FluidNumerics/slurm-gcp.git
- Cambia al directorio WRF:
cd ~/slurm-gcp/tf/examples/wrf
- Crea y revisa un plan de Terraform. Establece las variables de entorno
WRF_NAME,WRF_PROJECTyWRF_ZONEpara 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"
- La primera vez que ejecutes Terraform, debes ejecutar el comando
init:
terraform init
- Crea el plan con el comando make, que ejecutará
terraform.
make plan
- 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
- 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}
- 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
- Verifica que
/apps/share/conus-12kmtenga 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.
- Copia el archivo por lotes de ejemplo wrf-conus.sh de /apps/share
cp /apps/share/wrf-conus12.sh ~/
- Abre wrf-conus.sh en un editor de texto para verificar que
--partitiony--ntasksesté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
- Envía el trabajo por lotes con sbatch.
sbatch wrf-conus12.sh
- 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. - 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.
- Abre Cloud Shell en GCP.
- Clona el repositorio FluidNumerics/slurm-gcp
cd ~ git clone https://github.com/FluidNumerics/slurm-gcp.git
- Cambia al directorio WRF:
cd ~/slurm-gcp/tf/examples/wrf
- Crea y revisa un plan de Terraform. Establece las variables de entorno
WRF_NAME,WRF_PROJECT,WRF_ZONE,WRF_MAX_NODEyWRF_MACHINE_TYPEpara 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"
- Si no lo hiciste antes, debes ejecutar
terraform initpara iniciar Terraform:
terraform init
- Crea el plan con el comando make.
make plan
- 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
- 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.
- 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
- Verifica que
/apps/share/conus-2.5kmtenga 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.
- Copia el archivo por lotes de ejemplo wrf-conus.sh de /apps/share
cp /apps/share/wrf-conus2p5.sh ~/
- Abre wrf-conus.sh en un editor de texto para verificar que
--partitiony--ntasksesté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
- Envía el trabajo por lotes con sbatch.
sbatch wrf-conus2p5.sh
- 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. - 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.
- En la consola de Cloud, ve a la página Administrar recursos. Ir a la página Administrar recursos
- En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar
. - En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.
Borra los recursos individuales
- Abre Cloud Shell y navega al directorio de ejemplo de WRF.
cd ~/slurm-gcp/tf/examples/wrf
- Ejecuta make destroy para borrar todos los recursos.
make destroy