流体数値解析による Gromacs 分子動力学シミュレーションを実行するSlurm-GCP

1. はじめに

最終更新日: 2022 年 4 月 25 日

作業内容

この Codelab では、自動スケーリングのハイ パフォーマンス コンピューティング(HPC)クラスタを Google Cloud にデプロイします。Terraform のデプロイにより、Spack を介してインストールされた Gromacs を使用して、このクラスタが作成されます。クラスタは Slurm ジョブ スケジューラで管理されます。クラスタが作成されたら、benchMEM、benchPEP、または benchRIB ベンチマークを実行します。

学習内容

  • Slurm ジョブ スケジューラをサポートする HPC クラスタをデプロイする方法
  • Slurm バッチジョブを使用して、Google Cloud の Gromacs で GPU アクセラレーションによる分子動力学シミュレーションを実行する方法

必要なもの

2. セットアップ

この Codelab を完了するには、Compute Engine API と Cloud Build API を有効にする必要があります。Compute Engine API と Cloud Build API を有効にするには、Cloud Shell を開いて次のコマンドを実行します。以下の は、プロジェクト ID に置き換えてください。

gcloud config set project <PROJECT_ID>
gcloud services enable compute.googleapis.com
gcloud services enable cloudbuild.googleapis.com

注意: サードパーティの SSH(OpenSSH など)を使用してクラスタに接続する場合は、必ず OS Login を使用して SSH 認証鍵を Cloud Identity プロファイルに接続してください。Cloud Identity プロファイルへの SSH 認証鍵の追加の詳細を確認する

3. [省略可] Gromacs で GCP VM イメージを作成する

この Codelab では、事前ビルド済みのイメージを用意しています。これは、Gromacs とそのすべての依存関係がビルドプロセスにインストールされるまでに最長で 2 時間かかることがあるためです。この事前構築済みイメージを使用して時間を節約する場合は、スキップして次のセクションに進んでください。

Google Cloud で研究アプリケーションを実行する場合、アプリケーションをインストールしてデプロイする方法は数多くあります。Codelab のこのセクションでは、slurm-gcp(CentOS7)VM イメージの上に構築される仮想マシンイメージを作成します。作成プロセスの間、コンパイラは、すべての Gromacs のGromacs がインストールされます。

RCC アプリ リポジトリの Gromacs Cloud Build パイプラインは、Gromacs のインストールに必要な手順をカプセル化します。インストール プロセスでは、Packer を使用して Spack をインストールする VM をデプロイします。これにより、GPU アクセラレーションが有効な GCC@9.2.0 コンパイラと Gromacs@2021.2 がインストールされます。

  1. GCP で Cloud Shell を開きます。
  2. FluidNumerics/rcc-apps リポジトリのクローンを作成する
cd ~
git clone https://github.com/FluidNumerics/rcc-apps.git
  1. Google Cloud Build を使用してイメージをビルドします。
cd rcc-apps
gcloud builds submit . --config=gromacs/cloudbuild.yaml --project=<PROJECT_ID> --async

ビルドプロセスのステータスは、Google Cloud Build ダッシュボードで確認できます。

ビルドプロセスには 2 時間ほどかかることがあります。時間を短縮するには、ビルド構成ファイルのスキーマを変更してマシンタイプを変更し、ビルドのパフォーマンスを改善することをおすすめします。これを行うには、_MACHINE_TYPE ビルド変数を使用します。例:

gcloud builds submit . --config=gromacs/cloudbuild.yaml --project=<PROJECT_ID> --async --substitutions=_MACHINE_TYPE=n2-standard-64

ビルドが完了すると、Google Cloud プロジェクトで VM イメージが使用可能になり、それを使用してクラスタをデプロイできます。

4. Terraform を使用して自動スケーリング HPC クラスタをデプロイする

このセクションでは、Terraform を使用して、Slurm ジョブ スケジューラをインストールした自動スケーリング HPC クラスタをデプロイします。このクラスタは、それぞれ 8 個の vCPU と 1 個の Nvidia® Tesla V100 GPU を備えたコンピューティング ノードとともにデプロイされます。

  1. GCP で Cloud Shell を開きます。
  2. FluidNumerics/rcc-apps リポジトリのクローンを作成する
cd ~
git clone https://github.com/FluidNumerics/rcc-apps.git
  1. gromacs terraform ディレクトリに移動します。
cd ~/rcc-apps/gromacs/tf/slurm
  1. Terraform のプランを作成して確認します。環境変数 GMX_NAMEGMX_PROJECTGMX_ZONE を設定して、クラスタの名前、GCP プロジェクト、デプロイ先のゾーンを指定します。不明な場合は、以下のメモをご確認ください
export GMX_PROJECT=<PROJECT_ID>
export GMX_ZONE=<ZONE> 
export GMX_NAME="gromacs" 
  1. この Codelab の前のセクションで独自の VM イメージを作成した場合は、GMX_IMAGE 環境変数も設定する必要があります。

export GMX_IMAGE="projects/${GMX_PROJECT}/global/images/gromacs-gcp-foss-latest"

  1. make コマンドを使用してプランを作成します。このコマンドは terraform init && terraform plan を実行します。
make plan
  1. クラスタをデプロイします。Gromacs とその依存関係がクラスタにプリインストールされているため、設定プロセスは数分で完了します。
make apply
  1. 前の手順で作成した login ノードに SSH 接続します。このノードは前のステップで確認できます(おそらく gromacs-login0 という名前です)。これを行うには、コンソールのメニュー項目で、VM インスタンスのリストの横にある SSH ボタンをクリックします。[Compute Engine] ->VM インスタンスです。

オプション: 次の gcloud コマンドのペアは、ログインノード名を特定して SSH 接続します。

export CLUSTER_LOGIN_NODE=$(gcloud compute instances list --zones ${GMX_ZONE} --filter="name ~ .*login" --format="value(name)" | head -n1)
gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone ${GMX_ZONE}
  1. ログインノードに接続したら、クラスタの設定を確認するために、Gromacs がインストールされていることを確認します
$ spack find gromacs
==> In environment /apps/spack-pkg-env
==> Root specs
gromacs@2021.2 +cuda~mpi

==> 1 installed package
-- linux-centos7-x86_64 / gcc@9.2.0 -----------------------------
gromacs@2021.2
  1. /opt/share/gromacs に以下の内容があることを確認します。
$ ls /opt/share/gromacs/
benchMEM.tpr benchPEP-h.tpr benchPEP.tpr benchRIB.tpr

5. benchRIB ベンチマークを実行する

Gromacs は、エネルギーを最小化する制約下で、分子動力学をシミュレートし、分子構造を計算するために使用される研究用ソフトウェアです。この Codelab の VM イメージで提供されているベンチマークは、原子システムの進化である分子動力学に焦点を当てています。

分子動力学では、ニュートンの運動の法則を使用して原子の位置、速度、加速度をシミュレートします。

638fa1fba54c3874.png

ここで、位置ベクトル は原子 i の位置、t は時間、72a717ea69626d54.png は原子 i の質量、b5e52e17becb80ec.png は原子 j によって原子 i に作用する非結合力、538199b3881cd305.png は結合相互作用による力です。温度、圧力、原子の位置、原子の速度から力を計算し、システムを数値統合して、新しい原子の速度と位置を取得します。このプロセスを所定の時間繰り返して、分子動力学をシミュレートします。

Gromacs イメージ(作成したイメージまたは提供されたイメージ)には、3 つのベンチマークが付属しています

  1. benchMEM
  2. benchRIB
  3. benchPEP

これらのベンチマークは、Kutzner の Free Gromacs Benchmarks のセットは、一時的な分子動力学シミュレーションの標準的なセットです。ベンチマークごとに、シミュレーションの原子数と所要時間が異なります。各シミュレーションに関連する構成を以下の表に示します。

指標 / ベンチマーク

benchMEM

benchRIB

benchPEP

原子数

8 万 1,743

2,136,412

1,249 万 5,503

システムサイズ / nm

10.8×10.2×9.6

31.2×31.2×31.2

50.0 x 50.0 x 50.0

時間ステップ / fs

2

4

2

カットオフ半径 / nm

1

1

1.2

PME グリッドの間隔 / nm

0.12

0.135

0.16

ベンチマークを実行するには、Slurm バッチジョブを送信します。デフォルトでは、提供されたバッチ スクリプトが benchRIB ベンチマークを実行します。提供されたベンチマークの構成を定義する入力資料は、Gromacs VM イメージの /opt/share/gromacs に含まれています。また、Gromacs を実行するためのサンプル bash スクリプトが /opt/share にあります。

このセクションでは、クラスタのログインノードに SSH で接続する必要があります。

  1. sbatch コマンドを使用してバッチジョブを送信する
$ sbatch --ntasks=1 --cpus-per-task=8 --gres=gpu:1 --out=gromacs.out /opt/share/gromacs_bench.sh

これにより、ジョブが実行のためにキューに入れられ、Slurm がコンピューティング ノードをプロビジョニングします。sinfo を実行すると、コンピューティング ノードが alloc# 状態になります。これは、コンピューティング ノードがジョブに割り当てられており、プロビジョニング処理中であることを意味します。ジョブが実行されると、ノードは alloc 状態に設定されます。

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
gromacs*     up   infinite      1 alloc# gromacs-compute-0-0
$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                 2   gromacs gromacs_      joe  R       0:02      1 gromacs-compute-0-0
$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
gromacs*     up   infinite      1  alloc gromacs-compute-0-0

ジョブが完了するまで、デフォルトのベンチマーク(benchRIB)は、約 800 万原子をシミュレートし、5,000 タイムステップ(4 タイムステップ/fs)ステップを実行し、完了までに約 6 分かかるように設定されています。次のコマンドを使用すると、ジョブのステータスをモニタリングできます。

watch squeue

ジョブがキューからなくなったら、Ctrl+C キーを押して終了できます。

  1. ジョブが完了すると、シミュレーション出力を含む run/ というディレクトリ(run/MEM の下)と、現在のディレクトリに gromacs.out というログファイルが表示されます。run/MEM ディレクトリには、ener.edrmd.log の 2 つのファイルがあります。ener.edr ファイルは、システムのエネルギー、温度、圧力、ボックスサイズ、密度、ウイルスをポータブルなバイナリ形式で保存します。拡張機能が示すように、md.log ファイルには Gromacs シミュレーションのログが含まれています。また、粒子粒子ソルバーと PME ソルバーからのロギング情報に加えて、シミュレーションのパフォーマンスに関する情報も含まれています。gromacs.out に含まれる gmx mdrun の標準出力は次のようになります。
$ tail -n9 gromacs.out
step 5000, remaining wall clock time:     0 s          
               Core t (s)   Wall t (s)        (%)
       Time:     3085.342      385.683      800.0
                 (ns/day)    (hour/ns)
Performance:        4.481        5.356

GROMACS reminds you: "I never thought of stopping, and I just hated sleeping. I can't imagine having a better life." (Barbara McClintock)

OK

6. 完了

この Codelab では、自動スケーリング可能なクラウドネイティブな HPC クラスタを作成し、Google Cloud で Gromacs を使用して GPU アクセラレーションによる分子動力学シミュレーションを実行しました。

クリーンアップ

この Codelab で使用したリソースについて、Google Cloud アカウントに課金されないようにする手順は次のとおりです。

推奨: Terraform を使用して HPC クラスタを削除する

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

または、プロジェクトを削除する(最も効果的で破壊的)

課金を停止する最も簡単な方法は、Codelab 用に作成したプロジェクトを削除することです。

注意: プロジェクトを削除すると、次のような影響があります。

  • プロジェクト内のすべてのものが削除されます。この Codelab で既存のプロジェクトを使用した場合、それを削除すると、そのプロジェクトで行った他の作業もすべて削除されます。
  • カスタム プロジェクト ID が失われます。このプロジェクトを作成したときに、将来使用するカスタム プロジェクト ID を作成した可能性があります。appspot.com URL など、プロジェクト ID を使用する URL を保持するには、プロジェクト全体を削除するのではなく、プロジェクト内の選択したリソースを削除します。

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

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