タグ別アーカイブ: parallella

Parallellaでクラスタリング その6 NFSv4対応

従来の設定のままでも特に問題はないのですが、Parallellaの新しいファームウェアがNFSv4に対応しましたので、ファーム更新のついでに設定し直しました。

まずNFSサーバとなる母艦の設定です。これまでは/etc/exportsでファイルシステムを直接指定していましたが、NFSv4らしく、マウントポイントを/var/exportsの下に集めることにします。キモは/etc/fstabファイルですね。設定したらexportfsコマンドで設定を確認しておきましょう。

# mkdir -p /var/exports/parallella
# chown -R nobody:nogroup /var/exports
# vi /etc/fstab
...
/home/USERNAME/parallella    /var/exports/parallella    none    bind    0    0

# vi /etc/exports
...
/var/exports                   192.168.100.0/24(rw,sync,fsid=0,crossmnt,no_subtree_check)
/var/exports/parallella        192.168.100.0/24(rw,sync,no_subtree_check)

# /etc/init.d/nfs-kernel-server restart
# exportfs
/var/exports    192.168.100.0/24
/var/exports/parallella
                192.168.100.0/24

ここでは書きませんでしたが、/etc/imapd.confの設定, ACLの設定も忘れずに。

続きを読む

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パッケージをインストールする方法に変更しました。

Parallellaでクラスタリング

いわゆるBeowulf型のクラスタをParallellaで構築してみます。と言っても、最新のインストールイメージにデフォルトでOpenMPIがインストールされていますので、これを利用することで簡単にクラスタリングを試すことができます。

ここでは、ハブを介して2台のParallella DesktopをGbEで接続し、DHCPでMACアドレスに対して静的にIPアドレスを割り当てるものとします。片方のParallellaのホスト名をparallella01, もう一台をparallella02とし、parallella01をマスター演算ノードとします。parallella01, 02のホスト名・IPアドレスの紐付けは/etc/hostsあるいはLANのDNS等で引けるようにしておきます。

  1. parallella01でssh-keygenで公開鍵・秘密鍵のペアを生成します
  2. 生成した公開鍵をparallella02にコピーし、~/.ssh/authorized_keysに追加します
  3. parallella01で以下のコマンドを実行します
$ cd parallella-examples/para-para
$ mpirun -np 4 -host parallella01,parallella02 ./hello-mpi.elf
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

あっさりクラスタリングできました。-npオプションの引数は2ノード2コア=4となります。4より大きい値を指定するとNUMA云々でエラーになります。なお、para-paraアプリと同じようなアプリが~/test/mpiにもあります。こちらはアプリを自分でmakeする必要がありますが、基本的な実行方法は同じです。

今回は各ノードに個別に同じバイナリを置きましたが、マスター演算ノード(ここではparallella01)のファイルシステムをNFSでスレーブ演算ノード(ここではparallella02)にマウントさせる、という方法も可です。というか、そちらの方がよりBeowulfっぽいかも。ただ、Parallella標準のlinux kernelはNFSサーバに対応してないっぽいです。

Parallellaのストレージ拡張

ParallellaのイメージをmicroSDに焼くと、100MBのboot領域 (/dev/sdb1)と3.5GBのroot領域 (/dev/sdb2)が作成されます (デバイスファイルのパスは環境に依存しますのでご注意下さい)。gunzipしたイメージファイルがおよそ4GBですので、そんなもんでしょう。しかし16GBのmicroSDにイメージを焼いた場合、残りの12GBはまったく使われない領域として残されます。

この領域を活用する一つの方法は、残りの領域を/dev/sdb3としてパーティションを切ってフォーマットして、マウントしてしまうことです。もう一つの方法は、GParted等のツールでroot領域を拡張することです。今回は後者を行ってみます。

続きを読む