月別アーカイブ: 2016年1月

github

ここしばらくのParallella関連のコードを整理して、githubに上げておきました。今後、コメントを追加してチュートリアル形式にできればと考えています。

http://github.com/kamagasako/parallella

先日来のEpiphany SDK, OpenMPI, Slurmの組み合わせによる分散・並列処理もうまく動作しましたので、この辺も整理して記事にまとめておきます。

Parallellaでクラスタリング その5 Slurmで実行

前回の記事の最後に、srunコマンドで分散処理を実行してみました。出力を見てみると、4つの演算ノードでプロセス0〜4が生成されてしまっています。これは期待した挙動ではありません。各演算ノードはデュアルコアなのでそれぞれ2つのプロセスが実行され、全体として0〜7の計8つのプロセスとして実行されることを期待しています。

つまり、各プロセスの演算結果をプロセス0で集約できるようにしたい訳です。そうなるよう、srunから直接実行するのではなく、スクリプトを書いてバッチとして実行するようにしてみました。

$ vi slurm.sh
#!/bin/sh
#SBATCH -o slurm.output
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=2
mpirun parallella-examples/para-para/hello-mpi.elf

#SBATCHから始まる行は、sbatchへ渡すオプションとなります。ここでは

  • 標準出力の出力先をslurm.outputファイルへ
  • ノード数は4
  • 各ノードで実行されるタスク数は2

としています。その他のオプションについてはslurmのドキュメントを当たってみて下さい。それでは実行してみましょう。

$ sbatch slurm.sh
$ cat slurm.output 
Hello World from MPI Process 6 on machine parallella04
Hello World from MPI Process 7 on machine parallella04
Hello World from MPI Process 4 on machine parallella03
Hello World from MPI Process 5 on machine parallella03
Hello World from MPI Process 0 on machine parallella01
Hello World from MPI Process 1 on machine parallella01
Hello World from MPI Process 2 on machine parallella02
Hello World from MPI Process 3 on machine parallella02

期待通りの動作になりました 😉

Parallellaでクラスタリング その4 Slurmの導入

前回の記事で3台以上のクラスタリングの構成ができましたが、より高度なリソース管理を行いたいと思います。分散処理のリソースマネージャとしてはTorqueの方が日本語情報が豊富なようですが、ここでは敢えてSlurmを使ってみたいと思います。

まず、管理ノード (兼演算ノード)にするparallella01にmungeをインストールします。インストールできたら/usr/sbin/create-munge-keyを実行してmungedを起動します。

$ sudo apt-get install munge
...
$ sudo /usr/sbin/create-munge-key
...
$ sudo /etc/init.d/munge start
 * Starting MUNGE munged
 ...fail!
munged: Error: Logfile is insecure: group-writable permissions set on "/var/log"

/va/logディレクトリに書き込み権限がないと怒っています。調べてみたところ、mungeのデフォルトオプションを指定してやればよいようです。

$ sudo vi /etc/default/munge
...
OPTIONS="--force"
$ sudo /etc/init.d/munge start
  * Starting MUNGE munged
    ...done.

無事にインストールできました。なお、OPTIONSには --syslog も指定できますが、/var/log以外にも色々と怒られるので --force で逃げるのが無難です。

続きを読む

4 Parallella Cluster

Parallellaでクラスタリング その3 演算ノードの追加

昨年末のクリスマス特価$99 @Amazon.comで買い足したParallella Desktopを演算ノードとしてクラスタに追加しました。作業そのものは既存のノードと同じく

  1. 本家サイトを参考にセットアップ
  2. 日本語化
  3. マスター演算ノードの公開鍵を登録
  4. NFSクライアント設定

だけで追加できます。さっそく動かしてみましょう。

続きを読む

Parallellaでクラスタリング その2 NFSの導入

2016/08/03追記: 新しいファームがNFSv4に対応しましたので、新たに記事を起こしました。こちらのNFSv3対応の記事は参考程度にご覧下さい。

ちょっと前の記事でクラスタリングを組んだことを書きましたが、アプリをコンパイルする度にバイナリを各ノードにコピーするのが面倒になったので、NFSを使ってファイルを共有することにしました。Parallellaのlinux kernelはNFSサーバ非対応なので、母艦をNFSサーバにします。

まず母艦のdebianにnfs-kernel-serverを入れて、設定を行います。USERNAMEは母艦でのユーザ名です。マウントポイント~USERNAME/parallellaは192.168.100.0/24以下からmountできるようにしておきます。

$ sudo apt-get install nfs-kernel-server
...
$ sudo vi /etc/idmapd.conf
...
Domain = ドメイン
...
$ sudo vi /etc/exports
/home/USERNAME/parallella 192.168.100.0/24(rw,sync,fsid=0,crossmnt,no_subtree_check)
$ mkdir parallella
$ systemctl restart nfs-kernel-server

続きを読む

Epiphany SDK + OpenMPI

ParallellaにはEpiphanyが乗っていますので、これを使わない手はありません。OpenMPIでCPU単位での分散を行い、そこからさらにEpiphanyに処理を投げる形になります。

今回は動作確認ということでルーズに行きましょう。~/tests/mpi/hello.cをベースに、手抜きなスケルトンを用意します。

#include <mpi.h>

int main(int argc, char *argv[]) {
  MPI_Init(&argc, &argv);

  // ここにロジックを埋め込む

  MPI_Finalize();
  return 0;
}

ロジック部分は~/epiphany-examples/apps/hello-world/を参考にします。というかコピペします。上記スケルトンのロジック部分に、src/hello_world.cのmain()の中身をそのままコピペです。Epiphanyにロードさせるアプリはsrc/e_hello_world.cをそのまま流用します。

続きを読む

Parallella日本語環境

明けましておめでとうございます。今年もよろしくお願いします。

さて、昨年から引き続きParallellaネタから。インストール直後のParallellaはLANG=C.UTF-8でtimezoneもUTCとなっています。まあこのままでも実害はないと言えばないのですが、折角なので日本語化しておきましょう。

まずは日本語化です。/etc/default/localeでシステム全体を日本語化してもよいのですが、ここではユーザローカルな変更に留めておきます。

$ sudo apt-get install language-pack-ja
...
$ vi ~/.profile
...
export LANG=ja_JP.UTF-8

ここまで済ませたらログアウト→再ログインし、試しにdateコマンドを実行してみて下さい。日本語で出力されると思います。次にtimezoneです。

$ sudo dpkg-reconfigure tzdata

アジア→Tokyoと選択するとJSTになります。再度dateコマンドで確認してみて下さい。これまでUTCだったのがJSTで出力されるようになると思います。

2015/01/01追記: jaファイルを直接編集するのではなく、language-pack-jaパッケージをインストールする方法に変更しました。