示例 17:Gaussian 16 作业脚本、并行、批量提交与断点续算¶
目的¶
提供一套可以直接修改使用的集群脚本,并用苯(C₆H₆)这个小分子演示:
- Slurm、PBS、GPU、Linda 四种作业模板,资源只在调度指令中写一次,由脚本换算成
GAUSS_CDEF/GAUSS_PDEF和GAUSS_MDEF; - 批量提交整个目录、作业数组、依赖作业(优化成功后自动做高精度单点);
- 缩放测试:同一输入用不同核数运行,计算加速比和并行效率;
- 断点续算:
Opt=Restart,以及解析频率的%RWF+Restart; Default.Route的写法。
对应教程:第17章 作业脚本、并行与批量计算。
文件说明¶
| 文件 | 说明 |
|---|---|
g16_slurm.sh |
主模板(Slurm,单节点 SMP)。读取 Cpus_allowed_list 设置 GAUSS_CDEF,按 --mem 的 80% 设置 GAUSS_MDEF;检查 CRLF、末尾空行和输入中的 Link 0 资源行;独立 scratch 并在退出时清理;结束后检查 Normal termination、对所有 %chk 做 formchk;失败时退出码为 1 |
g16_pbs.sh |
PBS/Torque 模板(注释中给出 PBS Pro 的 select 写法),用 qsub -v INPUT=job.gjf 传入输入文件 |
g16_gpu_slurm.sh |
GPU 模板:--gres=gpu:2,自动组成 GAUSS_GDEF="0,1=<控制核>",打印 nvidia-smi topo -m 供核对 |
g16_linda_slurm.sh |
两节点 Linda 模板:GAUSS_WDEF 取自 $SLURM_JOB_NODELIST,每个节点建立 scratch |
batch_submit_all_gjf.sh |
批量提交目录中所有 .gjf,跳过已完成和已在队列中的作业,并限制排队数量 |
g16_array_slurm.sh |
作业数组:第 i 个任务运行 joblist.txt 第 i 行的输入(调用 g16_slurm.sh) |
chain_opt_sp_dependency.sh |
依赖作业:benzene_opt_freq.gjf 成功后才运行 benzene_sp_tz.gjf |
scaling_test.sh |
缩放测试:在一次分配中依次用 1/2/4/8/16/32 核运行,输出 scaling_<name>.dat |
Default.Route.example |
Default.Route 示例:默认内存 4 GB、MaxDisk=100GB。复制为 Default.Route 放到作业目录才生效 |
benzene_opt_freq.gjf |
B3LYP-D3(BJ)/def2-SVP 优化 + 频率。没有 %nprocshared/%mem,资源由脚本设置 |
benzene_sp_tz.gjf |
%oldchk 读取优化结构,ωB97X-D/def2-TZVP 单点(依赖作业的第二步) |
benzene_opt_restart.gjf |
Opt=(Restart,MaxCycles=200) 续算优化,再用 --Link1-- 补做频率 |
benzene_freq_rwf.gjf |
解析频率,%rwf 命名 read-write 文件 + %nosave,使作业可以续算 |
benzene_freq_restart.gjf |
上一个作业中断后的续算输入:只有 Link 0 和 #p Restart |
benzene_scaling_freq.gjf |
缩放测试用的 def2-TZVP 频率计算(只用于计时,结构未优化,热化学结果没有意义) |
运行步骤¶
先按你的集群修改每个脚本开头的 site specific 部分:module load 或 g16root、分区名(--partition)、scratch 位置(环境变量 SCR_BASE,默认 /tmp)。
cd Gaussian/examples/17-hpc-job-scripts
# 1) one job with the main template (resources can be overridden on the command line)
sbatch g16_slurm.sh benzene_opt_freq.gjf
sbatch --cpus-per-task=8 --mem=16G g16_slurm.sh benzene_opt_freq.gjf
# 2) PBS
qsub -v INPUT=benzene_opt_freq.gjf g16_pbs.sh
# 3) opt+freq, then the single point only if the first job succeeded
bash chain_opt_sp_dependency.sh
# 4) submit everything in a folder / as a job array
bash batch_submit_all_gjf.sh . 20
ls benzene_opt_freq.gjf benzene_scaling_freq.gjf > joblist.txt
sbatch --array=1-2%2 g16_array_slurm.sh
# 5) scaling test (one exclusive node, 32 cores)
sbatch scaling_test.sh benzene_scaling_freq.gjf "1 2 4 8 16 32"
# 6) restart demos
sbatch --time=00:02:00 g16_slurm.sh benzene_opt_freq.gjf # let it time out on purpose
sbatch g16_slurm.sh benzene_opt_restart.gjf # continue from benzene_opt_freq.chk
benzene_freq_rwf.gjf 的 rwf 写在作业目录中(相对路径),所以 g16_slurm.sh 清理 scratch 时不会删除它;作业中断后提交 benzene_freq_restart.gjf 即可续算。
预期结果 / 如何检查¶
| 检查项 | 命令 | 期望 |
|---|---|---|
| 资源是否按预期传给 Gaussian | grep "GAUSS_.DEF" *.out |
GAUSS_CDEF 中的核数等于 --cpus-per-task,GAUSS_MDEF 约为 --mem 的 80% |
| 没有 Link 0 覆盖 | grep WARNING *.out |
无输出(苯的输入中没有资源行) |
| 作业成功 | tail -n 1 benzene_opt_freq.log |
Normal termination of Gaussian 16 ... |
| fchk 自动生成 | ls benzene_opt_freq.fchk |
存在 |
| CPU 效率 | seff <jobid> |
小分子在 8–16 核时 CPU 效率明显低于 100% 是正常的 |
| 依赖作业 | squeue -u $USER |
单点作业状态为 PD,原因 (Dependency),优化完成后才开始 |
| 缩放测试 | cat scaling_benzene_scaling_freq.dat |
苯这种小分子在少量核之后加速比明显变平 |
| 优化续算 | grep -c "Normal termination" benzene_opt_restart.log |
续算的优化和频率都正常结束 |
本仓库没有附带运行结果;墙钟时间和加速比取决于你的硬件。
注意事项¶
- 本目录的输入都故意不写
%nprocshared/%mem。如果你的输入里有这些行,它们会覆盖脚本设置的环境变量,g16_slurm.sh会打印警告。 - 共享节点上不要把
%CPU=0-15写死在输入中:Slurm 可能分配给你的是其他编号的核。 --dependency=afterok依赖作业脚本的退出码;这里的模板只在Normal termination时返回 0。scaling_test.sh使用--exclusive,在不允许独占节点的集群上删除这一行,并把核数列表限制在申请的范围内。- GPU 模板默认让前两个分配到的核控制两块 GPU,这只是最简单的选择。请根据日志中
nvidia-smi topo -m的 CPU Affinity 把控制核改到与 GPU 相连的那颗 CPU 上。A100 需要 G16 Rev. C.02。 - Linda 模板需要 Linda 版本的 Gaussian 和节点间免密码 ssh;普通(SMP 版)Gaussian 不能跨节点。
Default.Route.example只有改名为Default.Route并放在作业目录(或$g16root/g16)时才生效,它的优先级最低。- 想要功能更完整的提交封装,可以使用仓库脚本
sub_g16.sh(bash ../../scripts/sub_g16.sh -h查看用法)。