Execute o modelo de previsão do tempo do WRF com o Fluid Numerics' Slurm-GCP

1. Introdução

Continental dos EUA

Última atualização:05/05/2021

O que você criará

Neste codelab, você vai implantar um cluster de computação de alto desempenho (HPC) com escalonamento automático no Google Cloud usando o programador de jobs do Slurm. Você vai usar um exemplo de implantação do Terraform que implanta esse cluster com o WRF® instalado pelo Spack. Depois, você vai usar essa infraestrutura para executar o comparativo de mercado de 2,5 km do CONUS ou o comparativo de mercado de 12 km do CONUS.

O que você aprenderá

  • Como configurar políticas de gerenciamento de identidade e acesso (IAM) para operar um cluster de HPC no Google Cloud Platform
  • Como implantar um cluster de HPC nativo da nuvem com o programador de jobs do Slurm
  • Como executar o WRF® em paralelo no Google Cloud usando um job em lote do Slurm

O que é necessário

2. Configuração

Ativar APIs do Google Cloud

Para criar e usar recursos do Google Cloud, as APIs precisam estar ativadas.

gcloud services enable compute.googleapis.com 

Definir políticas de IAM

Na HPC, há distinções claras entre administradores de sistemas e usuários de sistemas. Os administradores de sistema geralmente têm "acesso raiz" permitindo que elas gerenciem e operem recursos de computação. Os usuários de sistema geralmente são pesquisadores, cientistas e engenheiros de aplicativos que só precisam usar os recursos para executar jobs.

No Google Cloud, a API OS Login provisiona informações de usuários no formato POSIX das contas do Google Workspace, do Cloud Identity e do Gmail. Além disso, o Login do SO se integra ao sistema de Identity and Access Management (IAM) do GCP para determinar se os usuários devem ter permissão para escalonar privilégios nos sistemas Linux.

Neste tutorial, presumimos que você esteja preenchendo os papéis de administrador do sistema e do Compute Engine. Vamos configurar políticas do IAM para que você tenha permissões suficientes para realizar as seguintes tarefas

  • Criar/excluir instâncias de VM do Google Compute Engine (GCE)
  • SSH nas instâncias de VM do GCE

57883cb8acc09653.png

Para conceder a si mesmo os papéis do IAM necessários para concluir este tutorial, acesse o Console do Google Cloud:

  1. Acesse "IAM e Administrador > IAM no menu "Produtos e serviços".
  2. Clique em "+Adicionar" próximo ao topo da página.
  3. Digite sua conta do Google Workspace, do Cloud Identity ou do Gmail em "Novos membros".
  4. Adicione os seguintes papéis : Administrador do Compute, Login do SO do Compute e Usuário da conta de serviço.
  5. Clique em "Salvar".

Seu login agora tem as permissões necessárias para iniciar a criação do cluster de HPC.

Para verificar se você atribuiu os papéis corretos, abra o Cloud Shell e execute o comando a seguir, substituindo YOUR_PROJECT e EMAIL_ADDRESS pelo projeto e endereço de e-mail.

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

Este comando vai gerar a saída:

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

3. Cota baixa: implante um cluster de HPC de escalonamento automático com o Terraform

Nesta seção, você vai implantar um cluster de HPC com escalonamento automático, incluindo o programador de jobs do Slurm. Isso é idêntico à opção de cota alta, exceto pelo fato de que o tipo de máquina usado é menor e o número de vCPUs usados.

  1. Abra o Cloud Shell no GCP.
  2. Clonar o repositório FluidNumerics/slurm-gcp
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. Altere para o diretório WRF:
cd  ~/slurm-gcp/tf/examples/wrf
  1. Criar e revisar um terraform plan. Defina as variáveis de ambiente WRF_NAME, WRF_PROJECT e WRF_ZONE para especificar o nome do cluster, o projeto do GCP e a zona em que você quer implantar.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME="wrf-small"
  1. Na primeira vez que você executar o Terraform, será necessário executar o comando init:
terraform init
  1. Crie o plano com o comando make, que executará terraform.
make plan
  1. Implantar o cluster. O processo de instalação e configuração pode levar até duas horas. Durante a implantação, o WRF e todas as dependências dele serão instalados.
make apply
  1. Use SSH para se conectar ao nó login criado na etapa anterior. Você verá esse nó na etapa anterior (provavelmente chamada de wrf-small-login0). Para isso, clique no botão SSH ao lado da lista de instâncias de VM no item de menu do console Compute Engine -> instância de VM.

Opção: este par de comandos gcloud descobrirá o nome do nó de login e SSH nele:

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. Depois de se conectar ao nó de login, para verificar a configuração do cluster, confira se o módulo wrf está disponível.
$ 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. Verifique se /apps/share/conus-12km tem o conteúdo listado abaixo.
$  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. Corra o CONUS 12 km Benchmark

Para executar o comparativo de mercado do CONUS para 12 km, envie um job em lote do Slurm. Os conjuntos de entrada para esta comparação estão incluídos na imagem da VM wrf-gcp em /apps/share/benchmarks/conus-12km.

Nesta seção, você precisa ter uma conexão SSH com o nó de login do cluster.

  1. Copie o arquivo em lote wrf-conus.sh de exemplo de /apps/share
cp /apps/share/wrf-conus12.sh ~/
  1. Abra o wrf-conus.sh em um editor de texto para verificar se --partition e --ntasks estão definidos corretamente. O número de tarefas deve ser definido como o número de classificações de MPI que você quer usar para iniciar o job. Para esta demonstração, o número de tarefas é equivalente ao número de vCPUs usadas para o job e não deve exceder a cota disponível.
#!/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. Envie o job em lote usando o sbatch.
sbatch wrf-conus12.sh
  1. Aguarde a conclusão do job. O comparativo de mercado está configurado para gerar uma previsão de seis horas, o que leva cerca de 3 horas para ser concluído com 24 classificações. É possível monitorar o status do job com squeue.
  2. Quando o job for concluído, verifique o conteúdo de rsl.out.0000 para conferir se a declaração "wrf: SUCCESS COMPLETE WRF" é exibida. O sufixo numérico será diferente se você executar o job mais de uma vez, por exemplo, se uma configuração estiver errada e você tiver que executá-la novamente.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

5. Cota alta: implante um cluster de HPC de escalonamento automático com o Terraform

Nesta seção, você implantará um cluster de HPC de escalonamento automático, incluindo o programador de jobs Slurm no GCP.

  1. Abra o Cloud Shell no GCP.
  2. Clonar o repositório FluidNumerics/slurm-gcp
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. Altere para o diretório WRF:
cd  ~/slurm-gcp/tf/examples/wrf
  1. Criar e revisar um terraform plan. Defina as variáveis de ambiente WRF_NAME, WRF_PROJECT, WRF_ZONE, WRF_MAX_NODE e WRF_MACHINE_TYPE para especificar o nome do cluster, o projeto do GCP, a zona em que você quer implantar, o número máximo de nós e o tipo de máquina. Para o comparativo de mercado do CONUS de 2,5 km, recomendamos o uso de instâncias c2-standard-60 com pelo menos oito nós de execução disponíveis com classificações de MPI de 480.
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 você não fez isso acima, execute terraform init para iniciar o Terraform:
terraform init
  1. Crie o plano com o comando make.
make plan
  1. Implantar o cluster. O processo de instalação e configuração pode levar até duas horas. Durante a implantação, o WRF e todas as dependências dele serão instalados.
make apply
  1. Use SSH para se conectar ao nó login criado na etapa anterior. Você verá esse nó na etapa anterior (provavelmente chamada de wrf-large-login0). Para isso, clique no botão SSH ao lado da lista de instâncias de VM no item de menu do console Compute Engine -> instância de VM.

Opção: este par de comandos gcloud descobrirá o nome do nó de login e SSH nele:

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}

O segundo comando resultará na conexão com o nó de login do Slurm.

  1. Depois de se conectar ao nó de login, para verificar a configuração do cluster, confira se o módulo wrf está disponível.
$ 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. Verifique se /apps/share/conus-2.5km tem o conteúdo listado abaixo.
$ 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. Corra o CONUS 2,5 km Benchmark

Para executar o comparativo de mercado do CONUS 2,5 km, envie um job em lote do Slurm. Os conjuntos de entrada para esta comparação estão incluídos na imagem da VM wrf-gcp em /apps/share/benchmarks/conus-2.5km.

Nesta seção, você precisa ter uma conexão SSH com o nó de login do cluster.

  1. Copie o arquivo em lote wrf-conus.sh de exemplo de /apps/share
cp /apps/share/wrf-conus2p5.sh ~/
  1. Abra o wrf-conus.sh em um editor de texto para verificar se --partition e --ntasks estão definidos corretamente. A partição precisa ser definida como c2-60. O número de tarefas deve ser definido como o número de classificações de MPI que você quer usar para iniciar o job. Para esta demonstração, o número de tarefas é equivalente ao número de vCPUs usadas para o job e não deve exceder a cota disponível.
#!/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. Envie o job em lote usando o sbatch.
sbatch wrf-conus2p5.sh
  1. Aguarde a conclusão do job. O comparativo está configurado para gerar uma previsão de seis horas, o que leva cerca de 1 hora para ser concluído com 480 classificações. É possível monitorar o status do job com squeue.
  2. Quando o job for concluído, verifique o conteúdo de rsl.out.0000 para confirmar se a instrução "wrf: SUCCESS COMPLETE WRF" é exibida. O sufixo numérico será diferente se você executar o job mais de uma vez, por exemplo, se uma configuração estiver errada e você tiver que executá-la novamente.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

7. Parabéns

Neste codelab, você criou um cluster de HPC nativo da nuvem com escalonamento automático e executou uma simulação WRF® paralela no Google Cloud Platform.

Limpar

Para evitar cobranças dos recursos usados neste codelab na conta do Google Cloud Platform, siga estas etapas:

Excluir o projeto

A maneira mais fácil de eliminar o faturamento é excluir o projeto que você criou para o codelab.

Cuidado: excluir um projeto tem os seguintes efeitos:

  • Tudo no projeto é excluído. Se você usou um projeto atual neste codelab, a exclusão dele também afeta todos os outros trabalhos feitos no projeto.
  • Os IDs do projeto personalizados são perdidos. Ao criar o projeto, você pode ter criado um ID do projeto personalizado para ser usado no futuro. Para preservar os URLs que usam o ID do projeto, como um URL appspot.com, exclua os recursos selecionados do projeto em vez de excluir o projeto inteiro.

Se você planeja conhecer vários codelabs e guias de início rápido, a reutilização de projetos pode evitar que você exceda os limites de cota do projeto.

  1. No console do Cloud, acesse a página Gerenciar recursos: Acessar a página "Gerenciar recursos"
  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir dc096e8341a05fec.png.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir recursos individuais

  1. Abra o Cloud Shell e navegue até o diretório de exemplo wrf
cd  ~/slurm-gcp/tf/examples/wrf
  1. Execute "make destroy" para excluir todos os recursos.
make destroy