いわて駐在研究日誌2。

NEVER STAND BEHIND ME

Dakotaの並列計算機能について(その4)

ちょっと時間が開いてしまった。

4ノードの「なんちゃってクラスタ」でdakota+OF並列計算したいときのやり方をまとめておく。

クラスタでの利用にはいくつか(計算したい内容に応じて)方法があるが、ここでは、

  • 個々の目的関数の評価はOpenFOAMの並列計算結果を用いる(したがって1個1個の目的関数の評価は計算負荷が大きい)
  • OFの計算は1個1個のノード内で実行する
  • とくにTorqueやSLURMなどのリソースマネージャー(job scheduler)は利用しない

という条件で考える。

①dakotaの設定(dakota input file)

dakotaのプロセス自体はserialで実行し、evaluation_concurrencyを実行したいノード数に合わせる。

ポイントは   local_evaluation_scheduling staticで、この設定により例えばjob 2の次はjob 6、job10、.....という風にjobの順番が固定で回ってくるようにできる。

[snip]

interface,  
###############
  fork
    asynchronous
    evaluation_concurrency = 4
    local_evaluation_scheduling static

[snip]

②dakotaの設定(OFのドライバーファイルrun_openfoam.sh)

OFのジョブを起動するためのドライバスクリプト中で(shスクリプト)、どのjobがどのノードにmpirunで投入されるかを決める。こんな感じです。

 

# Cuurent Job number
num=$(pwd | awk -F. '{print $NF}')     ←workdir名からjob番号を取得
#echo $num
# Dakota concurrency (be same setting in dakota input file)
CONCURRENCY=4
# Num. of Procs per node
PPN=4
# number of processors per application job
APPLIC_PROCS=4
# relative node on which the job should schedule (floor)
# this is the first of the node block for this job
relative_node=$*1 ←剰余演算でjob番号と、OFで利用するcore数などからホスト番号を計算
#echo $relative_node
# build a node list ←ホスト番号からノード名を設定
if   [ $relative_node -eq 0 ]; then  
   node_list="ensis10"
elif [ $relative_node -eq 1 ]; then  
   node_list="ensis12"
elif [ $relative_node -eq 2 ]; then   
   node_list="ensis13"
else
   node_list="ensis14"
fi
echo "Evaluation on" $node_list
#for node_increment in `seq 1 $*2`; do
#  node_list="$node_list,+n$*3"
#done


./Allrun $node_list $APPLIC_PROCS ←OFの起動スクリプトにノード名とcore数を引き渡す

※ OpenMPIのrelative host indexingの機能を使えば、ノード名を設定しなくてもよさそうだが、なぜかうまくいかないので力技で指定しています。

→OpenMPIのMLに投げたところどうもバグらしい。OpenMPI2.0になるまで待てということらしい。

※ Allrunもちゃんと書き換えて、sHMとかも投入ノードで実行するようにしたほうがよさそうです。今は、master兼computeノード(具体的にはensis10)で実行してしまってるので...。

※ mpirunはsshで実行できるようにしてあります。ここらへんの設定は前にも書きました。

*1: (num - 1) % CONCURRENCY * APPLIC_PROCS / PPN

*2:applic_nodes - 1

*3:relative_node + node_increment