计算化学公社

标题: 一键批量提交Gaussian任务至slurm系统高性能计算集群 [打印本页]

作者
Author:
Jacaranda    时间: 2025-2-15 17:54
标题: 一键批量提交Gaussian任务至slurm系统高性能计算集群
本帖最后由 Jacaranda 于 2025-2-16 15:01 编辑

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


由于菜鸟所使用的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-时间 文件夹,把此次提交相关的文件全部移动至其中
复制代码
(, 下载次数 Times of downloads: 6)
运行实例:
(, 下载次数 Times of downloads: 32)
如有指正,不胜荣幸
致谢:slurm一键批量提交Gaussian任务至超算集群;ChatGPT;计算化学公社


作者
Author:
wxyhgk    时间: 2025-2-16 16:18
不建议使用这种做法,你应该这样做:

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

基础脚本只需要维护一次,若以后调整资源分配或日志记录方式,只改一个地方就行,批量任务只需关注参数变化。
作者
Author:
Jacaranda    时间: 2025-2-17 21:14
wxyhgk 发表于 2025-2-16 16:18
不建议使用这种做法,你应该这样做:

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

感谢指点,我的主修是实验化学方向,对代码方面不是很熟悉,询问了一下ChatGPT,感觉还需要一些学习时间,我后续琢磨琢磨
作者
Author:
kissw    时间: 2025-3-7 16:42
没看懂,slurm不是有job array吗




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