Relionでqsubを使いたい

こちらではRelionのソースコードをちょいと書き換えて

  • 使用するノード数
  • 使用するノードあたりのMPI数
  • 使用するMPIあたりのthreads数

でqsubを発行するような変更を行っている. 参照Relion/qsub

っが一方でそもそもソースコードを修正することなく、そのまま使った場合の説明も必要かかなと思いここにそれを描いてみる。

Relionの本家様では
https://www3.mrc-lmb.cam.ac.uk/relion//index.php?title=TORQUE_template_script_exampleから
下記のようなqsub.shを提案している

  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]の整数値を表している。

下記はqueue名[gpu]と割り当てられている16coreを有する計算機で計算しようとしていて、
4つのMPI、1MPI当りのthreads数は4としています。これなら「Minium dedicated core per node」を超えないので
1つの計算機内で計算が行われます。

もし5つのMPIで、1MPI当りのthreads数が4なら、20coreが必要となり「Minium dedicated core per node」を超えるので
もう一台計算機がqueue名[gpu]から選ばれます。
*この辺はqueueの構成と慎重に検討する必要がありますね

2020y02m28d_013644788.png

注意
Class2D,Class3D,refineらの計算を効率よくGPUで実行するには、「MPIを一つ追加」してジョブを流す必要があります。

例えば、4MPI、1MPI当り4threadsで流すには16coreが必要なのですが、「MPIを一つ追加」で5MPI/4threadsで20coreを
要求する事になります。20coreあるマシンがあればそれはそれでいいのですが、「MPIを一つ追加」となるMPIプロセスは
正直あんまり負荷の掛かった仕事はしない。

jobを通すためには必要なんだけど、正直微妙。

それを調整したのが下の「qsub.sh」です。
qsubを通るために必要な分だけ申請して、通ったらあとで「MPIを一つ追加」を行わせたものです。

qsub.sh

上記のqsub.shのままで十分なのですが、上記を使うと下記オレンジ部分の標準出力と標準エラーが表示されない。
2018y08m03d_211737714.png

できればjobをqsubに流しても進捗は確認できるようにしたいものである。
っで、それを有効にするために下記を提案してみる
*relion_refine_mpiにてGPUを使った計算なら自動的にnpを+1にしています。

#!/bin/bash
 
#PBS -N XXXnameXXX
#PBS -q XXXqueueXXX
#PBS -l nodes=XXXnodesXXX:ppn=XXXdedicatedXXX
 
#################################
### Switch to the working directory;
cd $PBS_O_WORKDIR
### Run:
cmd_=$(/bin/cat <<_EOF_
XXXcommandXXX
_EOF_
)
cmd=$(echo "$cmd_" | sed -z 's/\n/\&\&/g')
run=$(echo $cmd|awk '{print $1}')
np=XXXmpinodesXXX
localnodefile=1
opt=" --display-map --bind-to none --mca plm_rsh_agent rsh --map-by node "
 
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
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"

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2020-03-01 (日) 00:35:18 (89d)