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®
所需条件
- Gmail 账号(已附加 SSH 密钥)或 Google Workspace、Cloud Identity
- 已启用结算功能的 Google Cloud Platform 项目
- 您的 GCP 项目中的项目所有者角色
- 充足的 Compute Engine 配额(480 个 c2 vCPU 和 500 GB PD-Standard 磁盘)
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 虚拟机实例

如需为自己授予完成本教程所需的 IAM 角色,请在 Google Cloud 控制台中执行以下操作:
- 在“产品和服务”菜单中,依次前往“IAM 和管理”>“IAM”。
- 点击页面顶部附近的“+添加”。
- 在“新成员”下输入您的 Google Workspace 账号、Cloud Identity 账号或 Gmail 账号
- 添加以下角色:Compute Admin、Compute OS Login 和 Service Account User
- 点击“保存”
现在,您的登录账号已拥有启动 HPC 集群创建所需的权限。
如需验证您是否已分配正确的角色,请打开 Cloud Shell,然后运行以下命令,将 YOUR_PROJECT 和 EMAIL_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 数量更少。
- 在 GCP 上打开 Cloud Shell。
- 克隆 FluidNumerics/slurm-gcp 代码库
cd ~ git clone https://github.com/FluidNumerics/slurm-gcp.git
- 切换到 WRF 目录:
cd ~/slurm-gcp/tf/examples/wrf
- 创建并查看 Terraform 方案。设置环境变量
WRF_NAME、WRF_PROJECT和WRF_ZONE,以指定集群的名称、GCP 项目和要部署到的可用区。
export WRF_PROJECT=<PROJECT ID> export WRF_ZONE=<ZONE> export WRF_NAME="wrf-small"
- 首次运行 Terraform 时,您必须运行
init命令:
terraform init
- 使用 make 命令创建方案,该命令将运行
terraform
make plan
- 部署集群。安装和设置过程最长可能需要 2 小时。在部署期间,系统将安装 WRF 及其所有依赖项。
make apply
- 通过 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}
- 连接到登录节点后,如需验证集群设置,请检查 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
- 验证
/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 连接到集群的登录节点
- 从 /apps/share 复制示例 wrf-conus.sh 批处理文件
cp /apps/share/wrf-conus12.sh ~/
- 在文本编辑器中打开 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
- 使用 sbatch 提交批量作业。
sbatch wrf-conus12.sh
- 等待作业完成。此基准测试配置为运行 6 小时的预测,在 24 个等级下大约需要 3 小时才能完成。您可以使用
squeue监控作业的状态。 - 作业完成后,检查 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 集群。
- 在 GCP 上打开 Cloud Shell。
- 克隆 FluidNumerics/slurm-gcp 代码库
cd ~ git clone https://github.com/FluidNumerics/slurm-gcp.git
- 切换到 WRF 目录:
cd ~/slurm-gcp/tf/examples/wrf
- 创建并查看 Terraform 方案。设置环境变量
WRF_NAME、WRF_PROJECT、WRF_ZONE、WRF_MAX_NODE和WRF_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"
- 如果您未在上述步骤中执行此操作,则必须运行
terraform init以启动 Terraform:
terraform init
- 使用 make 命令创建方案。
make plan
- 部署集群。安装和设置过程最长可能需要 2 小时。在部署期间,系统将安装 WRF 及其所有依赖项。
make apply
- 通过 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 登录节点。
- 连接到登录节点后,如需验证集群设置,请检查 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
- 验证
/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 连接到集群的登录节点
- 从 /apps/share 复制示例 wrf-conus.sh 批处理文件
cp /apps/share/wrf-conus2p5.sh ~/
- 在文本编辑器中打开 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
- 使用 sbatch 提交批量作业。
sbatch wrf-conus2p5.sh
- 等待作业完成。此基准测试配置为运行 6 小时的预报,使用 480 个等级大约需要 1 小时才能完成。您可以使用
squeue监控作业的状态。 - 作业完成后,检查 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 和快速入门,重复使用项目可以帮助您避免超出项目配额上限。
- 在 Cloud Console 中,转到管理资源页面。 前往“管理资源”页面
- 在项目列表中,选择要删除的项目,然后点击删除 图标
。 - 在对话框中输入项目 ID,然后点击关停以删除项目。
逐个删除资源
- 打开 Cloud Shell 并前往 wrf 示例目录
cd ~/slurm-gcp/tf/examples/wrf
- 运行 make destroy 以删除所有资源。
make destroy