运行 多个相似的作业文件(sbatch)

Running multiple similar job files (sbatch)

我正在尝试 运行 多个(数百个)非常相似的工作文件与 slurm 使用 sbatch

我的 .job 文件看起来像:

#SBATCH ...
...
...
srun ./someProg -a A -b B -c C -d D

是否有任何方便的方法来使用 sbatch 提交作业文件并为 A/B/C 和 D 提供多个选项,并为 A/B/C/D 的每个组合生成一个新作业,而无需只是生成数百个 .job 文件? (我已经在 slurm 文件中看到了很多数组,但我不认为它在这里对我有帮助。)

without just generating hundreds of .job files?

您可以使用 bash 的 Process Subsitution 来替换 创建 文件:

#!/bin/bash

genjob() {
    local content
    IFS='' read -d '' -r content <<-EOF
        #!/bin/bash
        #SBATCH ...
        ...
        ...
        srun ./someProg $(printf '%q ' "$@")
    EOF
    printf '%s\n' "$content"
}

sbatch <(genjob -a A -b B -c C -d D)

重要提示: <<-EOF中的破折号表示Heredoc每行开头的制表符将被去掉;所以缩进必须用制表符完成。

你说你有几百个这样的工作。这可能超过您的可用核心数,因此您要小心提交它的方式。您想提交尽可能多的,但不是一次全部提交。

这里有两个实用程序,它们接受任意长的命令行列表,然后将它们分布在可用的 nodes/cores:

https://github.com/TACC/launcher

https://github.com/TACC/pylauncher

我经常将必要的信息作为参数传递给作业文件:提交文件(我们称之为 submit.sh)的内容可能如下所示:

#SBATCH ...
...
...
srun ./someProg -a  -b  -c 

在第二个 bash 脚本中,我遍历了我需要的所有选项。 bash 脚本可能如下所示:

#!/bin/bash

for aa in a1 a2 a3
do
  for bb in b1 b2 b3
  do
    for cc in c1 c2 c3
    do
      scommand="sbatch -J A=${aa},B=${bb},C=${cc} submit.sh $aa $bb $cc"
      echo "submit command: $scommand"
      $scommand
    done
  done
done

-J 选项设置 slurm 作业的名称。