计算化学公社

标题: 批量提交Gaussian任务至pbs队列的脚本 [打印本页]

作者
Author:
tiandikuoyuan    时间: 2021-3-20 09:13
标题: 批量提交Gaussian任务至pbs队列的脚本
最近尝试使用PBS作业管理系统对Gaussian作业进行排队管理,参考论坛的一些脚本,尝试写了个批量提交Gaussian任务的脚本,单节点任务提交没有问题。
  1. #!/bin/bash
  2. cat > pbs.sh << EOF
  3. #PBS -N Gaussian
  4. #PBS -o job.log
  5. #PBS -e err.log
  6. #PBS -l nodes=1:ppn=12
  7. #PBS -l mem=24000mb
  8. #PBS -q normal
  9. #PBS -j oe
  10. cd \$PBS_O_WORKDIR
  11. INPUT_NAME=1       ##这里输入文件名,不含拓展名##
  12. g09 \$INPUT_NAME.gjf
  13. wait
  14. formchk \$INPUT_NAME.chk
  15. EOF
  16. for inf in *.gjf
  17. do
  18. name="INPUT_NAME="${inf%.*}
  19. sed -i -r "s/(INPUT_NAME=)[^#]*/$name    /" pbs.sh
  20. qsub pbs.sh
  21. echo ${inf} has been submitted
  22. done
复制代码
(, 下载次数 Times of downloads: 126)





作者
Author:
abin    时间: 2021-3-20 09:30
本帖最后由 abin 于 2021-3-20 09:34 编辑

我机器上也有一个。

输入文件堆进去,
bash run-me.sh
就搞定了。
啥都不需要修改。

会问一下, 当前目录中只有输入,
没有之前的输出吗?

%mem
%cpu
都不用写。
思路和你类似的。
不过用了一个basename 而已。

用一下子提交数百个计算之类的。

作者
Author:
tiandikuoyuan    时间: 2021-3-20 09:43
abin 发表于 2021-3-20 09:30
我机器上也有一个。

输入文件堆进去,

个人会把不同的计算内容是放在不同的文件夹中,因此不会判断当前文件夹中的gjf文件是否已经被计算过,其实也可以添加一个判断条件;
%mem%cpu我是依据Gaussian安装文件夹中的Default.Route来设置的,不需要在gjf里面添加,其实也不需要在pbs里面设置;
同时提交数百个计算只能在集群上了,单机那得算到什么时候。
作者
Author:
心向暖阳    时间: 2021-3-20 09:56
abin 发表于 2021-3-20 09:30
我机器上也有一个。

输入文件堆进去,

请问一下 我们集群的pbs系统有个节点坏了 比如说是node2
在pbs脚本中可以怎么指定将任务不投到node2上面呢
作者
Author:
abin    时间: 2021-3-20 12:29
心向暖阳 发表于 2021-3-20 09:56
请问一下 我们集群的pbs系统有个节点坏了 比如说是node2
在pbs脚本中可以怎么指定将任务不投到node2上面 ...

节点故障,
系统就不会派任务呀。

手动屏蔽某个节点,
每个调度系统,语法不同。
作者
Author:
心向暖阳    时间: 2021-3-20 17:13
abin 发表于 2021-3-20 12:29
节点故障,
系统就不会派任务呀。

这个节点只是不能算高斯,其他都能用,所以一直没修过~~~
PBS的系统呢
作者
Author:
abin    时间: 2021-3-20 20:04
心向暖阳 发表于 2021-3-20 17:13
这个节点只是不能算高斯,其他都能用,所以一直没修过~~~
PBS的系统呢

我也是翻手册,
你自己翻吧。
作者
Author:
心向暖阳    时间: 2021-3-21 10:10
abin 发表于 2021-3-20 20:04
我也是翻手册,
你自己翻吧。

好的 谢谢您
作者
Author:
123qwertybobo    时间: 2021-3-23 22:29
你这样会有一个问题,如果有一个输入文件是错误的,你还能敲么?所以要加一个判断,对应名字的log是否存在。若无,则提交。否则pass。你既然用了for inf in *.gjf,inf变量里就是你想要的,再输入名字多此一举。另外,可以搞一个sub命令,然后给单独的gjf添加执行文件。
作者
Author:
tiandikuoyuan    时间: 2021-3-24 08:26
本帖最后由 tiandikuoyuan 于 2021-3-24 08:44 编辑
123qwertybobo 发表于 2021-3-23 22:29
你这样会有一个问题,如果有一个输入文件是错误的,你还能敲么?所以要加一个判断,对应名字的log是否存在 ...

变量名称里面包含了后缀,chk文件转换时有些不方便,因此单独生成了一个变量;后来重新写了判断语句,包括是否提交成功、文件是否已经计算过、计算完成,这些信息会自动写入到log文件。我个人现在是把脚本路径写入到环境变量,这样可以无论在哪个文件夹只要输入脚本名称就可以自动提交任务,不需要每次都复制脚本,并且保存了log信息,包含了时间和文件具体位置。
  1. #!/bin/bash
  2. for inf in *.gjf
  3. do
  4. cat > pbs.sh << "EOF"
  5. #PBS -N Gaussian
  6. #PBS -l nodes=1:ppn=12
  7. #PBS -l mem=24000mb
  8. #PBS -q normal
  9. #PBS -j oe
  10. cd $PBS_O_WORKDIR
  11. INPUT_NAME=1       ##这里输入文件名,不含拓展名##
  12. g09 $INPUT_NAME.gjf
  13. wait
  14. formchk $INPUT_NAME.chk
  15. echo `date +"%Y-%m-%d %H:%M:%S"` job has been completed! >> /home/gaussian/pbs.log
  16. EOF
  17. path=$(cd "$(dirname "$inf")";pwd)
  18. if [ ! -f ${inf//gjf/log} ];  ##判断gjf文件是否存在对应的log文件
  19. then
  20. name="INPUT_NAME="${inf%.*}
  21. filename="$path/$inf"
  22. sed -i -r "s/(INPUT_NAME=)[^#]*/$name    /" pbs.sh
  23. sed -i -r "s?job?$filename?" pbs.sh   ##替换pbs.sh中文件路径
  24. qsub pbs.sh
  25. echo `date +"%Y-%m-%d %H:%M:%S"` ${path}/${inf} has been submitted! >> /home/gaussian/pbs.log
  26. else
  27. echo `date +"%Y-%m-%d %H:%M:%S"` ${path}/${inf} has been calculated! >> /home/gaussian/pbs.log
  28. fi
  29. done
  30. rm -f pbs.sh
复制代码







作者
Author:
123qwertybobo    时间: 2021-3-24 22:04
tiandikuoyuan 发表于 2021-3-24 08:26
变量名称里面包含了后缀,chk文件转换时有些不方便,因此单独生成了一个变量;后来重新写了判断语句,包 ...

如果你知道“${inf%.gjf}”的话,那么可以简化你的shell。且看我的sh。
#!bin/bash
for inf in *.gjf
do
echo -e "#PBS -N Gaussian\n#PBS -l nodes=1:ppn=12\n#PBS -l mem=24000mb\n#PBS -q normal\n#PBS -j oe\ng09 ${inf}\nwait\nformchk ${inf%.gjf}.chk" >> ${inf%.gjf}.pbs
done
作者
Author:
Zhuoran    时间: 2021-10-30 23:39
请问如果PBS请求核心数与Gaussian 输入文件请求的核心数不一致,是以PBS的为准吗?
比如
#PBS -l nodes=1:ppn=12
gjf里面%nprocshared=20

作者
Author:
Zhuoran    时间: 2021-10-30 23:45
Zhuoran 发表于 2021-10-30 23:39
请问如果PBS请求核心数与Gaussian 输入文件请求的核心数不一致,是以PBS的为准吗?
比如
#PBS -l nodes=1 ...

比如我pbs请求两个8核任务(gjf内部写的请求13核),我提交之后pestat下面显示的是两个8核的任务,

| node        |  state  |  ncpu  |  ngpu  |  mem  |  tasks  |  jobid/user:task  |
+-------------+---------+--------+--------+-------+---------|-------------------+
| mgr         |   free  |   112  |    0   | 376Gb |     16  |        33/test:8        34/test:8

但是top里面显示的就是两个1300%的CPU任务。
用PBS请求资源一般应当怎么管理?

作者
Author:
abin    时间: 2021-10-31 00:12
Zhuoran 发表于 2021-10-30 23:45
比如我pbs请求两个8核任务(gjf内部写的请求13核),我提交之后pestat下面显示的是两个8核的任务,

|  ...

未开启/未支援cgroup限定,
这种调度系统形同虚设.

工作正常的调度系统是,
申请了4个CPU,
写4个MPI进程, 看到4个进程, 各100%;
写8个MPI进程, 看到8个进程, 各50%.

在正常的调度系统下, 用户实际进程数量和PBS限定不一致的时候,
用户只能在系统分派的资源上, 祸害自己,
不会殃及其他用户.

作者
Author:
Zhuoran    时间: 2021-10-31 15:42
abin 发表于 2021-10-31 00:12
未开启/未支援cgroup限定,
这种调度系统形同虚设.

不好意思请问大神能否指点一下怎么操作这个?我在网上查的云里雾里。我看到我的cproup状态是

[root@mgr]# cat /boot/config-3.10.0-957.el7.x86_64 | grep CGROUP
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y

是要创建一个组之类的东西吗?
作者
Author:
abin    时间: 2021-10-31 16:18
调度器要支持……
不是你这样玩的。
作者
Author:
Zhuoran    时间: 2021-10-31 18:15
abin 发表于 2021-10-31 16:18
调度器要支持……
不是你这样玩的。

谢谢,我再研究一下。
作者
Author:
TYCHEN    时间: 2023-7-19 10:06
Zhuoran 发表于 2021-10-31 15:42
不好意思请问大神能否指点一下怎么操作这个?我在网上查的云里雾里。我看到我的cproup状态是

[root@mg ...

咋搞




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