MPI Tutorial     Tutorials     Recommended Books     About

LAN上でのMPIクラスタ構築 - Running an MPI Cluster within a LAN

Author: Dwaraka Nath

先のレッスンではMPIプログラムを1台のマシンで実行し、CPUに1つ以上のコアがある利点を生かしてコードを並列処理することを見てきました。それでは同じことを1台のコンピュータではなく、LANに接続されたノードで実行できるようにしましょう。物事を単純にするために、このレッスンでは2台のコンピュータを考えます。ノードをもっと増やすのは同じようにできます。

他のチュートリアルと同様にLinuxマシンを使用することを前提としています。以下のチュートリアルはUbuntuでテストしましたが、他のディストリビューションでも同じはずです。また、あなたの2台のマシンを管理者(manager)とし、もう1台を作業者(worker)と呼ぶとしましょう。

前提

すべてのマシンにMPICH2をインストールしていない場合は、この手順を実行してください。

Step 1: hostsの準備 - Configure your hosts file

hostsを用意しましょう。これはマシンのオペレーティングシステムがホスト名をIPアドレスにマッピングするために使用します。以下に例を示します。


$ cat /etc/hosts

127.0.0.1       localhost
172.50.88.34    worker

これはManagerhostsで、workerは、あなたが計算を行いたい他のマシン名です。同様に、Workerではmanagerも同じようにします。

Step 2: ユーザの作成 - Create a new user

既存のユーザーアカウントでクラスタを操作することもできます。しかし、設定をシンプルにするために新しいユーザーアカウントを作成することをお勧めします。全てのホストでユーザーmpiuserを作成しましょう。

$ sudo adduser mpiuser

プロンプトに従ってください。adduserではなくuseraddコマンドを使ってしまうとホームディレクトリが作成されないので使用しないでください。

Step 3: SSHの設定 - Setting up SSH

マシン間が通信できるようにSSHの設定をします。NFSを使ってデータを共有します。

$ sudo apt­-get install openssh-server

まず、このホストでユーザをmpiuserに切り替えます。

$ su - mpiuser

すでに ssh サーバーがインストールされているので、他のマシンに ssh username@hostname でログインできるはずです。パスワードを尋ねられないようにキーを生成して他のマシンの authorized_keys のリストにコピーします。(訳注:この処理は公開鍵認証を可能にする、という処理です。パスワード認証を禁止してはいないことに注意してください)

$ ssh-keygen -t dsa

この例ではDSA鍵を作成しましたがRSA鍵を生成することもできます。より高いセキュリティを求めるのであれば、RSAを使っても良いですがDSAでも十分です。そして、生成した鍵を他のコンピューターに追加すしましょう。wokerノードに対してコピーします。

$ ssh-copy-id worker #ip-address may also be used

それぞれのWorkerマシンと自分のユーザ (localhost) に対してここまでの手順を実行してください。

これで openssh-server がセットアップされ、Workerと安全に通信できるようになります。すべてのマシンに一度 ssh を実行してください。そしてknown_hosts のリストに他のホストのフィンガープリントを追加します。このステップはsshログインのトラブルになりやすいので重要なステップです。

パスワードなしの sshができるようにしましょう。

$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_dsa

さてパスワードのプロンプトなしで他のマシンにログインできるはずです。

$ ssh worker

Note - すべてのワーカーマシンで共通のユーザアカウントとして mpiuser を作成したと仮定しています。ManagerとWorkerで異なる名前のユーザーアカウントを作成した場合は適切なユーザ名を指定してください。

Step 4: NFSの設定 - Setting up NFS

managerはNFS経由でディレクトリを共有し、それをworkerがマウントしてデータをやり取りします。

NFS-Server

パッケージをインストールします。

$ sudo apt-get install nfs-kernel-server

まだ mpiuser にログインしていると仮定して cloud という名前の共有フォルダを作成します。

$ mkdir cloud

cloudを共有するために/etc/exportsを以下のようにします。

$  cat /etc/exports
/home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check)

*の部分にはこのフォルダを共有したいIPアドレスを指定することができますが。今回は簡単のため*にしています。

この説明を作るためにDigital Oceanを参考にしました. このライセンスはCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International Licenseに従います。このライセンスの詳細は ここです。

NFSを実行します。

$ exportfs -a

/etc/exports に変更を加えた場合はこのコマンドが必要です。

必要に応じてnfs サーバを再起動してください。

$ sudo service nfs-kernel-server restart

NFS-worker

以下を実行します。

$ sudo apt-get install nfs-common

workerで同じ名前のディレクトリを作成します。

$ mkdir cloud

そして次のように共有ディレクトリをマウントしてください。

$ sudo mount -t nfs manager:/home/mpiuser/cloud ~/cloud

正常にマウントできたか確認しましょう。

$ df -h
Filesystem      		    Size  Used Avail Use% Mounted on
manager:/home/mpiuser/cloud  49G   15G   32G  32% /home/mpiuser/cloud

再起動のために手動で共有ディレクトリをマウントする必要がないようにするには /etc/fstab ファイルに次のようなエントリを作成してください。

$ cat /etc/fstab
#MPI CLUSTER SETUP
manager:/home/mpiuser/cloud /home/mpiuser/cloud nfs

Step 5: MPIプログラムの実行 - Running MPI programs

それでは正常性の確認のため、MPICH2のインストールパッケージ mpich2/examples/cpi に付属しているサンプルプログラムを並列実行してみましょう。

自分のコードをコンパイルしたい場合は、コードをmpi_sample.c とすると、以下に示す方法でコンパイルして mpi_sample を生成できます。

$ mpicc -o mpi_sample mpi_sample.c

そして実行ファイルを共有ディレクトリ cloud にコピーしてください。もちろん、NFS 共有ディレクトリ内でコードをコンパイルしても良いです。

$ cd cloud/
$ pwd
/home/mpiuser/cloud

自分のマシン(manager)だけで実行するときは以下のようにします。

$ mpirun -np 2 ./cpi # No. of processes = 2

クラスタで実行してみましょう。

$ mpirun -np 5 -hosts worker,localhost ./cpi
#ホスト名の代わりにIPアドレスでも良いです。

予め用意したホストファイルを使うこともできます。

$ mpirun -np 5 --hostfile mpi_file ./cpi

これでmanagerが接続しているマシンでMPIプログラムが動くはずです!

一般的なエラーやTIPS - Common errors and tips

例を示します。managerには以下のようなhostsが必要になります。

$ cat /etc/hosts
127.0.0.1	localhost
#127.0.1.1	1944

#MPI CLUSTER SETUP
172.50.88.22	manager
172.50.88.56 	worker1
172.50.88.34 	worker2
172.50.88.54	worker3
172.50.88.60 	worker4
172.50.88.46	worker5

このとき、worker3に必要な最低限のhostsは以下の通りです。

$ cat /etc/hosts
127.0.0.1	localhost
#127.0.1.1	1947

#MPI CLUSTER SETUP
172.50.88.22	manager
172.50.88.54	worker3

以下の呼び出しは正常です。

$ mpirun -np 10 --hosts manager ./cpi
# To run the program only on the same manager node

以下の呼び出しは正常です。

$ mpirun -np 10 --hosts manager,worker1,worker2 ./cpi
# To run the program on manager and worker nodes.

ですが次の呼び出しをmanagerから行うことはできません(worker1からなら良いのですが)。

$ mpirun -np 10 --hosts worker1 ./cpi
# Trying to run the program only on remote worker

次は? - So, what’s next?

クラスタが構築できました!わくわくしますか?ついに並列実行できるプログラムを書くための詳細を知る時が来ました。MPI hello world lessonから始めるのが良いです。もしも、Amazon EC2インスタンスを使って同じことを再現したいのであれば、building and running your own cluster on Amazon EC2を見てください。その他のレッスンについては、MPIチュートリアルのページを参照してください。

ローカルクラスタのセットアップで何か問題があれば、遠慮なく以下にコメントしてください。

Want to contribute?

This site is hosted entirely on GitHub. This site is no longer being actively contributed to by the original author (Wes Kendall), but it was placed on GitHub in the hopes that others would write high-quality MPI tutorials. Click here for more information about how you can contribute.