目次 >> AWS >> AWS ParallelClusterへのジョブの投入
qhostでクラスターのノードの立ち上がり状況を見ることができる。
あとは、プログラムを書いて、gcc、g++などでコンパイルし、qsubでジョブを投入する。
この際に
Unable to run job: warning: ec2-user's job is not allowed to run in any queue
と出るかもしれないが、しばらくすると計算ノードが立ち上がり実行される。
計算ノードにスポットインスタンスを使うと立ち上がりが少し遅いようである。今回はジョブの投入から最初の計算ノードが立ち上がるのに10分ほどかかった。
a.outを実行ファイルとする。
まず、a.outのあるディレクトリに下記のようなテキストファイルを作る。ここでは、ファイル名はjobscrpt.shとする。
#!/bin/bash #$ -cwd #$ -o out.log #$ -e err.log ./a.out
#$でオプションを指定する。
-cwdはカレントディレクトリを示す。これをつけないと、ホームディレクトリにすべてのファイルが出力されてしまう。
-oは標準出力(すなわち通常は画面に表示されるもの)を書き込むファイルを指定する。
-eは標準エラー出力を書き込むファイルを指定する。
最後は、実行ファイルである、-cwdが指定されているので、./でよいが、-cwdを指定していない場合はルートディレクトリからフルパスで書く必要がある。
ジョブの投入はqsubコマンドで
$ qsub jobscrpt.sh
のようにする。
ジョブの状況は、
$ qstat
で表示できる。statusがrになっていれば実行中である。qwであれば、キュー内で待機中である。
マルチスレッドのジョブを投入するには-pe smpオプションを使う。
#!/bin/bash #$ -cwd #$ -o out.log #$ -e err.log #$ -pe smp 4 ./a.out
ここれは4スレッドを使うよう指示している。これにより、4つ以上空きのある計算ノードを順次埋めていくことになる。
この-peオプションの詳細は
$ qconf -sp smp pe_name smp slots 999 user_lists NONE xuser_lists NONE start_proc_args NONE stop_proc_args NONE allocation_rule $pe_slots control_slaves TRUE job_is_first_task TRUE urgency_slots min accounting_summary TRUE qsort_args NONE
AWS ParallelClusterのマスターノードにはMPIに関するコマンドなどは既にインストールされているが、デフォルトの状態ではmpic++などは使えない。
MPI関連のコマンドを有効にするにはマスターノードで
$ load_openmpi
と打つ。これでmpic++などを使ってコンパイルできるようになる。ログインするたびに打つ必要があるので、頻繁に使う場合は.bash_profileなどに書いておくとよい。
OpenMPIの環境に関する詳細な情報は
$ ompi_info
コマンドで表示することができる。
MPIを使ったジョブを投入するには、-pe mpiで使用するCPU数を指定する。(SGEで一般的な-pe orteではないので注意)
そして、mpiexecは古パスで記述する。
#!/bin/bash #$ -cwd #$ -o out.log #$ -e err.log #$ -pe mpi 8 /usr/lib64/openmpi/bin/mpiexec -np 8 ./a.out
ここでは、8つのCPUを使用するよう指定している。
mpiexecで-npでも同じ数を指定するのを忘れずに!
この-peオプションの詳細は
$ qconf -sp mpi pe_name mpi slots 99999 user_lists NONE xuser_lists NONE start_proc_args NONE stop_proc_args NONE allocation_rule $fill_up control_slaves TRUE job_is_first_task FALSE urgency_slots min accounting_summary FALSE qsort_args NONE
MPIとOpenMPを併用したジョブを投入するには、-pe makeオプションを指定する。
#!/bin/bash #$ -cwd #$ -o out.log #$ -e err.log #$ -pe mpi 64 /usr/lib64/openmpi/bin/mpiexec --bynode -np 8 ./ucc
こうすると、8つのノードにジョブが投入され、それぞれのノードではOpenMPを使って、マルチスレッドで実行することができる。-pe mpiの後には、トータルでのCPU数を指定(ノード数×各ノードのCPU数)する。なお、この数値が大きい場合、1時間以内に指定のノード数が立ち上がらない場合がある。その場合、最初に立ち上がったノードから削除されていくので永遠に指定ノード数に達しないことになる。その場合は、AWSのAuto Scalingグリープの設定画面で、「希望」数を指定し、手動で立ち上げてやればよい。また、最後の行の--bynodeは各ノードに一つずつ実行することを指定している。この指定がないと、一つのノードに多数(CPU数分)が実行されることになる。
mailコマンドが使えるのでCならばsystem関数を使い、
system("echo "メッセージ" | mail -s testsubject hoge@example.com");
ような形でプログラム終了時にメールを自分あてに送るとよい。
ジョブを削除したい場合は、
qdel ジョブID
で削除する。ジョブIDは複数を一度に指定することもできる。
qstatで見たときに状態がdrになったまま残り続ける時がある
その時は-fをつけてやると、強制削除する。
qdel -f ジョブID
通常は、qdelもしくはそれに-fオプション(強制削除)でジョブを削除することができるが、例えば、スポット価格が上昇して強制的にノードが終了した場合、qdelではジョブを削除できない場合がある。
また、ホストもこの場合リストに残り続ける。
どうしても削除できないジョブを削除するには
/opt/sge/default/spool/qmaster/jobs/00/0000
内のフォルダを消す。
残ってしまったホストは
/opt/sge/default/spool/qmaster/exec_hosts
内の該当するホスト名に対応するファイルを消す。
最終更新日