计算化学公社

 找回密码 Forget password
 注册 Register
Views: 850|回复 Reply: 0
打印 Print 上一主题 Last thread 下一主题 Next thread

[任务提交/队列管理] 分享一个手动自动化提交多个GMX任务的bash脚本

[复制链接 Copy URL]

136

帖子

3

威望

4186

eV
积分
4382

Level 6 (一方通行)

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 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
复制代码

供有需要的同学参考。

评分 Rate

参与人数
Participants 1
eV +8 收起 理由
Reason
sobereva + 8

查看全部评分 View all ratings

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-24 00:16 , Processed in 0.166431 second(s), 23 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list