Relionのジョブを TORQUE/PBSPro に投げる際、使用するスクリプトが下記サイトで提示されている。
https://www2.mrc-lmb.cam.ac.uk/relion/index.php?title=TORQUE_template_script_example
オリジナルなqsub.sh

こちらで用意している qsub.sh は、Relion/qsubのコード修正により、使用するノードと各ノード当たりのcoreとthreadを
反映するように修正を加えている。

加え、qsubに投入しても Relion の画面でジョブの標準出力・標準エラーを表示させるように調整している。
2018y08m03d_211737714.png
*オレンジで囲った部分の上側にジョブの標準出力、下側に標準エラーが表示される

qsub.shスクリプト

*Relion/qsubでのコード修正がないと使えない 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
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
#!/bin/bash
#PBS -q XXXqueueXXX
#PBS -l nodes=XXXnodesXXX:ppn=XXXcoresXXX
#PBS -N XXXnameXXX
#
# mpirun
opt=" --display-map --bind-to none --mca plm_rsh_agent rsh --map-by node "
#
cd $PBS_O_WORKDIR
host=$(cat $PBS_NODEFILE | sort -u | tr "\n" " ")
#
if [ -f /Appl/.relion/XXXversionXXX ]; then
   source /Appl/.relion/XXXversionXXX
fi
#
SECONDS=0
cat <<_EOF_>XXXoutfileXXX
----------------------------------------------
start  `date`
----------------------------------------------
 
Queue 名称                       XXXqueueXXX
実行ノード数                     XXXnodesXXX ($host)
  +--プログラム数[MPI procs]     XXXmpinodesXXX
     +-- スレッド数[threads]     XXXthreadsXXX
           (単体ノード使用コア数 XXXcoresXXX)
`printf "*トータル使用コア数( %d x %d ) --> %d\n" XXXnodesXXX XXXcoresXXX XXXsumXXX`
`printf "*MPI総数( %d x %d ) = %d\n" XXXmpinodesXXX XXXnodesXXX XXXmpiprocXXX`
_EOF_
 
# relion-2のGPU対応「relion_refine_mpi」
cmd_=$(/bin/cat <<_EOF_
XXXcommandXXX
_EOF_
)
cmd=$(echo "$cmd_" | sed -z 's/\n/\&\&/g')
run=$(echo $cmd|awk '{print $1}')
 
cat <<_EOF_>>XXXoutfileXXX
 
use relion:
`readlink -f $run`
----------------------------------------------
_EOF_
 
#
# check np plus 1
np=XXXmpiprocXXX
localnodefile=1
if [ ${run##*/} =  "relion_refine_mpi" ]; then
   if [[ $cmd = *--gpu* ]]; then
      np=$(expr $np + 1)
      echo "GPU使用のためnp数を変更しました: XXXmpiprocXXX --> $np" >> XXXoutfileXXX
      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
#
# make command
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
 
cat <<_EOF_>>XXXoutfileXXX
 
run command:
$command
----------------------------------------------
_EOF_
 
eval $command
 
if [ -f $(basename $PBS_NODEFILE) ]; then
  /bin/rm -f $(basename $PBS_NODEFILE)
fi
 
cat <<_EOF_>>XXXoutfileXXX
----------------------------------------------
use relion: `readlink -f $run`
end time: `date '+%y%m%d %H:%M:%S'`  (spend  `printf "%02d:%02d:%02d\n" $(($SECONDS/3600)) $((($SECONDS%3600)/60)) $(($SECONDS%60))`)
----------------------------------------------
done
_EOF_

13行目「/Appl/.relion/XXXversionXXX」のXXXversionXXXは、Relion/qsubのpipeline_jobs.cppでの修正で、
「src/macros.h」に書かれている「RELION_VERSION」を参照させている。

[root@c relion-3.0_beta]# vi src/macros.h
 :
#define MACROS_H
 
#define RELION_VERSION "3.0-beta-2"    <-- これ
 
#include <math.h>
#include <signal.h>
 :
[root@c relion-3.0_beta]#

なので、「/Appl/.relion/3.0-beta-2」を用意して、下記のようにしている

[root@c ~]# vi /Appl/.relion/3.0-beta-2
#
# relion-3.0-beta-2
#  2018.8.4 
#
RELION=/Appl/relion-3.0-beta-2
export PATH=$RELION/bin:/usr/lib64/openmpi/bin:$PATH
export LD_LIBRARY_PATH=$RELION/lib:/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH
export RELION_QSUB_TEMPLATE=$RELION/bin/qsub.sh
export RELION_QUEUE_NAME=s3
export RELION_QUEUE_USE=false
export RELION_CTFFIND_EXECUTABLE=/Appl/ctf/ctffind4.exe
export RELION_MOTIONCOR2_EXECUTABLE=/Appl/local/bin/MotionCor2
export RELION_GCTF_EXECUTABLE=/Appl/Gctf/bin/gctf
export RELION_RESMAP_EXECUTABLE=/Appl/local/bin/ResMap
[root@c ~]#

relionのGUIを呼び出すコマンド「relion3」を/usr/local/binとか/Appl/local/binに配置する

[root@c ~]# vi /Appl/local/bin/relion3
#!/bin/bash
#   relion-3.0-beta-2
#
source /Appl/.relion/3.0-beta-2
relion_maingui "$@"
[root@c ~]#

メモ

33行目でXXXcommandXXXで展開される複数行をキャッチさせ、36行目で「&&」でジョインさせる。ただし末端に「&&」が付く。
50,51行目でrefine_mpiでgpu指定がある場合、
52行目でnpの数を1+に。
ただ、その場合1threads/1mpiだとエラーが起こるので、55行目でnpの数とPBS_NODEFILEの行数を比較。
もしnpの数が、PBS_NODEFILEの行数を上回るなら、PBS_NODEFILEを実行場所にコピーして(56行目)、行末を増やす(57行目)。
64行目でPBS_NODEFILEの指定をpbspro側か、行数を増やしたファイルかを定める。

65, 67行目の実際の実行コマンドを展開させる。「${cmd:0:-2}」で、末尾の「&&」を削る。
77行目のevalでコマンドを実行


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2018-12-17 (月) 00:20:53 (2d)