我对使用 SLURM 工作负载管理器进行 HPC 计算相当陌生,因此尚未找到可靠的工作例程。截至目前,我有一个带有一堆 #SBATCH 标志的作业脚本,每当我进行另一次计算时我都会修改这些标志。 这包括总运行时间和节点/任务/CPU 的数量。
由于我仍在积累经验,我想将所选选项保存在 SLURM 生成的标准 .out 文件中以供参考。我在 sbatch 手册页 文件名模式部分找到了一些选项,至少可以记住作业名称,但我真正想要的是所有设置的 #SBATCH 标志的完整列表。
我目前的解决方法是这样的
#!/bin/bash
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out
echo "#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out
"
并且显然不令人满意并且还容易出现错别字。由于 SLURM 管理器依赖于 bash 看不到的代码(因为它已被注释掉),因此我认为使用 bash 语言无法轻松解决此问题。我也没有找到任何使用 sbatch 选项的提示。
也许还有另一种方法来保存这些选项。我知道我可能会使用自动 seff 查询来 grep 这些所需的选项,但我希望有一种更简单的方法,因为作业 ID 仅在作业提交后分配。
我不知道
slurm
是什么,但您似乎正在使用构造 #SBATCH
在 bash
脚本中为其设置一些选项,所以您不能这样做吗:
$ cat tst.sh
#!/usr/bin/env bash
declare -a sbatch
sbatch+=( '--ntasks=2' )
sbatch+=( '--cpus-per-task=4' )
sbatch+=( '--time=0:20:00' )
sbatch+=( '--mem=4G' )
sbatch+=( '-p normal' )
sbatch+=( '-q cont' )
sbatch+=( '-J crosscorr' )
sbatch+=( '--output=jobscript_slurmout/R-%j.%x.out' )
for opt in "${sbatch[@]}"; do
printf '#SBATCH %s\n' "$opt"
#SBATCH "$opt"
done
$ ./tst.sh
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out
您可以使用它来替换当前脚本以设置
#SBATCH
(如果有效)或生成另一个脚本来替换当前脚本:
$ cat ./tst.sh
#!/usr/bin/env bash
declare -a sbatch
sbatch+=( '--ntasks=2' )
sbatch+=( '--cpus-per-task=4' )
sbatch+=( '--time=0:20:00' )
sbatch+=( '--mem=4G' )
sbatch+=( '-p normal' )
sbatch+=( '-q cont' )
sbatch+=( '-J crosscorr' )
sbatch+=( '--output=jobscript_slurmout/R-%j.%x.out' )
printf '#!/usr/bin/env bash\n\n'
for opt in "${sbatch[@]}"; do
printf '#SBATCH %s\n' "$opt"
done | tee '/dev/stderr'
$ cat slurm.sh
cat: slurm.sh: No such file or directory
$ ./tst.sh > slurm.sh
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out
$ cat slurm.sh
#!/usr/bin/env bash
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out