読者です 読者をやめる 読者になる 読者になる

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

TSUBAME2.0 ジョブ投入ヘルパースクリプト

ブログタイトルを変更したにもかかわらず、忙しさにかまけてしばらく記事を書いていなかったら,とうとう先日から広告が表示されるようになってしまったので,ブログ下記を再開する次第です.再開していきなり非常に狭い話で申し訳ないのですが,TSUBAME2.0のジョブ投入支援スクリプトを作ったので宣伝です.

https://github.com/keisukefukuda/misc/tree/master/tcpsub

に、コードがおいてありますのでご自由にお使いください.ユーザーの幅せまっ! ユニークユーザーで2000人程度のシステムのさらに狭いスクリプトなんて・・・

TSUBAME2.0とは

ご存知かもしれませんが、TSUBAME2.0は東京工業大学にある、日本で2番目・世界で5番目に高速なスーパーコンピューターです(2011年6月時点)。

ジョブ投入とは

TSUBAMEに限らず,一般にスーパーコンピューターと呼ばれるシステムでは,プログラムを実行したい場合は「ジョブ投入」と呼ばれる作業を行う必要があります。

これは、計算資源を効率的に使うために、プログラムのコンパイルや細かい作業を行うためのログインノードと、本格的な計算を行うための計算ノードが分離されているためです.投入されたジョブは、ジョブスケジューラーによって管理され,計算に割り当てられたノード群で次々と実行されます。ここで、ジョブを投入するためには,

の2種類を考える必要があります.具体的には,

#!/bin/sh
cd ${PBS_O_WORKDIR}

mpirun -n 8 -hostfile ${PBS_NODEFILE} ./a.out

みたいなシェルスクリプトを書いた上で,

t2sub -q S -W group_list=t2g-yourgroup -l select=2:mpiprocs=4  tmp.sh

みたいなコマンドを実行する必要があります.ここで、 シェルスクリプト中の "-n 8" と、 コマンドラインの "select=2:mpiprocs=4" は、それぞれ並列で走らせるプロセス数を指定していますが,これは両者でつじつまがあっていなければなりません(それくらい自動で計算してくれよ!)。ジョブとして実行されるコマンドは,基本的に引数なしで実行できるものでなければならないし、mpirun等の呼び出しも行われないので,そこら辺を考えて記述する必要があります.さらに、実行条件が違う場合は、それぞれシェルスクリプトを用意する必要があります.ジョブを投入しても、実際にジョブが走り始めるまではシェルスクリプトの内容を変更することはできないからです。

実行例(MPI編)

というわけで、このように面倒な作業をコマンドライン一発でやるためのスクリプトが表題のものです。具体的には、

tcpsub -q S -g t2g-yourgroup -n 4x2 -- ./a.out

で済みます。細かいオプションを指定し出すと長くなりますが、ノード数を変化させながらfor文で連続投入等の使い方をすると、我ながら感動的に便利です。"--"は、tcpsubへのオプションと、実行されるプログラムへのオプションを区切るために使用します。また、現在の環境変数を検出して、コンパイル環境を自動的に変更します(Intel+OpenMPI, PGI+MVAPICH等)。

いきなりジョブ投入されるのが怖い場合は(うん、気持ちはわかります)、--dryオプションを付けることで、シェルスクリプトコマンドラインの構築だけを行って、実際には投入しない、という事も可能です。出力されたテキストを自分でスクリプトに保存してコマンドラインをコピペして実行すればいいわけです。つまり、簡易シェルスクリプトジェネレータとしても使えるわけですね。上記の例で言えば、

$ tcpsub --dry -g t2g-yourgroup -n 4x2 -- ./a.out
*** Warning: No such t2-group or you don't belong to 't2g-yourgroup'
#!/bin/sh
#----------------------------------------------
# Generated by tcpsub at 2011-06-21 22:06:42.310242
# in directory /home0/usr1/********/misc/tcpsub
# t2sub -q S -W group_list=t2g-yourgroup -l select=2:mpiprocs=4:ncpus=4 /home/usr1/********/.tcpsub/110621220642_690.sh
# /home/usr1/********/.tcpsub/110621220642_690.sh
cd ${PBS_O_WORKDIR}

export PATH=/usr/apps/openmpi/1.4.2/intel/bin:$PATH
export LD_LIBRARY_PATH=/usr/apps/openmpi/1.4.2/intel/lib:$LD_LIBRARY_PATH

mpirun -n 8 -hostfile ${PBS_NODEFILE} ./a.out

#----------------------------------------------

というような具合になります。ここでは、t2g-yourgroupという架空のグループ名を使っているので、「そんなグループあらへんで!」と警告が出されていますが(至れり尽くせりですね!)、サンプルなので気にしないことにします。

ちなみに、******** となっている部分は、僕の学籍番号です(汗

実行例(OpenMP+MPIハイブリッド編)

さて、もっと複雑な例を行ってみましょう。MPIとOpenMPのハイブリッド実行です。

$ tcpsub --dry -g t2g-yourgroup -n 6x2x8 -- ./a.out --some --option --to your prog
*** Warning: No such t2-group or you don't belong to 't2g-yourgroup'
#!/bin/sh
#----------------------------------------------
# Generated by tcpsub at 2011-06-21 22:10:51.859896
# in directory /home0/usr1/********/misc/tcpsub
# t2sub -q S -W group_list=t2g-yourgroup -l select=8:mpiprocs=2:ncpus=12 /home/usr1/********/.tcpsub/110621221051_180.sh
# /home/usr1/********/.tcpsub/110621221051_180.sh
cd ${PBS_O_WORKDIR}

export OMP_NUM_THREADS=6

export PATH=/usr/apps/openmpi/1.4.2/intel/bin:$PATH
export LD_LIBRARY_PATH=/usr/apps/openmpi/1.4.2/intel/lib:$LD_LIBRARY_PATH

mpirun -n 16 -hostfile ${PBS_NODEFILE} ./a.out --some --option --to your prog

#----------------------------------------------

だいぶ簡単になっていますよね?これを手で打つのに比べれば。

まとめと今後の拡張

特に、我々のような並列計算自体を研究しているような人間は,並列プロセス数を変化させて同じプログラムを実行するなんてことをよくやります。挙句の果てに,プロセス数だけが違うシェルスクリプトを生成するスクリプトを書いて・・・なんてことになります。

なお、このジョブ投入のお作法というのは、メーカーによって若干違います.東工大TSUBAME2.0の場合はメーカーがNEC/HPで、PBS WorksのPBSを拡張したものになっています(たぶん)。

というわけで、そこらへんを自動化したいな〜と思わなければ嘘です。僕は中の人ではないですが、中途半端に片足を突っ込んでいるような微妙なポジションにいるので,まぁ僕が書こうかなぁという感じです。というわけで、需要があれば使ってやってください.まだコマンドライン引き数とかが固まりきってないので、変更する可能性がありますが・・・

今後ですが、とりあえず

  • バグ取り
  • numactlの適用を自動で
  • 商用アプリの設定等の自動化
  • Sun Grid Engineへの対応

などをやりたいなーと思っています。

【広告】