Fluid Numerics を使用して WRF 気象予測モデルを実行するSlurm-GCP

1. はじめに

米国本土

最終更新日: 2021 年 5 月 5 日

作業内容

この Codelab では、Slurm ジョブ スケジューラを使用して、自動スケーリングのハイ パフォーマンス コンピューティング(HPC)クラスタを Google Cloud にデプロイします。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)VM インスタンスの作成/削除
  • GCE VM インスタンスに SSH 接続する

57883cb8acc09653.png

このチュートリアルを完了するために必要な IAM ロールを自身に付与するには、Google Cloud コンソールで次の操作を行います。

  1. [IAM] に移動し、管理 >[プロダクトとサービス] メニューの IAM。
  2. [+ 追加] をクリックします。。
  3. [新しいメンバー] に、Google Workspace アカウント、Cloud Identity アカウント、または Gmail アカウントを入力します。
  4. Compute 管理者、Compute OS Login、サービス アカウント ユーザーのロールを追加します。
  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 クラスタをデプロイする

このセクションでは、Slurm ジョブ スケジューラを含む自動スケーリング HPC クラスタをデプロイします。これは高割り当てオプションと同じですが、使用されるマシンタイプが小さく、使用される 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. 前の手順で作成した login ノードに SSH 接続します。このノードは前のステップで確認できます(おそらく wrf-small-login0 という名前です)。これを行うには、コンソールのメニュー項目で、VM インスタンスのリストの横にある SSH ボタンをクリックします。[Compute Engine] ->VM インスタンスです。

オプション: 次の 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 12 km ベンチマークを実行するには、Slurm バッチジョブを送信します。このベンチマークの入力資料は、/apps/share/benchmarks/conus-12km にある wrf-gcp VM イメージに含まれています。

このセクションでは、クラスタのログインノードに 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 クラスタをデプロイする

このセクションでは、Slurm ジョブ スケジューラを含む自動スケーリング HPC クラスタを GCP にデプロイします。

  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 km ベンチマークでは、少なくとも 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. 前の手順で作成した login ノードに SSH 接続します。このノードは前のステップで確認できます(おそらく wrf-large-login0 という名前です)。これを行うには、コンソールのメニュー項目で、VM インスタンスのリストの横にある SSH ボタンをクリックします。[Compute Engine] ->VM インスタンスです。

オプション: 次の 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}

2 番目のコマンドにより、Slurm Login ノードに接続されます。

  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 km ベンチマークを実行する

CONUS 2.5 km ベンチマークを実行するには、Slurm バッチジョブを送信します。このベンチマークの入力資料は、/apps/share/benchmarks/conus-2.5km にある wrf-gcp VM イメージに含まれています。

このセクションでは、クラスタのログインノードに 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 を作成した可能性があります。appspot.com URL など、プロジェクト ID を使用する URL を保持するには、プロジェクト全体を削除するのではなく、プロジェクト内の選択したリソースを削除します。

複数の Codelab とクイックスタートを実施する予定がある場合は、プロジェクトを再利用すると、プロジェクトの割り当て上限を超えないようにすることができます。

  1. Cloud コンソールで [リソースの管理] ページに移動します。[リソースの管理] ページに移動
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除 ] dc096e8341a05fec.png をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

個々のリソースの削除

  1. Cloud Shell を開き、wrf のサンプル ディレクトリに移動します。
cd  ~/slurm-gcp/tf/examples/wrf
  1. make destroy を実行してすべてのリソースを削除します。
make destroy