Page List

Search on the blog

2020年4月29日水曜日

GCP MPI Cluster

 昔Distributed Code Jamというコンテストがありました。単一のマシンでは解けないような問題を複数のマシンでいい感じに解くというコンテストですが近年は開催されておりません。Distributed Code Jam のような問題を解いて遊びたいなと思い、手軽に並列コンピューティングを行う環境を構築できる仕組みを作ってみたのでブログで紹介したいと思います。

やりたいこと
ローカルマシンからコマンドを実行するだけで以下のことができるようにします。
  • 並列コンピューティング環境が自動構築される
  • 複数ノード上で目的のプログラムをコンパイルできる
  • 複数ノード上で目的のプログラムを実行できる
つくったもの
https://github.com/Kenji-H/gcp-mpi-cluster (このブログを書いているときはv0.9.1のものが最新です)

クラウドサービスに Google Cloud Platform、インフラの構築自動化に Terraform、構成管理ツールに Ansible、並列コンピューティングのライブラリに MPI を使っています。

Getting Started

0. Google Cloud Platform(GCP)のアカウントを持っていない場合は作成してください。また、ローカルマシンにTerraform、Ansible、jq が入っていない場合はインストールしておいてください。

1. GCPのコンソール画面から「Compute 管理者」ロールを付与したサービスアカウントを作成します。

2. サービスアカウントキーを生成し、terraform ディレクトリ直下に account.json という名前で保存します。

3. terraform/terraform.tfvarsというファイルを作成し環境設定をします。YOUR_PROJECT_NAMEのところはあなたのGCPプロジェクトIDに置き換えてください。日本で動かす場合はYOUR_REGION_NAMEのところはnortheast1、YOUR_ZONE_NAMEのところはasia-northeast1-aなどとするとよいでしょう。
project = "YOUR_PROJECT_NAME"
region = "YOUR_REGION_NAME"
zone = "YOUR_ZONE_NAME"

4. ./creater_cluster を実行します。このスクリプトはGCPのcompute engineを複数台起動し、並列コンピューティングに必要な環境設定を自動で行います。

5. ./compile hello でサンプルプログラムをコンパイルします。このスクリプトはローカルマシン上のプログラムをコンピューティングクラスタのノードに転送し、各ノード上でコンパイルを行います。

6. ./run hello でプログラムを実行します。hello は各ノードのプロセッサ名を表示するだけの簡単なプログラムです(app/hello/のソースを参考)。もう少し難しいプログラムを動かしたい場合は app/divisor のソースを見て hello と同様にコンパイル・実行してみてください。

7. 遊び終わったら ./destroy_cluster を実行して、インスタンスを破棄しておきましょう。

注意
このプロジェクトによって発生した如何なるエラー、問題、結果について責任を負いません。意図的に悪意のあるコードは含まれていませんが、利用にあたってはクレデンシャル情報(account.json)が外部に漏れないこと、また、インスタンスを起動しっぱなしにして高額請求されることのないように十分気をつけてください。