2011年03月28日

続:Amazon Clusterインスタンスで計算

震災から2週間が過ぎました。
まず、今回の震災で被害に遭われた方々、またご家族が被害に遭われた方々にお見舞い申し上げます。

被災地域直接ではありませんが、震災の影響範囲に私なりに少しでも出来ることをと考え、この記事を書くことにしました。
ご存じの通り、現在の東日本では電力状況が切迫しており、輪番停電が実施されております。
これは、計算機クラスタを日常的に研究に使う者にとっては非常に厳しい状況です。
各研究室で所有しているクラスタも、節電と輪番停電のため動かせない状況が続いていると伺っています。
また、外部計算リソースについても、現在の日本の外部利用可能な計算機の状況を@plus7さんがブログで纏めて下さいました。これはほぼ壊滅的と言って良い状況です。
そこで、本記事ではAmazon Elastic Compute Cloud (EC2)を使って、即席計算リソースを作る手順を記述してみようと思います。操作環境はLinuxを想定しています。
(追記: 3/30 @ar1 さんの指摘によりplacement周りを修正しました。)

お値段と職業研究者の方への留意点


話に入る前に、お値段の事を説明しておきます。Amazon EC2 HPCインスタンスの費用は3/27日現在で$1.60 / hrです。現在のレートだと一日3000円強に相当します。これに更に、データ移動費としておよそ$0.10~0.15 / GBがかかります。特に計算結果の回収などでかなりのお金がかかりますので、その点を十分に見越した運用をしてください。また、インスタンスを保存すると別途お金が必要です。

加えて、支払い方法がカード払いのみとなります。各団体の支払い責任者と相談し、法人カードが使えるかどうかなどを検討してください。

性能諸元


Amazon EC2 HPCインスタンスの性能は、こちらにあるとおりXeon X5570 * 2 (+ Tesla M2050 * 2)です。ノード間は10GbEですが、placement groupを用いてもレイテンシのばらつきを押さえるのは難しいようです。HPCですとどうしても均質かつ低レイテンシな通信が必要となるので、通信性能には期待しない方が良さそうです。(3/30追記・修正: StarClusterではplacementも自動で設定してくれるので、比較的近くにノードは配置されるのですが、実測してみるとばらつきが大きくなっていました。)

AWS(Amazon Web Services)アカウント準備


アカウントの準備に関しては、既に良いガイドをImpress Bussiness Mediaさんが作成されているので、そちらをご参照下さい。
http://cloud.impressbm.co.jp/article/658
オンラインサインアップのため、電話を受けられる場所・設備から試してください。携帯電話でも問題なく動作します。

HPCインスタンスセットアップ - StarClusterの導入


HPCインスタンスを手動でセットアップすることも出来ますが、今回はStarClusterという非常に良くできているユーティリティを利用します。
まず、pythonのPyPIを準備します。Debian系(Debian, Ubuntu, etc.)なら、
% sudo aptitude install python-setuptools python-dev

Redhat系(RHEL, Fedora, CentOS)なら
% su -
% yum install python-setuptools-devel

として、PyPI/easy_installを準備しましょう。
StarClusterのページから、最新版のCluster Computing Instance対応版をダウンロードします。
執筆時点ではgit版以外は対応していないため、次のようにtarballを直接ダウンロードしインストールします。
% wget http://github.com/jtriley/StarCluster/tarball/master -O starcluster.tar.gz
% tar xzf starcluster.tar.gz
% cd jtriley-StarCluster-*
% python setup.py build
% sudo python setup.py install

Redhat系をお使いの方はsudoの代わりにsu -してから操作してください。

インストールが無事に終了したら、次のコマンドを実行できるはずです。

% starcluster --help
StarCluster - (http://web.mit.edu/starcluster) (v. 0.9999)
Software Tools for Academics and Researchers (STAR)
Please submit bug reports to starcluster@mit.edu

Usage: StarCluster Command Line Interface:

starcluster [global-opts] action [action-opts] [ ...]

Available Commands:
-------------------
NOTE: Pass --help to any command for a list of its options and detailed usage information
...


使用法が正しく表示されれば、導入は終わりです。

HPCインスタンスセットアップ - StarClusterの設定


次に、StarCluster自体の設定を行います。まず、StarClusterには設定ファイルのひな形を自分で作ってくれる機能があるので、これを利用しましょう。
% starcluster help
StarCluster - (http://web.mit.edu/starcluster) (v. 0.9999)
Software Tools for Academics and Researchers (STAR)
Please submit bug reports to starcluster@mit.edu

cli.py:92 - ERROR - config file /home/shun/.starcluster/config does not exist

Options:
--------
[1] Show the StarCluster config template
[2] Write config template to /home/shun/.starcluster/config
[q] Quit

Please enter your selection: 2

>>> Config template written to /home/shun/.starcluster/config. Please customize this file.

途中選択が出ますので、2.の"Write config template to ..."を選びます。

設定ファイルが ~/.starcluster/config に記述されるので、ここを書き換えて設定することになります。
下記設定ファイルを参考に、設定ファイルを書き換えます。特に記述のない場所はそのままで構いません。
[aws info]
# ↓この先で説明するアカウントID・秘密ID・ユーザーIDで置き換える
AWS_ACCESS_KEY_ID = ABCDEFGHIJKL123456
AWS_SECRET_ACCESS_KEY = foobarhogemogehage
AWS_USER_ID= 0000-0000-0000

[key gsg-keypair]
# ↓このファイルは後ほど作成する。ディレクトリを自分の$HOMEに修正するのを忘れずに。
KEY_LOCATION=/home/shun/.ssh/id_rsa-gsg-keypair

[cluster smallcluster]
KEYNAME = gsg-keypair

# ↓クラスタの台数。最初は1台から、追加していくことも可能。1台あたりXeon 5570 * 2 socket = 8 CPU Cores.
CLUSTER_SIZE = 1

# ↓ノードに入れるディスクイメージの識別子。この通りの番号で指定する。一覧には無いので注意。
NODE_IMAGE_ID = ami-12b6477b
# ↓GPUを利用したい場合はcg1.4xlargeとする。
NODE_INSTANCE_TYPE = cc1.4xlarge


インスタンスは、今回新たに追加されたHPC用のStarClusterインスタンスを用います。

[aws info]の箇所は、利用者のAmazon AWSのユーザーIDを入れる必要があります。ユーザーIDは次のように取得します。まず、https://aws-portal.amazon.com/gp/aws/developer/account/index.htmlでログインし、左端メニューから「セキュリティ証明書」を選びます。
AWSの画面 - セキュリティ証明書
アクセス証明書から、アクセスIDキーをAWS_ACCESS_KEY_IDに、シークレットアクセスキーをAWS_SECRET_ACCESS_KEYに設定してください。
AWSの画面 - アクセスIDキー
また、アカウント識別子をAWS_USER_IDに設定します。
AWSの画面 - アカウントID
最後に、EC2との間の通信に用いる公開鍵を生成します。
% starcluster createkey -o ~/.ssh/id_rsa-gsg-keypair geg-keypair


これで準備は終わりです。クラスタを起動します。
% starcluster start small-cluster
StarCluster - (http://web.mit.edu/starcluster) (v. 0.9999)
Software Tools for Academics and Researchers (STAR)
Please submit bug reports to starcluster@mit.edu

>>> Using default cluster template: smallcluster
>>> Validating cluster template settings...
>>> Cluster template settings are valid
>>> Starting cluster...
>>> Launching a 1-node cluster...
...
>>> Starting cluster took 5.811 mins


起動を待ったり、nfsの設定等にはかなりの時間がかかります。私の場合、1-nodeのクラスタを立ち上げるのに、6分ほど必要でした。

プログラムの実行と、インスタンスの終了



実行中のインスタンスに接続しましょう。
% starcluster sshmaster smallcluster
...
The authenticity of host 'ec2-000-000-000-000.compute-1.amazonaws.com (000.000.000.000)' can't be established.
RSA key fingerprint is 00:00:00:00:00:00:...:00.
Are you sure you want to continue connecting (yes/no)? yes
..
[root@master ~]#

おなじみのsshのfingerprint確認が発生した後、マスターノードに接続できます。ユーザーsgeadminが追加されていますので、システム管理以外の作業(計算など)はそちらでの実行を推奨します。尚、sgeadminというユーザー名が嫌だという方は設定ファイル内のCLUSTER_USERを変更してインスタンスを再作成して下さい。
[root@master ~]# su - sgeadmin
[sgeadmin@master]~%


コンパイラはgcc, mpicc(OpenMPI)などが使えます。また、ジョブサブミットシステムとしてSun Grid Engineが使えます。SGE経由でMPIプログラムを実行する際には、次のようにして下さい。nodelistはSGEから自動的にmpirunに渡されます。

% cat foo.sh
#!/bin/bash
/usr/lib64/openmpi/1.4-gcc/bin/mpirun -np 8 ./a.out
% qsub -pe orte 8 foo.sh


インスタンスを使い終えたら、次のようにして終了します。(3/30 修正)
% starcluster stop smallcluster

AWSのmanagement consoleを開き、EC2 -> Instance を見て、インスタンスが止まっている(StatusがStopになっている)ことを確認して下さい。これで計算ノードへの課金は止まります。後述しますがディスク領域はAmazon側で保管されており、停止するまで課金が続きます。(3/30 修正)

インスタンスの利用を再開するには、次のようにします。
% starcluster start -x smallcluster

この際、IPアドレスなどが再割り付けされますので、sshで手動アクセスする際などには気をつけてください。

インスタンスを停止しても、ディスク領域には課金が続くことに注意してください($0.10 / GB-month)。完全に停止させるには、ディスク領域ごと破棄する必要があります。
% starcluster terminate smallcluster

上記の方法でどうしても止められなくなった場合は、AWS management consoleからインスタンスを直接選び、右クリックで"Terminate"を選んでください。

注意点・TIPSなど


動的にクラスタ台数を変更したい場合、 starcluster addnode で台数を増やすことが可能です。逆に removenode で台数を動的に減らすことが可能です。
ディスク容量を増やすしたり、データを一時的にAmazonに置いた上でインスタンスを停止させたりするには、Amazon S3やAmazon EBSを使います。RX7さんのこちらの解説をどうぞ。http://d.hatena.ne.jp/rx7/20080429/p1 http://d.hatena.ne.jp/rx7/20080825/p1
また、様々な変更を行った後のディスクイメージを保存しておくには、starclusterのs3imageやebsimageを使うことが出来ます。
Fortranのコンパイラが欲しければ、gfortranを用いるか、Open64などを用いると良いと思われます。Open64を利用してmpiプログラムをコンパイルする際には、
open64-4.2.3-0/bin/openf90 foo.f90 `mpif90 -showme:compile` `mpif90 -showme:link`

のようにすると良いでしょう。

ベンチマークなど


ノード間は10GbEで接続されていますが、レイテンシはお世辞にも良いとは言えません。ping(round-trip time)がおよそ200us90us-150usです。さらに、起動時のplacementによって通信性能が変化します。このため、ノード間をまたがる計算はあまり推奨できません。また、クラスタを2個指定してインスタンスを立ち上げても、ネットワーク上で近い位置に配置してくれるわけではありません。
HyperThreadingを活用する都合上、システムにはプロセッサが8コア/ソケットのように見えますが、実際には4コア/ソケットです。並列化効率が良くないプログラムでは、1ノードあたり8プロセス(=4コア/ソケット)にとどめるのが良いと思われます。

参考までに分子動力学プログラムでのベンチマークを載せておきます。

GROMACS 4.5.4


http://www.gromacs.org/About_Gromacs/Benchmarks のgmxbench 3.0の参考データです。単精度でのみ計算しています。




並列化方式dppc (ns/day)lzm.pmepoly-ch2villin
Threaded (n=16)6.130.794.4200.7
MPI (2nodes)9.229.849.5161.5
(参考) Corei5-750 Threaded (n=4)2.317.537.496.2

NAMD-2.8b1-thread/TCP


UDP使用バージョンはノード間を跨いだときにまともに動かなかったため未掲載(一定確率で落ちる)。系はSPC 1万分子(3万原子).
どうもHVMと相性が悪くCPUを使い切れていないようなのでOpenMPIを使ってcharmmを再コンパイルするのが好ましい?執筆直前にリリースされた2.8b1からスレッド並列がサポートされ、こちらは著しく改善しました。

Threaded 8-thread / 16-thread
Info: Benchmark time: 8 CPUs 0.0350919 s/step 0.406156 days/ns 568.039 MB memory
Info: Benchmark time: 16 CPUs 0.0308002 s/step 0.356484 days/ns 1152.82 MB memory

TCP 2-node
Info: Benchmark time: 16 CPUs 0.0372307 s/step 0.43091 days/ns 20.8592 MB memory
Info: Benchmark time: 32 CPUs 0.0320962 s/step 0.371484 days/ns 18.4872 MB memory

(参考) Corei5-750:
Info: Benchmark time: 4 CPUs 0.0827083 s/step 0.957272 days/ns 32.3621 MB memory

llcbench


llcbench内のmpbenchを用いてMPI round-trip timeを測定しました。パケットサイズに対し、send/recvの対が終わるまでに掛かる時間を測定しています。Placement group指定付きでクラスタを2回起動してround trip timeを計測しました。




BytesRound-trip time (us)
4106, 130
4k180, 188
64k691, 742
1M3878, 3888


th
posted by chun at 02:52| 日記