このステップでは、 マスターホスト以外に実行ホストを作り、そこでジョブを実行できるようにする。

ここでは、 計算機シリーズの名前は Ge シリーズとし、 個々のホスト名は Ge00, Ge01, ... ということにする。

1 1台目, Ge00 を作る。

1.1 Ge00 上でのセットアップ

apt-get install -y gridengine-exec

対話的項目は、Ir でのと同じく、

gridengine-common が同時に入る。 gridengine-client は不要だろう。

ps で /usr/lib/gridengine/sge_execd が起動しているか確認する。 起きていなければ、以下のコマンドで起動する。

/etc/init.d/gridengine-exec start

1.1.1 Trouble: sge_exec が起動していない[2016-07-15]

起動直後にプロセスはいるが、しばらくするとなくなる。 手動で起動しようとしても、数十秒で以下のようにエラー吐いて死ぬ。

ippei@Kr02 % sudo sge_execd
..........................
critical error: abort qmaster registration due to communication errors
daemonize error: child exited before sending daemonize state

今回の原因は、マスターサーバの登録がうまくいっていないからだった。 以下で通った。

  1. Ubuntu ごとクリーンインストール
  2. apt-get install -y gridengine-exec。 4つの対話的設定を正しく答える

1.1.2 その他やってみたこと

apt-get purge
apt-get autoremove
apt-get clean
apt-get instal

なんか、4つくらい項目あるはずなのに1〜2個しかでない。 このやり方では apt-get の設定のキャッシュのクリアがうまくいっていないのだろう。

1.1.2.1 act_qmaster

きちんと稼動しているホストでは /var/lib/gridengine/default/common/act_qmaster というファイルがあり、内容は

Ir.calc.atom

いけてないホストではこれが存在しない。 これを作るとエラーメッセージが変わった。

root@Rh02 # sge_execd
error: can't find connection
error: can't get configuration from qmaster -- backgrounding

また、これでプロセス自体は立ち上がる。 しかし、ジョブが実行されないようだ。

対話的設定なしでも 特定のファイルを書き換えたらいけそうな気もするが、 それを突き止めるのにコストかけるより 毎回対話的設定した方が楽だと思う。

1.2 Ir での登録作業

1.2.1 キューの作成

qconf -aq Ge.q # 新しいキューを作成。

エディタが開くので、以下のように記述。

hostlist              Ge00.calc.atom

FQDN でなくて「Ge00」 のような省略名でも、一度保存して抜けたら 適当に名前解決した名前が自動的に入る。 「Ge00, Ge01」みたいにカンマ区切りにしても空白区切りに直してくれる。

ミスったりした場合には以下で確認・修正する。

1.2.2 実行ホストを登録

qconf -ae Ge00 # 実行ホストとして Ge00 を登録。

ミスったりした場合には以下で確認・修正する。

1.2.3 キューにジョブを投げてみる。

for i in {0..9}; qsub hostname.sh

qstat で見ながら、1分くらい待つ。 うまくいけば、 ~/hostname.sh.e* や ~/hostname.sh.o* といったファイルが生成している筈。

2 2台目

2台目も同様に作る。 ここでは Ge01 というホスト名だとする。 3台目以降は最終的な手順を確立してからにした方が良いだろう。 2 は最小の複数であるため、複数計算機による並列環境のテストとして適当だ。

2.1 Ge01 上でのセットアップ

「Ge00 上でのセットアップ」と同じ。

2.2 Ir での登録作業

「キューの作成」は、既に作成したキューにホストを追加する形になる。 よって、「qconf -aq Ge.q」は不要。 かわりに、

qconf -mq Ge.q

で hostlist に追加する。

hostlist              Ge00.calc.atom Ge01.calc.atom

2.2.1 実行ホストを登録

qconf -ae Ge01

2.2.2 キューにジョブを投げてみる。

for i in {0..9}; qsub hostname.sh

うまくいけば、 Ge00, Ge01 それぞれで適当に実行されて、その名前が返ってきている筈。

2.3 Ge series でコマンド直打ちで vasp を実行できるようにする

qsub ジョブではなくコマンド直打ちで VASP を並列実行できることを確認しておく。

2.4 qsub で Ge series に vasp を投げられるようにする

計算ディレクトリを ~/bench.Hg とする。 cd ~/bench.Hg の後、vi machines で、

Ge00
Ge01

と作成し、 vasp.qsub を作成

#! /bin/sh
#$ -S /bin/sh
#$ -cwd
#$ -o stdout
#$ -e stderr
#$ -q Ge.q
#$ -pe Ge.openmpi 4

MACHINE_FILE="machines"

LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/opt/intel/mkl/lib/intel64:/opt/intel/lib/intel64:/opt/intel/lib:/opt/openmpi-intel/lib
export LD_LIBRARY_PATH

cd $SGE_O_WORKDIR
printenv | sort > printenv.log
cut -d " " -f 1,2 $PE_HOSTFILE | sed 's/ / cpu=/' > $MACHINE_FILE

/opt/openmpi-intel/bin/mpiexec -machinefile machines -np $NSLOTS /opt/bin/vasp5212openmpi

Ge00 でコマンド直打ちでこのスクリプトを起動し、 Ge00 と Ge01 に負荷がかかることを確認する。

/bin/sh ./vasp.qsub

このスクリプトを qsub で投げてみる。 Ir にて、

qsub vasp.qsub

Ir, Ge00, Ge01 のプロセスを確認し、 mpd, vasp の実行状況を確認する。 適宜、qstat でキューの状態を監視する。 終了したら ~/qsub-vasp.o* と ~/qsub-vasp.e* が生成する筈なので確認する。

2.4.1 Trouble: Ge00 と Ge01 にならない。

たとえば Ge08 と Ge00 のようになる。 3台以上作ってしまっていたらそうなりうる。 ある意味正しい動作。 mpdboot で静的に Ge00 と Ge01 に指定しているが、 Grid Engine から1台投げられる先頭のホストは Ge シリーズのどれかになる。 特にオプションで指定しなければ、この先頭のホストは計算に加わる。 2台並列なので、machines から1台、Ge00 を取ってきて、このようになる。 最終的に、Grid Engine から与えられるホストで実行することになるので、 この段階では放置しておいて良い。

2.4.2 Trouble: Ir と Ge00 で実行された。

キューを指定していなかった。 以下の行を忘れずに。

#$ -q Ge.q

2.4.3 Trouble: 「mpiexec_Ge00: cannot connect to local mpd」

qsub-vasp.sh.o* に、以下のようなエラー文があったら、 mpd が起動していない。

mpiexec_Ge00: cannot connect to local mpd (/tmp/mpd2.console_ippei); possible causes:
  1. no mpd is running on this host
  2. an mpd is running but was started without a "console" (-n option)
In case 1, you can start an mpd on this host with:
    mpd &
and you will be able to run jobs just on this host.
For more details on starting mpds on a set of hosts, see
the MPICH2 Installation Guide.

一般ユーザで mpd& して、mpd が動くことを確認する。

3 Ir で実行できないようにする

当研究室のクラスタでは Ir はジョブスケジューリングなどに専念してもらい、 計算機としては使用しない。 テスト用には Ir でジョブ実行できるようにしていたが、 今後は不要なので修正する。

3.1 execution host から削除。

qconf -de Ir
root@Ir.calc.atom removed "Ir.calc.atom" from execution host list

qconf -sel
#=>
Ge00.calc.atom
Ge01.calc.atom

3.2 Ir.q のキューを削除

qconf -dq Ir.q
root@Ir.calc.atom removed "Ir.q" from cluster queue list

qconf -sql
#=> Ge.q