使用流体数值运行 WRF 天气预测模型Slurm-GCP

1. 简介

美国本土

上次更新日期:2021 年 5 月 5 日

构建内容

在此 Codelab 中,您将使用 Slurm 作业调度器在 Google Cloud 上部署一个可自动扩缩的高性能计算 (HPC) 集群。您将使用一个示例 Terraform 部署来部署此集群,该集群通过 Spack 安装了 WRF®。然后,您将使用此基础架构运行 CONUS 2.5 公里基准CONUS 12 公里基准

学习内容

  • 如何配置 Identity and Access Management (IAM) 政策以在 Google Cloud Platform 上运行 HPC 集群
  • 如何使用 Slurm 作业调度器部署云原生 HPC 集群
  • 如何使用 Slurm 批量作业在 Google Cloud 上并行运行 WRF®

所需条件

2. 配置

启用 Google Cloud API

如需创建和使用 Google Cloud 资源,必须启用 API。

gcloud services enable compute.googleapis.com 

设置 IAM 政策

在 HPC 中,系统管理员和系统用户有明确的区别。系统管理员通常拥有“根访问权限”使他们能够管理和操作计算资源系统用户通常是研究人员、科学家和应用工程师,他们只需要使用资源来执行作业。

在 Google Cloud 上,OS Login API 可预配 Google Workspace、Cloud Identity 和 Gmail 账号中的 POSIX 用户信息。此外,OS Login 还与 GCP 的 Identity and Access Management (IAM) 系统集成,以确定是否应允许用户升级 Linux 系统的权限。

在本教程中,我们假设您是系统管理员角色和 Compute Engine 管理员角色。我们将配置 IAM 政策,以便为您提供完成以下任务所需的足够权限

  • 创建/删除 Google Compute Engine (GCE) 虚拟机实例
  • 通过 SSH 连接到 GCE 虚拟机实例

57883cb8acc09653

如需为自己提供完成本教程所需的 IAM 角色,请在 Google Cloud 控制台中执行以下操作:

  1. 前往“IAM”和管理 >“产品和服务”菜单中的 IAM。
  2. 点击“+ 添加”。
  3. 在“新成员”下方输入您的 Google Workspace 账号、Cloud Identity 账号或 Gmail 账号
  4. 添加以下角色:Compute Admin、Compute OS Login 和 Service Account User
  5. 点击“保存”

您的登录现已拥有启动 HPC 集群创建所需的权限。

如需验证您是否分配了正确的角色,请打开 Cloud Shell,然后运行以下命令,注意将 YOUR_PROJECTEMAIL_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. 配额不足:使用 Terraform 部署可自动扩缩的 HPC 集群

在本部分中,您将部署一个可自动扩缩的 HPC 集群,其中包含 Slurm 作业调度器。此选项与“高配额”选项相同,不同之处在于使用的机器类型较小,使用的 vCPU 数量也更少。

  1. 在 GCP 上打开 Cloud Shell。
  2. 克隆 FluidNumerics/slurm-gcp 代码库
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. 切换到 WRF 目录:
cd  ~/slurm-gcp/tf/examples/wrf
  1. 创建并审核 Terraform 方案。设置环境变量 WRF_NAMEWRF_PROJECTWRF_ZONE,以指定集群的名称、GCP 项目以及要部署到的可用区。
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME="wrf-small"
  1. 首次运行 terraform 时,您必须运行 init 命令:
terraform init
  1. 使用 make 命令创建计划,该命令将运行 terraform
make plan
  1. 部署集群。安装和设置过程最长可能需要 2 个小时。在部署期间,将安装 WRF 及其所有依赖项。
make apply
  1. 通过 SSH 连接到上一步中创建的 login 节点。您可以在上一步中看到此节点(可能称为 wrf-small-login0)。为此,您可以在控制台菜单项 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}

  1. 连接到登录节点后,如需验证集群设置,请检查 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
  1. 验证 /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 批量作业。此基准的输入演示文稿包含在 wrf-gcp 虚拟机映像中的 /apps/share/benchmarks/conus-12km 下。

对于本部分,您必须通过 SSH 连接到集群的 login 节点

  1. 从 /apps/share 中复制示例 wrf-conus.sh 批处理文件
cp /apps/share/wrf-conus12.sh ~/
  1. 在文本编辑器中打开 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
  1. 使用 sbatch 提交批量作业。
sbatch wrf-conus12.sh
  1. 等待作业完成。此基准配置为运行 6 小时的预测,按 24 个排名完成该预测大约需要 3 个小时。您可以使用 squeue 监控作业的状态。
  2. 该作业完成后,检查 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. 高配额:使用 Terraform 部署可自动扩缩的 HPC 集群

在本部分中,您将在 GCP 中部署一个可自动扩缩的 HPC 集群,其中包括 Slurm 作业调度器。

  1. 在 GCP 上打开 Cloud Shell。
  2. 克隆 FluidNumerics/slurm-gcp 代码库
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. 切换到 WRF 目录:
cd  ~/slurm-gcp/tf/examples/wrf
  1. 创建并审核 Terraform 方案。设置环境变量 WRF_NAMEWRF_PROJECTWRF_ZONEWRF_MAX_NODEWRF_MACHINE_TYPE,以指定集群的名称、GCP 项目、要部署到的可用区、节点数上限和机器类型。对于 CONUS 2.5 公里基准,我们建议使用至少具有 8 个节点的 c2-standard-60 实例以及 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"
  1. 如果您在前面没有执行此操作,则必须运行 terraform init 来启动 Terraform:
terraform init
  1. 使用 make 命令创建计划。
make plan
  1. 部署集群。安装和设置过程最长可能需要 2 个小时。在部署期间,将安装 WRF 及其所有依赖项。
make apply
  1. 通过 SSH 连接到上一步中创建的 login 节点。您可以在上一步中看到此节点(可能称为 wrf-large-login0)。为此,您可以在控制台菜单项 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 登录节点。

  1. 连接到登录节点后,如需验证集群设置,请检查 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
  1. 验证 /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 公里基准测试,您需要提交 Slurm 批量作业。此基准的输入演示文稿包含在 wrf-gcp 虚拟机映像中的 /apps/share/benchmarks/conus-2.5km 下。

对于本部分,您必须通过 SSH 连接到集群的 login 节点

  1. 从 /apps/share 中复制示例 wrf-conus.sh 批处理文件
cp /apps/share/wrf-conus2p5.sh ~/
  1. 在文本编辑器中打开 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
  1. 使用 sbatch 提交批量作业。
sbatch wrf-conus2p5.sh
  1. 等待作业完成。此基准配置为运行 6 小时的预测,使用 480 个排名大约需要 1 小时才能完成预测。您可以使用 squeue 监控作业的状态。
  2. 该作业完成后,检查 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 集群,并在 Google Cloud Platform 上运行了并行 WRF® 模拟!

清理

为避免系统因本 Codelab 中使用的资源向您的 Google Cloud Platform 账号收取费用,请执行以下操作:

删除项目

若要避免产生费用,最简单的方法是删除您为本 Codelab 创建的项目。

注意:删除项目会产生以下影响:

  • 项目中的所有内容都会被删除。如果您为此 Codelab 使用了现有项目,则删除该项目后,还将删除您已在该项目中完成的任何其他工作。
  • 自定义项目 ID 会丢失。创建此项目时,您可能创建了要在将来使用的自定义项目 ID。要保留使用该项目 ID 的网址(例如 appspot.com 网址),请删除项目内的所选资源,而不是删除整个项目。

如果您打算探索多个 Codelab 和快速入门,重复使用项目可以帮助您避免超出项目配额上限。

  1. 在 Cloud Console 中,转到管理资源页面。 转到“管理资源”页面
  2. 在项目列表中,选择要删除的项目,然后点击删除 dc096e8341a05fec.png
  3. 在对话框中输入项目 ID,然后点击关停以删除项目。

逐个删除资源

  1. 打开 Cloud Shell 并导航到 wrf 示例目录
cd  ~/slurm-gcp/tf/examples/wrf
  1. 运行 make destroy 以删除所有资源。
make destroy