CALYPSO 软件 是一款结构预测软件,会调用VASP 来进行结构的计算。
感谢用户 ac_hpstar_xdong_3 提供帐号和算例进行测试和答疑
软件的基本工作模式
通过脚本 caly.sh 调用 主程序 calypso.x 会自动生成 vasp 的算例 , 然后通过 submit.sh 脚本调用 vasp 计算任务 。
在 VASP 计算进行到一段程度后 , 主程序 calypso.x 会退出 submit.sh 并开始下一个 submit.sh .
即, calypso.x 会一直存在(直到达成条件退出?) , 而 vasp 会被 submit.sh 不断调用,但同时应该只有一个是正常的。
简单的调用及其问题
caly.sh 如下 :
#!/bin/bash
./calypso.x >cly.log 2>&1
显而易见, 在TH-2 上,一个简单的submit.sh 可以这样写:
#!/bin/sh
yhrun -n 23 vasp > vasp.log
但是用户在实际运算过程中会发现问题:
当SLURM 阻塞时,会导致 calypso.x 退出 submit.sh 时无法关闭原来的作业(表现为 VASP 进程无法退出) 和/或 提交新的 submit.sh yhrun 创建作业步失败 。
这个问题内部的原因是 :
SLURM 会对用户的作业进行监管, 监管过程涉及 计算节点上的 slurmd 和 SLURM 管理节点之间的通信。如果遇到管理节点通信阻塞,作业步的创建和退出就可能会出现问题。
本来管理节点是很少阻塞的,但是目前系统负载率比较高了,还是比较容易发生SLURM 管理节点繁忙的情况的,而 calypso.x 又会频繁的进行作业的创建,如果遇到了SLURM 繁忙,则由于创建不成功导致循环创建,进而导致SLURM 的 拥堵更甚。
slurm 对作业步的管理我们可以通过 yhacct 来进行查看 :
[ac_hpstar_xdong_3@cn4218%tianhe2-C ~]$ yhacct -j 128806 | tail
128806.492 vasp ac_hpstar+ 23 COMPLETED 0:0
128806.493 vasp ac_hpstar+ 23 COMPLETED 0:0
128806.494 vasp ac_hpstar+ 23 CANCELLED+ 0:9
128806.495 vasp ac_hpstar+ 23 COMPLETED 0:0
128806.496 vasp ac_hpstar+ 23 COMPLETED 0:0
128806.497 vasp ac_hpstar+ 23 COMPLETED 0:0
128806.498 vasp ac_hpstar+ 23 COMPLETED 0:0
128806.499 vasp ac_hpstar+ 23 COMPLETED 0:0
128806.500 vasp ac_hpstar+ 23 COMPLETED 0:0
128806.501 vasp ac_hpstar+ 23 RUNNING 0:0
可以看到目前calypso.x 已经创建了501个作业步 ,而其中 128806.494 是被 calypso.x 退出的。
解决办法
而实际上,SLURM 对作业步的监管对于大部分应用来说并无必要。针对此应用,可以通过此方法来避开 SLURM 的监管,避免 SLURM 堵塞对计算的影响:
新的submit.sh :
#!/bin/sh
# 更换 yhrun 为 MPIRUN
mpirun -np 23 vasp >> log.vasp
在提交前需要 “source /WORK/app/osenv/ln1/set2.sh” 不然会 "mpirun : command not found"
但只是这样还不够,会发现依然有作业步的创建 (可以用yhacct 查看),因为 mpirun 在编译时整合了作业步的管理功能。
经测试,在运行前将SLURM_* 环境变量清理掉即可取消mpirun 对 作业步的管理,那么我们还需要修改下 caly.sh :
#!/bin/bash
unset SLURM_CHECKPOINT_IMAGE_DIR SLURM_NODELIST SLURM_JOB_NAME SLURMD_NODENAME SLURM_TOPOLOGY_ADDR SLURM_PRIO_PROCESS SLURM_NODE_ALIASES SLURM_TOPOLOGY_ADDR_PATTERN
unset SLURM_NNODES SLURM_JOBID SLURM_TASKS_PER_NODE SLURM_JOB_ID SLURM_STEP_KILLED_MSG_NODE_ID SLURM_NODEID SLURM_SUBMIT_DIR SLURM_TASK_PID SLURM_CPUS_ON_NODE
unset SLURM_DISTRIBUTION SLURM_PROCID SLURM_JOB_NODELIST SLURM_EXCLUSIVE
unset SLURM_LOCALID SLURM_JOB_CPUS_PER_NODE SLURM_GTIDS SLURM_SUBMIT_HOST SLURM_JOB_NUM_NODES SLURM_SRUN_REDUCE_TASK_EXIT_MSG
./calypso.x >cly.log 2>&1
测试发现 “source /WORK/app/osenv/ln1/set2.sh” 带来的 mpirun 有问题 ,目前推荐通过 "module load MPI/Intel/IMPI/5.0.2.044" 来加载 Intel 的 mpirun ,这样其实 caly.sh 就不用改了。
更通用的方案
上面的脚本只适用于单节点作业计算的情况,如果算例较为复杂,需要更多的节点来进行VASP 的计算,可参考如下脚本:
caly.sh
#!/bin/bash
yhrun -N $SLURM_NNODES -n $SLURM_NNODES hostname > hostfile
echo ${HOSTNAME}:24 > hostfiles
grep ^${HOSTNAME}$ hostfile -v | awk '{ print $1":23" }' >> hostfiles
export CORES_SUM=`awk -F ':' '{sum+=$2}END{print sum}' hostfiles`
./calypso.x >cly.log 2>&1
submit.sh :
#!/bin/sh
mpirun -f hostfiles -np $CORES_SUM vasp >> log.vasp
其他
本来是打算用高通量作业提交器 THHT 来解决这个问题的,但发现 CALYPSO 需要主动退出作业,而目前软件之前的设计没考虑这种问题,导致无法简单的实现此功能(可以提交但无法立即断开),就暂时不提供此方案了,后面的重新设计上会考虑这个问题。
- 其他类似的频繁提交式任务也可以参考此文档
- 欢迎讨论