运行 多个相似的作业文件(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:
我经常将必要的信息作为参数传递给作业文件:提交文件(我们称之为 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 作业的名称。
我正在尝试 运行 多个(数百个)非常相似的工作文件与 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:
我经常将必要的信息作为参数传递给作业文件:提交文件(我们称之为 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 作业的名称。