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でコマンドを実行

infinibandカードを持つマシン(ib_ipoibでip通信)で計算すると

Open MPI has detected that there are UD-capable Verbs devices on your
system, but none of them were able to be setup properly.  This may
indicate a problem on this system. 
 
You job will continue, but Open MPI will ignore the "ud" oob component
in this run. 
 
No OpenFabrics connection schemes reported that they were able to be
used on a specific port.  As such, the openib BTL (OpenFabrics
support) will be disabled for this port.

なワーニングが表示されることがある。
この場合は

opt=" --display-map --bind-to none --mca plm_rsh_agent rsh --map-by node "
 ↓
opt=" --display-map --bind-to none --mca plm_rsh_agent rsh --map-by node --mca oob tcp "

と「--mca oob tcp」を追加すれば消えるかと思う.


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2020-05-04 (月) 06:19:24 (25d)