Relionには自分でジョブスケジュールする機能を持ってます。
スタンドアローンで処理したいジョブをスケジュールに登録して、流して帰宅。朝には一連のジョブが終わって次の作業へ。

もし計算機クラスターを持っているサイトなら、そのジョブキューイングシステムに対してジョブを投入する事も可能です。

ここではジョブキューイングシステムOpenPBS(旧名 PBSPro)に対してのジョブ投入方法を記載します
OpenPBS

Standard submission script

Relionでは「Running」タブにある「Standard submission script」に指定されたファイルは、
同じ「Running」タグにある「Number of MPI procs」「Number of threads」「Queue name」らの
パラメータとそのジョブのコマンド行が代入される。

ファイルには決まったフォーマットがあって、ファイル中の
XXXqueueXXXQueue nameの値に
XXXdedicatedXXXMinimum dedicated cores per nodeの値に切り替わり
実行ファイル「run_submit.script」が作られる。
参照:https://www3.mrc-lmb.cam.ac.uk/relion/index.php/Download_%26_install#Set-up_queue_job_submission
そして
「Queue submit command」の値と共に実行される.

[Queue submit command]  run_submit.script &             # 実際には 「qsub run_submit.script &」かな

な感じで


relionのソースコードに付属している「Standard submission script」は「qsub.csh」として用意されている。
中身はこんな感じ

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
#!/bin/tcsh
#$ -pe XXXqueueXXX XXXnodesXXX
#$ -l dedicated=XXXdedicatedXXX
#$ -e XXXerrfileXXX
#$ -o XXXoutfileXXX
#$ -A Relion
#$ -cwd
#$ -S /bin/tcsh
 
mpiexec -mca orte_forward_job_control 1 -n XXXmpinodesXXX  XXXcommandXXX

このフォーマットはSGEかな?当方では難しくて構築できなかったので他のジョブキューイングシステムを検討したら
Relionの本家様で Torque 向けの「Standard submission script」が提示されていた. TorqueとOpenPBSの仕様はほぼ同じなのでこれを採用.
https://www3.mrc-lmb.cam.ac.uk/relion//index.php?title=TORQUE_template_script_example

中身はこんな感じ

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
#!/bin/bash
### Inherit all current environment variables
#PBS -V
### Job name
#PBS -N XXXnameXXX
### Keep Output and Error
#PBS -k eo
### Queue name
#PBS -q XXXqueueXXX
### Specify the number of nodes and thread (ppn) for your job.
#PBS -l nodes=XXXmpinodesXXX:ppn=XXXthreadsXXX
### Tell PBS the anticipated run-time for your job, where walltime=HH:MM:SS
###PBS -l walltime=XXXextra1XXX:00:00
#################################
### Switch to the working directory;
cd $PBS_O_WORKDIR
### Run:
mpirun --bynode -np XXXmpinodesXXX XXXcommandXXX
echo "done"

っがこれは間違いみたい。。。
11行目の部分を下記のように修正すべきかと思う

#PBS -l nodes=XXXmpinodesXXX:ppn=XXXthreadsXXX
 ↓
#PBS -l nodes=XXXnodesXXX:ppn=XXXdedicatedXXX

「nodes」はPBSでは使用する計算機ノード(計算マシン)数を示すのだが、ソースコードから「XXXmpinodesXXX」は
「Number of MPI procs」の値を入れている。これでは4MPIで計算しようと思うと4ノード求められてしまう。

また「ppn」は計算ノード当りのcore数を指定するのだが、1MPI当りのthreads数を示す「XXXthreadsXXX」を当てている。
計算ノードのcore数を示すべきなので「XXXdedicatedXXX」が適切ではと思っている。

修正したnodesの「XXXnodesXXX」は[MPI数]*[threads数]/[XXXdedicatedXXX]の整数値を表している。



っで他mpirunの時のnp+1や標準出力/標準エラーのハンドリングを加えて下記の「qsub.sh」を用意した

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
#!/bin/bash
 
#PBS -N XXXnameXXX
#PBS -q XXXqueueXXX
#PBS -l nodes=XXXnodesXXX:ppn=XXXdedicatedXXX
 
#################################
### Switch to the working directory
cd $PBS_O_WORKDIR
### check run command
cmd_=$(/bin/cat <<_EOF_
XXXcommandXXX
_EOF_
)
cmd=$(echo "$cmd_" | sed -z 's/\n/\&\&/g')
run=$(echo $cmd|awk '{print $1}')
### mpirun option
opt=" --display-map --bind-to none --mca plm_rsh_agent rsh --map-by node "
### Check GPU option
np=XXXmpinodesXXX
localnodefile=1
if [ ${run##*/} =  "relion_refine_mpi" ]; then
   if [[ $cmd = *--gpu* ]]; then
      np=$(expr $np + 1)
      nodeCount=$(wc -l $PBS_NODEFILE|awk '{print $1}')
      if [ $np -gt $nodeCount ]; then
         /bin/cp $PBS_NODEFILE .
         /usr/bin/tail -1 $PBS_NODEFILE >> $(basename $PBS_NODEFILE)
         localnodefile=2
      fi
   fi
fi
### Run
if [ $localnodefile -eq 1 ]; then
 command="{ { mpirun $opt -machinefile $PBS_NODEFILE -np $np ${cmd:0:-2} | tee -a XXXoutfileXXX ; } 3>&2 2>&1 1>&3 | tee -a XXXerrfileXXX ; } 3>&2 2>&1 1>&3"
else
 command="{ { mpirun $opt -machinefile $(basename $PBS_NODEFILE) -np $np ${cmd:0:-2} | tee -a XXXoutfileXXX ; } 3>&2 2>&1 1>&3 | tee -a XXXerrfileXXX ; } 3>&2 2>&1 1>&3"
fi 
eval $command
if [ -f $(basename $PBS_NODEFILE) ]; then
  /bin/rm -f $(basename $PBS_NODEFILE)
fi
echo "done"
  • 9行目: 実行現場へ移動
  • 11-16行目: Relionから発行されるコマンドは2行に渡るときがあるので、それを「&&」で結合
  • 18行目: mpirunのオプション. intel mpiなら「-bootstrap rsh」かな
  • 20-32行目: 実行するコマンドがrelion_refine_mpiでgpuのフラグがあるならnpの数を1つ追加
  • 34-42行目: 流すコマンドを作る. 標準出力と標準エラー表示対応

下記オレンジ部分の標準出力と標準エラーが表示されます
2018y08m03d_211737714.png

使い方

1ノードが16coreで4GPUを搭載していると仮定して、
「Number of MPI procs」は4
「Number ot threads」は4
「Submit to queue」は使いたいqueueの名称。ここでは「gpu」
「Queue submit command」は「qsub」
「Standard submission script」は、「/apps/relion-3.1/bin/qsub.sh」*ファイルの配置場所を指定
「Minimum dedicated cores per node」は、1ノード当りのcore数

2020y02m28d_013644788.png

な感じで。
計算に使用する計算ノードを指定したいのなら
「Queue submit command」欄にて「qsub -l nodes=gpu01:ppn=16」とノード名[gpu01]とppn(process per node:そのノードで使用するcore数)を指定する
もし複数の計算機でジョブを流すなら「qsub -l nodes=gpu01:ppn=16+gpu02:ppn=16」とプラス(+)で繋げる

その際、「Compute」欄の「Which GPUs to use」には要注意。
何も入力しなくても1MPI1GPUで割り当てられる場合もあるが、場合によっては1GPUを2つのMPIプロセスで共有とかあり要注意な個所
「0:0:1:1:2:2:3:3」とかと指定すれば回避できる時はあるけど、、

mpirunのオプションが「--map-by node」であるとき、MPIプロセスはノード毎に1つずつ渡ります。またqsub.shでnpの値が1つ増えるので8+1の9つのMPIが発生したとします。

MPI番号123456789
GPUID00112233
gpu01MasterMPI
refineのmasterはgpuを使わない
Slave(GPU:0)Slave(GPU:1)Slave(GPU:2)Slave(GPU:3)
gpu02Slave(GPU:0)Slave(GPU:1)Slave(GPU:2)Slave(GPU:3)

「Number ot threads」を5とか6で流したい場合。。このqsub.shではエラーになりますね。
queueを使わずにその計算機で流すか、エラーの無い形でqueueを流して、即座にqdelで止めて、「run_submit.script」の「--j」を修正してコマンドラインでqsubを実行するとかでしょうか。


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2020-09-20 (日) 08:39:53 (69d)