计算化学公社

标题: 分享一个手动自动化提交多个GMX任务的bash脚本 [打印本页]

作者
Author:
laoman    时间: 2023-11-3 23:45
标题: 分享一个手动自动化提交多个GMX任务的bash脚本
本帖最后由 laoman 于 2023-11-4 21:51 编辑

楼主一直都有用一个只允许提交最长24小时任务的超算,这对于长时间的MD模拟来说,不算太友好。SLURM系统有sbatch array的选项可以自动化,但可控制的操作不是太多。于是用bash写了一个。这个脚本的目的是用一个死循环监视squeue队列的任务,任务在跑或者PD的时候就sleep,每隔1个小时查看squeue和ssh到计算节点查看各个任务跑了多少ns。提交12个体系的production任务到3个GPU 计算节点(每个节点有4张MI250X计算卡)。因为文件系统的网络经常卡顿,干脆把任务放到节点的本地硬盘去跑,跑完再copy回NFS的文件夹里。
  1. #!/bin/bash
  2. sub()
  3. {
  4. cat <<_EOF
  5. #!/bin/bash
  6. #SBATCH -A xxxx
  7. #SBATCH -J $1
  8. #SBATCH --nodes=1
  9. #SBATCH --ntasks-per-node=4
  10. #SBATCH -t 24:00:00
  11. #SBATCH -p gpu
  12. #SBATCH -e ${1}.log -o ${1}.log

  13. ml gromacs/2023.2-cpeGNU-22.06-gpu-mpi

  14. systs=(SED_SYST)
  15. workD="\$SLURM_SUBMIT_DIR/.."
  16. export HIP_VISIBLE_DEVICES=0,2,4,6
  17. omp=$2

  18. mkdir /dev/shm/$USER
  19. rm -rf /dev/shm/$USER/*
  20. cd \$workD
  21. cp prod.cpt prod.cpt.bak
  22. for f in \${systs[@]}; do
  23.     mkdir -p /dev/shm/$USER/\$f
  24.     cp -rvf \$f/prod*log \$f/prod*cpt \$f/prod*tpr /dev/shm/$USER/\$f
  25. done
  26. cd /dev/shm/$USER
  27. [[ -z \$(find |grep "\\.cpt") ]] && conti=" " || conti="-cpi prod.cpt -noappend"
  28. echo flag_conti \$conti
  29. _cmd="srun -n 4 -c \$omp gmx_mpi mdrun -deffnm prod \$conti
  30.     -ntomp \$omp -nb gpu -pme gpu -bonded gpu -update gpu
  31.     -s prod -maxh 23.6 -multidir \${systs[@]}"
  32. echo \$_cmd
  33. eval \$_cmd
  34. cp -r * \$workD
  35. _EOF
  36. }

  37. gettid()
  38. {
  39. grep -A1  "Step           Time" $1 |tail -1 |  awk '{printf "%.3fns", $2/1000}'
  40. }

  41. check()
  42. {
  43. ss="S%sm%s_%s"
  44. for lig in F J; do
  45.     for ff in ff19 c36m; do
  46.         syst=$(printf "$ss" $1 $lig $ff)
  47.         if [[ -z $(ls ../$syst/prod*.log 2> /dev/null) ]]; then
  48.             echo 0ns
  49.         else
  50.             curlog=$(ls ../$syst/prod*.log 2> /dev/null|sort -n|tail -1)
  51.             echo "${curlog##*/}@$(gettid $curlog)"
  52.         fi
  53.     done
  54. done
  55. }

  56. ddd() { date '+%Y-%m-%d %H:%M:%S'  
  57. }

  58. cycle()
  59. {
  60. SA="SAmF_c36m  SAmF_ff19  SAmJ_c36m  SAmJ_ff19"
  61. SB="SBmF_c36m  SBmF_ff19  SBmJ_c36m  SBmJ_ff19"
  62. SC="SCmF_c36m  SCmF_ff19  SCmJ_c36m  SCmJ_ff19"
  63. while [[ -z $NoTHiNggg ]]; do
  64.     for f in A B C; do
  65.         parray=($(check $f)) # 4 elements for a system
  66.         if [[ ${parray[0]} == '0ns' ]]; then
  67.             nstate=1
  68.         else
  69.             prelog=$(echo ${parray[0]}|cut -f 1 -d'@')
  70.             if [[ $prelog == 'prod.log' ]]; then
  71.                 nstate=2
  72.             else
  73.                 pstate=$(echo $prelog | sed "s/[a-z]//g; s/\.//g")
  74.                 nstate=$[pstate+1]
  75.             fi
  76.         fi
  77.         pst=$(printf "%04d" $nstate)
  78.         if [[ -z $($HOME/soft/squ 2> /dev/null| grep GPU_S$f) ]]; then
  79.             echo "$(ddd): previous S$f run: ${parray[@]}"
  80.             subarg="GPU_S${f}_part${pst}"
  81.             cmd="sub $subarg 16 | sed "s/SED_SYST/\$S$f/g" > S$f.sh"
  82.             echo "$cmd"
  83.             eval $cmd
  84.             [[ -z $1 ]] && sbatch S${f}.sh
  85.         else
  86.             if [[ -z $($HOME/soft/squ 2> /dev/null| grep GPU_S$f| grep " PD ") ]]; then
  87.                 [[ $(printf "%d" $pst) < 2 ]] && curlog='prod.log' || curlog="prod.part${pst}.log"
  88.                 nid=$($HOME/soft/squ -nl 14 2> /dev/null|grep "GPU_S$f"|awk '{print $NF}')
  89.                 echo "$(ddd): GPU_S$f is still running at $nid, current log: $curlog"
  90.                 ssh $nid "$HOME/soft/get_gmxtime.sh /dev/shm/$USER/S${f}*/$curlog"
  91.             else
  92.                 echo "$(ddd): GPU_S${f}_part${pst} is Pending..."
  93.             fi
  94.         fi
  95.     done
  96.     sleep 1h
  97.     echo
  98. done
  99. }

  100. cycle >& ${0##*/}.log &
  101. echo $! >  ${0##*/}.pid
复制代码

供有需要的同学参考。






欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3