计算化学公社

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

[Gaussian/gview] 一键批量提交Gaussian任务至slurm系统高性能计算集群

[复制链接 Copy URL]

2

帖子

1

威望

97

eV
积分
119

Level 2 能力者

本帖最后由 Jacaranda 于 2025-2-16 15:01 编辑

受到帖子“slurm一键批量提交Gaussian任务至超算集群”的启发,菜鸟尝试书写了如本贴所展示的.sh脚本,可以只需使用 sbatch submit.sh 一行命令实现Gaussian任务的批量提交与文件整理。具体说明如下:

  • slurm操作系统,.sh脚本和.gjf文件全部处于同一目录下(推荐为登录时默认目录,否则sbatch、g16等命令可能需要额外的绝对目录),确认每个 .gjf 文件中所写的核、内存数不大于本代码第二个 #!/bin/bash 部分所写的核、内存数
  • 提交后遍历当前文件夹下所有文件,对每个未计算的.gjf文件创建对应的.sh脚本并提交,计算完成后在当前目录创建具有该.gjf文件名的文件夹,将相关文件全部移入其中
  • 在当前目录下创建“Series”文件夹(如已有,则不创建),在其下创建“Series-slurm分配的job id-时间”文件夹,并将本脚本自身产生的.err等文件移入其中,不会移动submit.sh文件,生成.log文件用于记录提交全部任务所需的时间
  • 对于每一个进行的高斯计算(以下称之为项目),项目名称为.gjf文件名(不含拓展名),在具有该项目名称的文件夹下应含有8个文件:①.sh文件:生成的项目运行所需脚本。②.chk、.gjf、.log、.out、.err文件:项目相关文件。③.fchk文件:使用自带formchk功能自.chk文件转换来的文件。④.rlog文件:菜鸟自定义的纯文本文件,记事本可打开,仅用于记录项目名称、job id、起止时间、运行耗时
  • 本 .sh 文件为 unix 格式,且内含将 .gjf 文件转换为 unix 格式代码,无需额外命令

由于菜鸟所使用的HPC平台的要求,或许有多余的语句,同时这是菜鸟初次学习shell语法,标注了相当多的注释,使用notepad++打开则可以看到注释已按照相同缩进整理好,可根据需要增减功能
具体代码如下:
  1. #!/bin/bash
  2. #SBATCH --ntasks-per-node=1
  3. #SBATCH --job-name=Series-%j
  4. #SBATCH --partition=cpu
  5. #SBATCH --nodes=1
  6. #SBATCH --cpus-per-task=1
  7. #SBATCH --mem=4GB
  8. #SBATCH --output=Series-%j.out
  9. #SBATCH --error=Series-%j.err
  10.                                                                    # cpu节点、1核、4G内存(仅用于提交脚本,无需增大)
  11. logfile="/根目录/Series-${SLURM_JOB_ID}.log"
  12.                                                                    # 将“根目录”替换为登陆时的默认目录
  13. echo "Job name is Series, ID is ${SLURM_JOB_ID}." >> "$logfile"
  14. echo "Started at $(date +"%F %A %T %:z")" >> "$logfile"
  15. submitdate=$(date +"%Y%m%d-%H%M%S")
  16. start_time=$(date +%s)
  17.                                                                    # 生成“提交任务”的 .log 文件,并记录提交过程耗时
  18. for gjf_file in *.gjf; do                                    # 遍历当前目录下的所有 .gjf 文件
  19.     job_name="${gjf_file%.gjf}"                          # 获取不带扩展名的文件名,即“高斯计算项目名称”
  20.     log_file="${job_name}.log"                            # 检查是否已存在 .log 文件
  21.     if [ ! -f "$log_file" ]; then                               # 如果不存在对应 .log 文件,则进行项目创建等后续操作
  22.                 log_dir="/根目录"                                         # 将“根目录”替换为登陆时的默认目录
  23.                 mkdir -p "$log_dir"
  24.                 dos2unix "${gjf_file}"                                    # 将 .gjf 文件从 Windows 格式转换为 Linux 格式,请确保所用平台已安装该命令
  25.                 cat > "$job_name.sh" << "EOF"                    # 创建.sh脚本,写入下列内容并执行
  26. #!/bin/bash
  27. #SBATCH --ntasks-per-node=1
  28. #SBATCH --job-name=JOB_NAME_PLACEHOLDER
  29. #SBATCH --partition=cpu
  30. #SBATCH --nodes=1
  31. #SBATCH --cpus-per-task=1
  32. #SBATCH --mem=4GB
  33. #SBATCH --output=JOB_NAME_PLACEHOLDER.out
  34. #SBATCH --error=JOB_NAME_PLACEHOLDER.err
  35.                                                                  # cpu节点、1核、4G内存(用于执行高斯计算项目,根据任务修改)
  36.                                                                                 # JOB_NAME_PLACEHOLDER 是一个占位符,后续会被修改为该项目的实际名称
  37. r_d_logfile="/根目录/JOB_NAME_PLACEHOLDER.rlog"
  38.                                                                  # 创建一个 .rlog 文件,记录该项目的名字、 Linux 系统内 ID,起止时间、耗时,将“根目录”替换为登陆时的默认目录
  39. echo "Job name is $SLURM_JOB_NAME, ID is ${SLURM_JOB_ID}." >> "$r_d_logfile"
  40. echo "Started at $(date +"%F %A %T %:z")" >> "$r_d_logfile"

  41. start_time=$(date +%s)

  42. g16 JOB_NAME_PLACEHOLDER.gjf                # 执行高斯计算
  43. wait                                                           # 确保计算完成
  44. formchk JOB_NAME_PLACEHOLDER.chk        # 把 .chk 文件转换成 .fchk 文件

  45. echo "Completed at $(date +"%F %A %T %:z")" >> "$r_d_logfile"

  46. end_time=$(date +%s)
  47. time_diff=$((end_time - start_time))
  48. hours=$((time_diff / 3600))
  49. minutes=$(((time_diff % 3600) / 60))
  50. seconds=$((time_diff % 60))        
  51. echo "Total runtime: $(printf "%02d:%02d:%02d" $hours $minutes $seconds)" >> "$r_d_logfile"
  52.                                                                  # 计算耗时并写入 .rlog 文件                                                                                
  53. job_name="${SLURM_JOB_NAME}"
  54. base_dir="/根目录"                                     # 将“根目录”替换为登陆时的默认目录
  55. target_dir="${base_dir}/${job_name}"
  56. for file in ./*; do
  57.     [ -f "$file" ] || continue
  58.     file_base="${file##*/}"
  59.     file_prefix="${file_base%.*}"
  60.     if [ "$file_prefix" = "$job_name" ]; then
  61.         mkdir -p "$target_dir"
  62.         mv "$file" "$target_dir/"
  63.     fi                                                               # 在当前目录创建同名文件夹,把该项目相关的文件全部移动至其中
  64. done

  65. EOF
  66.                 sed -i "s/JOB_NAME_PLACEHOLDER/$(printf "%q" "$job_name")/g" "$job_name.sh"
  67.                                                                 # 把占位符 JOB_NAME_PLACEHOLDER 换城正常的项目名称
  68.                 sbatch "$job_name.sh"                               # 提交高斯计算项目
  69.         fi
  70. done
  71. echo "Completed at $(date +"%F %A %T %:z")" >> "$logfile"
  72.                                                                # 在. log 文件中记录项目已全部提交
  73. end_time=$(date +%s)
  74. time_diff=$((end_time - start_time))
  75. hours=$((time_diff / 3600))
  76. minutes=$(((time_diff % 3600) / 60))
  77. seconds=$((time_diff % 60))
  78. echo "Total runtime: $(printf "%02d:%02d:%02d" $hours $minutes $seconds)" >> "$logfile"
  79.                                                                # 在. log 文件中记录提交所有项目所需耗时
  80. series_name="Series-${SLURM_JOB_ID}"
  81. base_dir="/根目录/Series"                         # 将“根目录”替换为登陆时的默认目录
  82. target_dir="${base_dir}/${series_name}-${submitdate}"
  83. for file in ./*; do
  84.     [ -f "$file" ] || continue
  85.     file_base="${file##*/}"
  86.     file_prefix="${file_base%.*}"
  87.     if [ "$file_prefix" = "$series_name" ]; then
  88.         mkdir -p "$target_dir"
  89.         mv "$file" "$target_dir/"
  90.     fi
  91. done
  92.                                                               # 在当前目录创建 Series 文件夹,在其下创建 Series-slurmID-时间 文件夹,把此次提交相关的文件全部移动至其中
复制代码
submit.sh (4.28 KB, 下载次数 Times of downloads: 6)
运行实例:

如有指正,不胜荣幸
致谢:slurm一键批量提交Gaussian任务至超算集群;ChatGPT;计算化学公社

submit.sh

4.28 KB, 下载次数 Times of downloads: 7

评分 Rate

参与人数
Participants 4
威望 +1 eV +10 收起 理由
Reason
Gaussian-Caio + 2 好物!
sobereva + 1
guoguoping199 + 5 牛!
量化小王子 + 3 好物!

查看全部评分 View all ratings

懒惰是第一生产力

227

帖子

6

威望

1716

eV
积分
2063

Level 5 (御坂)

2#
发表于 Post on 2025-2-16 16:18:18 | 只看该作者 Only view this author
不建议使用这种做法,你应该这样做:

将通用的 Slurm 脚本作为基础模板,所有参数从外部传入,这样避免了每个任务都复制一份脚本,减少代码冗余。

基础脚本只需要维护一次,若以后调整资源分配或日志记录方式,只改一个地方就行,批量任务只需关注参数变化。

2

帖子

1

威望

97

eV
积分
119

Level 2 能力者

3#
 楼主 Author| 发表于 Post on 2025-2-17 21:14:44 | 只看该作者 Only view this author
wxyhgk 发表于 2025-2-16 16:18
不建议使用这种做法,你应该这样做:

将通用的 Slurm 脚本作为基础模板,所有参数从外部传入,这样避免 ...

感谢指点,我的主修是实验化学方向,对代码方面不是很熟悉,询问了一下ChatGPT,感觉还需要一些学习时间,我后续琢磨琢磨
懒惰是第一生产力

5

帖子

0

威望

221

eV
积分
226

Level 3 能力者

4#
发表于 Post on 2025-3-7 16:42:48 | 只看该作者 Only view this author
没看懂,slurm不是有job array吗

本版积分规则 Credits rule

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

GMT+8, 2025-8-16 19:00 , Processed in 0.179793 second(s), 25 queries , Gzip On.

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