Last-modified:2018/03/29 22:54:06.
このステップでは、 マスターホスト以外に実行ホストを作り、そこでジョブを実行できるようにする。
ここでは、 計算機シリーズの名前は Ge シリーズとし、 個々のホスト名は Ge00, Ge01, … ということにする。
##Ge00 上でのセットアップ
apt-get install -y gridengine-exec
対話的項目は、Ir でのと同じく、
gridengine-common が同時に入る。 gridengine-client は不要だろう。
ps で /usr/lib/gridengine/sge_execd が起動しているか確認する。 起きていなければ、以下のコマンドで起動する。
/etc/init.d/gridengine-exec start
起動直後にプロセスはいるが、しばらくするとなくなる。 手動で起動しようとしても、数十秒で以下のようにエラー吐いて死ぬ。
ippei@Kr02 % sudo sge_execd
..........................
critical error: abort qmaster registration due to communication errors
daemonize error: child exited before sending daemonize state
今回の原因は、マスターサーバの登録がうまくいっていないからだった。 以下で通った。
apt-get purge
apt-get autoremove
apt-get clean
apt-get instal
なんか、4つくらい項目あるはずなのに1〜2個しかでない。 このやり方では apt-get の設定のキャッシュのクリアがうまくいっていないのだろう。
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
また、これでプロセス自体は立ち上がる。 しかし、ジョブが実行されないようだ。
対話的設定なしでも 特定のファイルを書き換えたらいけそうな気もするが、 それを突き止めるのにコストかけるより 毎回対話的設定した方が楽だと思う。
##Ir での登録作業
qconf -aq Ge.q # 新しいキューを作成。
エディタが開くので、以下のように記述。
hostlist Ge00.calc.atom
FQDN でなくて「Ge00」 のような省略名でも、一度保存して抜けたら 適当に名前解決した名前が自動的に入る。 「Ge00, Ge01」みたいにカンマ区切りにしても空白区切りに直してくれる。
ミスったりした場合には以下で確認・修正する。
qconf -ae Ge00 # 実行ホストとして Ge00 を登録。
ミスったりした場合には以下で確認・修正する。
for i in {0..9}; qsub hostname.sh
qstat で見ながら、1分くらい待つ。 うまくいけば、 ~/hostname.sh.e* や ~/hostname.sh.o* といったファイルが生成している筈。
2台目も同様に作る。 ここでは Ge01 というホスト名だとする。 3台目以降は最終的な手順を確立してからにした方が良いだろう。 2 は最小の複数であるため、複数計算機による並列環境のテストとして適当だ。
「Ge00 上でのセットアップ」と同じ。
「キューの作成」は、既に作成したキューにホストを追加する形になる。 よって、「qconf -aq Ge.q」は不要。 かわりに、
qconf -mq Ge.q
で hostlist に追加する。
hostlist Ge00.calc.atom Ge01.calc.atom
qconf -ae Ge01
for i in {0..9}; qsub hostname.sh
うまくいけば、 Ge00, Ge01 それぞれで適当に実行されて、その名前が返ってきている筈。
qsub ジョブではなくコマンド直打ちで 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* が生成する筈なので確認する。
###Trouble: Ge00 と Ge01 にならない。
たとえば Ge08 と Ge00 のようになる。 3台以上作ってしまっていたらそうなりうる。 ある意味正しい動作。 mpdboot で静的に Ge00 と Ge01 に指定しているが、 Grid Engine から1台投げられる先頭のホストは Ge シリーズのどれかになる。 特にオプションで指定しなければ、この先頭のホストは計算に加わる。 2台並列なので、machines から1台、Ge00 を取ってきて、このようになる。 最終的に、Grid Engine から与えられるホストで実行することになるので、 この段階では放置しておいて良い。
###Trouble: Ir と Ge00 で実行された。
キューを指定していなかった。 以下の行を忘れずに。
#$ -q Ge.q
###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 が動くことを確認する。
当研究室のクラスタでは Ir はジョブスケジューリングなどに専念してもらい、 計算機としては使用しない。 テスト用には Ir でジョブ実行できるようにしていたが、 今後は不要なので修正する。
qconf -de Ir
root@Ir.calc.atom removed "Ir.calc.atom" from execution host list
qconf -sel
#=>
Ge00.calc.atom
Ge01.calc.atom
qconf -dq Ir.q
root@Ir.calc.atom removed "Ir.q" from cluster queue list
qconf -sql
#=> Ge.q