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®
所需条件
- Gmail 账号(附加了 SSH 密钥),或者 Google Workspace、Cloud Identity
- 启用了结算功能的 Google Cloud Platform 项目
- GCP 项目的 Project Owner 角色
- 足够的 Compute Engine 配额(480 个 c2 vCPU 和 500 GB PD 标准磁盘)
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 虚拟机实例
如需为自己提供完成本教程所需的 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 连接到上一步中创建的 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}
- 连接到登录节点后,如需验证集群设置,请检查 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 12 公里基准
如需运行 CONUS 12 公里基准测试,您需要提交 Slurm 批量作业。此基准的输入演示文稿包含在 wrf-gcp 虚拟机映像中的 /apps/share/benchmarks/conus-12km 下。
对于本部分,您必须通过 SSH 连接到集群的 login 节点
- 从 /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 中部署一个可自动扩缩的 HPC 集群,其中包括 Slurm 作业调度器。
- 在 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.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"
- 如果您在前面没有执行此操作,则必须运行
terraform init
来启动 Terraform:
terraform init
- 使用 make 命令创建计划。
make plan
- 部署集群。安装和设置过程最长可能需要 2 个小时。在部署期间,将安装 WRF 及其所有依赖项。
make apply
- 通过 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 登录节点。
- 连接到登录节点后,如需验证集群设置,请检查 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.5 公里基准
如需运行 CONUS 2.5 公里基准测试,您需要提交 Slurm 批量作业。此基准的输入演示文稿包含在 wrf-gcp 虚拟机映像中的 /apps/share/benchmarks/conus-2.5km 下。
对于本部分,您必须通过 SSH 连接到集群的 login 节点
- 从 /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