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

1. 简介

美国本土

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

构建内容

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

学习内容

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

所需条件

2. 配置

启用 Google Cloud API

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

gcloud services enable compute.googleapis.com 

设置 IAM 政策

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

在 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.png

如需为自己授予完成本教程所需的 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 连接到上一步中创建的登录节点。您可以在上一步中看到此节点(可能称为 wrf-small-login0)。为此,您可以在控制台菜单项 Compute Engine -> 虚拟机实例中,点击虚拟机实例列表旁边的 SSH 按钮。

可选:以下这对 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 12km 基准测试

如需运行 CONUS 12km 基准,您将提交一个 Slurm 批量作业。此基准测试的输入卡组包含在 wrf-gcp 虚拟机映像的 /apps/share/benchmarks/conus-12km 下。

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

  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 中部署一个包含 Slurm 作业调度器的可自动扩缩的 HPC 集群。

  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.5km 基准,我们建议使用 c2-standard-60 实例,至少有 8 个节点可用于运行具有 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 连接到上一步中创建的登录节点。您可以在上一步中看到此节点(可能称为 wrf-large-login0为此,您可以在控制台菜单项 Compute Engine -> 虚拟机实例中,点击虚拟机实例列表旁边的 SSH 按钮。

可选:以下这对 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.5km 基准测试

如需运行 CONUS 2.5km 基准,您需要提交一个 Slurm 批量作业。此基准测试的输入卡片包含在 wrf-gcp 虚拟机映像的 /apps/share/benchmarks/conus-2.5km 下。

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

  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