1. 簡介

上次更新時間:2021 年 5 月 5 日
建構目標
在本程式碼研究室中,您將使用 Slurm 工作排程器,在 Google Cloud 上部署可自動調整資源配置的高效能運算 (HPC) 叢集。您將使用 Terraform 部署範例,透過 Spack 安裝 WRF®,並部署這個叢集。接著,您會使用這項基礎架構執行 CONUS 2.5 公里基準或 CONUS 12 公里基準。
學習目標
- 如何在 Google Cloud Platform 上設定 Identity and Access Management (IAM) 政策,以運作 HPC 叢集
- 如何使用 Slurm 工作排程器部署雲端原生 HPC 叢集
- 如何使用 Slurm 批次工作,在 Google Cloud 上平行執行 WRF®
需要準備的事項
- 已附加 SSH 金鑰的 Gmail 帳戶,或 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 中,系統管理員和系統使用者有明顯區別。系統管理員通常具有「根存取權」,可管理及操作運算資源。系統使用者通常是研究人員、科學家和應用程式工程師,他們只需要使用資源來執行工作。
在 Google Cloud 中,OS 登入 API 會從 Google Workspace、Cloud Identity 和 Gmail 帳戶佈建 POSIX 使用者資訊。此外,OS 登入會與 GCP 的 Identity and Access Management (IAM) 系統整合,判斷是否應允許使用者在 Linux 系統上提升權限。
在本教學課程中,我們假設您擔任系統管理員和 Compute Engine 管理員角色。我們會設定 IAM 政策,授予您足夠的權限來完成下列工作
- 建立/刪除 Google Compute Engine (GCE) VM 執行個體
- 透過 SSH 連線至 GCE VM 執行個體

如要授予自己完成本教學課程所需的 IAM 角色,請在 Google Cloud 控制台中執行下列操作:
- 在「產品與服務」選單中,依序前往「IAM 與管理」>「IAM」。
- 按一下頁面頂端的「+新增」。
- 在「新成員」下方輸入 Google Workspace 帳戶、Cloud Identity 帳戶或 Gmail 帳戶
- 新增下列角色:Compute 管理員、Compute OS 登入和服務帳戶使用者
- 按一下「儲存」
現在登入帳戶後,您就具備啟動 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 -> VM 執行個體」中,點選 VM 執行個體清單旁的「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 12 公里基準測試
如要執行 CONUS 12 公里基準測試,請提交 Slurm 批次工作。這項基準測試的輸入牌組位於 wrf-gcp VM 映像檔的 /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 中部署可自動調整資源配置的 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 公里基準,我們建議使用 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 -> VM 執行個體」中,點選 VM 執行個體清單旁的「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.5 公里基準測試
如要執行 CONUS 2.5 公里基準,請提交 Slurm 批次工作。這項基準測試的輸入牌組位於 wrf-gcp VM 映像檔的 /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. 恭喜
在本程式碼實驗室中,您建立了自動調整資源配置的雲端原生 HPC 叢集,並在 Google Cloud Platform 上執行平行 WRF® 模擬!
正在清除所用資源
如要避免系統向您的 Google Cloud Platform 帳戶收取您在本程式碼研究室中所用資源的相關費用:
刪除專案
如要避免付費,最簡單的方法就是刪除您為本程式碼研究室建立的專案。
警告:刪除專案會出現以下結果:
- 專案中的所有內容都會遭到刪除。如果您使用現有專案來進行本程式碼研究室,刪除專案時也會一併刪除您在該專案中執行的其他任何工作。
- 自訂專案 ID 不復存在。您建立這個專案時,可能已建立日後使用的自訂專案 ID。如要保留使用該專案 ID 的網址 (例如 appspot.com 網址),請刪除在該專案中選取的資源,而不是刪除整個專案。
如果打算進行多個程式碼研究室及快速入門導覽課程,重複使用專案有助於避免超出專案配額限制。
- 前往 Cloud Console 中的「管理資源」頁面。前往「管理資源」頁面
- 在專案清單中選取要刪除的專案,然後按一下「刪除」圖示
。 - 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 刪除專案。
刪除個別資源
- 開啟 Cloud Shell,然後前往 wrf 範例目錄
cd ~/slurm-gcp/tf/examples/wrf
- 執行 make destroy 即可刪除所有資源。
make destroy