Last-modified:2018/03/29 22:54:25.
ここには、やりたいことからの逆引き的な情報を書く。 各コマンドについての詳細は コマンド。
Ir にログイン。
qsub スクリプトファイルを実行するディレクトリに移動する。 job は qsub コマンドを実行したディレクトリを記録していて、 そのディレクトリで実行しようとする。 ( pwd を実行する qsub スクリプトで確認できる。)
qsub スクリプトファイルを作る。 ジョブを投げられたホストで hostname コマンドを実行する qsub スクリプト hostname.qsub を例とする。
#! /bin/sh
#$ -S /bin/sh # ジョブが渡されるシェルのパス。
#$ -cwd # stdout と stderr 書き出し先を $HOME ではなく $PWD にする。
#$ -o stdout # 標準出力書き出しのファイル名を変更。ここでは「stdout」。
#$ -e stderr # 標準エラー出力書き出しのファイル名を変更。ここでは「stderr」。
#$ -q Ga.q # 投入するキューを指定。
#$ -pe Ga.openmpi 2 # 仕様する並列環境を指定。
hostname # 実行するコマンド
「#$」で始まる行は、qsub で解釈される指令。
qsub スクリプトファイルを qsub に食わせる。 qsub hostname.qsub
成功すれば、 以下のような submitted なメッセージが返る。
Your job 2750 ("hostname.qsub") has been submitted
それ以外のメッセージなら何かエラーがあると思われる。
Your job のあとの数字はジョブ ID。 このジョブ ID は記録しておいた方が良い。 自分でメモを取るのは面倒なので、以下のようにリダイレクトしておくと良い。 qsub hostname.qsub > qsub.log
実行した結果、暫くすると実行されて stdout, stderr ができるはず。 stdout に実行ホスト名が書き込まれ、 stderr が空であれば成功。
なお、-o, -e オプションで指定しなければ、 標準出力等の書き出しは hostname.qsub.o123 や hostname.qsub.e123 といった ファイル名になる。
計算ディレクトリで qsub に食わせるスクリプトを作る。 以下は vasp-Kr.qsub の例。
#! /bin/sh
#$ -S /bin/sh
#$ -cwd
#$ -o stdout
#$ -e stderr
#$ -q Kr.q
#$ -pe Kr.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 4 /opt/bin/vasp5212openmpifast
-pe オプションの 最後の数字は並列するプロセス数。
Ir にログインし、計算ディレクトリに移動し、以下のコマンドで実行できる。
qsub vasp-Kr.qsub
qsub コマンドを実行するときに、出力を qsub.log などといった名前で ファイルにリダイレクトして ジョブ ID を記録しておいた方が便利だろう。 qsub スクリプト内で printenv で書き込むようにしていても、 これはジョブが実行されなければファイル出力されない。
qstat などで稼働状況を確認すること。 計算機が空いていても ジョブを投入してすぐには running にならない事もある。 10秒以上かかることもある。
[2014-05-09] 現時点で、複数台の( -np 4 を越える)計算は grid engine 経由で上手く投げられていない。
環境変数 LD_LIBRARY_PATH は シェルから貰ってくれないようなので、 qsub スクリプト内で指定する。
「printenv | sort > printenv.log」 は、実行時の状況を示す環境変数を printenv.log というファイルに書き込んでいる。
「cut -d " " -f 1,2 $PE_HOSTFILE | sed ‘s/ /:/’ > $MACHINE_FILE」 の行は、mpd に並列計算をさせる計算機リストを作成している。
そのあとは mpd 援用で VASP を実行する手順。 mpdboot を実行したホストも mpd に含まれてしまうので、Ir 上では mpdboot しない。 qsub で投げられた先で mpdboot するように qsub スクリプトに仕込むべき。
PATH を含めた、 普段使っている多くの環境変数がそのままでは使えない。
環境変数 $HOST がなく、代わりに $HOSTNAME がある。
qsub スクリプトで以下のような指定で一応可能。
#$ -q *.q
#$ -pe *.openmpi 4
だが、ジョブサーバである Ir のメモリを滅茶苦茶消費し、 スワップしまくりでまともに稼働しなくなった。 使用しない方針で。
queue は指定できるが、その中でどのホストに投げるかは制御できないみたい。 google, man qsub を見てみたが、 キューの中の特定のホストに投げる方法が見つからない。 これはないんじゃないかなあ。 ジョブスケジューラはホストを 抽象化して扱うようにするための技術だもんな。
-l hostname=Tc08 のようなオプションもネットでは見かけるが、 これが Sun Grid Engine で使えるかは確証がない。 というか、うまく動かない。
待機状態のジョブを取得。
% qstat -s p > tmp.sh
移動元のキューに入って待機状態のジョブを確認することも可能だが、面倒。 それよりは、どのキューに入っていようが全ての待機ジョブを振り直した方が楽。
移動先となる空いているキューを確認。
% qstat -g c
CLUSTER QUEUE CQLOAD USED RES AVAIL TOTAL aoACDS cdsuE
--------------------------------------------------------------------------------
Ag.q 1.00 32 0 0 32 0 4
Cd.q 1.00 28 0 0 32 0 4
Ga.q -NA- 0 0 0 40 0 40
Ge.q 1.00 48 0 0 52 0 4
In.q 0.98 40 0 0 40 0 0
Kr.q 0.49 16 0 16 36 0 4
Pd.q 0.65 24 0 12 64 0 28
Rh.q 0.13 8 0 6 16 0 8
Ru.q 0.00 4 0 48 64 0 16
Se.q -NA- 0 0 0 120 0 120
Sn.q 0.99 12 0 0 20 0 8
Sr.q 0.18 20 0 36 80 0 36
Tc.q 0.59 72 0 0 80 0 40
Ru.q, Rh.q, Sr.q あたりに空きが多い。 AVAIL が空きスロットの数だろう。
自分が今投げているキューを確認。
ippei@Re % qstat -s r [17-02-17 18:03:54] job-ID prior name user state submit/start at queue slots ja-task-ID —————————————————————————————————————– 26053 0.74430 qsub.sh ippei dr 11/22/2016 14:36:28 Rh.q@Rh02.calc.atom 2
32853 0.65927 qsubTc.sh ippei dr 12/07/2016 16:00:29 Tc.q@Tc08.calc.atom 4
40360 0.40737 qsub.sh ippei r 01/26/2017 20:28:17 Rh.q@Rh00.calc.atom 2
41214 0.40774 qsub.sh ippei r 01/29/2017 08:05:21 Sr.q@Sr05.calc.atom 4
41859 0.36858 vaspgeomop ippei r 02/08/2017 19:38:24 Ge.q@Ge05.calc.atom 4
(snip)
Ge.q, In.q, Kr.q, Rh.q, Sn.q, Sr.q, Tc.q に投げられていた。 ここには継続して投げることになる。 先に調べた空きのあるキュー(Ru.q, Rh.q, Sr.q)と併せる。
ジョブを削除して投げ直す必要はない。 ジョブの情報を変更する qalter でいける。 tmp.sh を編集し、以下のようにする。 右端はジョブ ID。 キューごとのジョブ数の配分は適当に。
qalter -q Ge.q -pe Ge.openmpi 4 41921
qalter -q In.q -pe In.openmpi 4 41882
qalter -q Kr.q -pe Kr.openmpi 4 41889
qalter -q Rh.q -pe Rh.openmpi 2 41899
qalter -q Sn.q -pe Sn.openmpi 4 41909
qalter -q Sr.q -pe Sr.openmpi 4 41976
qalter -q Tc.q -pe Tc.openmpi 4 41916
(snip)
% qstat -s h > tmp.sh
で hold 状態のジョブを書き出し、以下のように書き換えてシェルスクリプトを作り、実行。
qrls 41983
qrls 42018
qrls 42019
qrls 42020
qsub するときに jobid をリダイレクトしておいた方が良い。
qsub スクリプトに printenv を仕込んでおけば、 ジョブが実行状態になったら書き出される。 が、待機状態では書き出されない。
qstat でジョブのリストを出し、 その各々を qstat -j JOB_ID で情報を取得し、 「cwd:」の行を抽出する。 ディレクトリから直接対応するジョブをピックアップする方法はないんじゃないかな。 1つのディレクトリから複数のジョブを投入することもありうることだし。
JOB_ID が 2591 だとして、
% qstat -j 2591 | grep cwd:
でも、cwd と計算ディレクトリが一致しているとは限らんな。 qstat などで実行されているホストを確認し、 そこの /var/spool/gridengine/execd/Ga01/job_scripts を見れば一応全て分かる。 が、実行されていないとダメだな。