在使用Slurm中运行时更改发送到sbatch的Bash脚本是否是一个坏主意?

20

我想通过sbatch_run.sh脚本多次运行一个Python脚本main.py,并传入不同的参数,示例如下:

#!/bin/bash
#SBATCH --job-name=sbatch_run
#SBATCH --array=1-1000
#SBATCH --exclude=node047

arg1=10 #arg to be change during runs
arg2=12 #arg to be change during runs
python main.py $arg1 $arg2

参数被编码在由sbatch运行的bash文件中。我担心如果我连续多次运行`sbatch_run.sh`,但每次运行时更改arg1和arg2的值,可能会导致我的运行出错。例如,如果我这样做:
sbatch sbatch_run.sh # with arg1=10 and arg2=12

然后立即修改sbatch_run.sh,并再次运行该文件,如下所示:

sbatch sbatch_run.sh # with arg1=69 and arg2=666

如果我不修改每个运行的参数,而是让所有运行都使用最后一个(即 arg1=69arg2=666),那么会出现这种情况。

我知道,如果我在 main.py 中硬编码参数,然后运行相同的 sbatch 脚本,但更改 main.py,它将运行最后一个。我想知道如果我更改 sbatch_run.sh 脚本是否也是如此。


只要你知道,我试过这个实验,运行了1000个脚本,然后一些被排队并放置了一个睡眠命令,然后更改了 sbatch_run.sh。似乎没有改变我的运行结果,但如果我错了,这太重要了,不能有意外,我想确保我也问了这个问题。

记录一下,我运行了:

#!/bin/bash
#SBATCH --job-name=ECHO
#SBATCH --array=1-1000
#SBATCH --exclude=node047

sleep 15
echo helloworld
echo 5

然后将echo更改为echo 10或echo byebyeworld。


这意味着从我得到的答案中,如果您正在通过sbatch运行脚本并想要更改脚本的参数(例如main.py示例),请确保有某个地方参数不会更改。例如,在由slurm运行的bash脚本中直接传递它们或为每次运行创建一个配置文件,只需确保正确的配置文件正在运行,并且您不会意外更改它! - Charlie Parker
因为第二个例子中的数字选择很好,而且这个问答非常有帮助,所以我给它点了赞。 - mesllo
1个回答

30
当运行sbatch时,Slurm会将提交脚本复制到其内部数据库中;您可以通过以下实验来验证:
$ cat submit.sh
#!/bin/bash
#SBATCH  --hold
echo helloworld

使用--hold参数可以确保作业不会立即启动。提交它:

Translated:

使用--hold参数可以确保作业不会立即启动。提交它:

$ sbatch submit.sh

然后修改提交脚本:

$ sed -i 's/hello/bye/' submit.sh
$ cat submit.sh
#!/bin/bash
#SBATCH  --hold
echo byeworld

现在使用control show job命令查看Slurm计划运行的脚本:

$ scontrol show -ddd job YOURJOBID
JobId=******* JobName=submit.sh
[...]
BatchScript=
   #!/bin/bash
   #SBATCH  --hold
   echo helloworld
[...]

尽管原始脚本已更改,但它并没有改变。

[EDIT] 最近版本的Slurm使用scontrol write batch_script -而不是scontrol show -dd job来显示提交脚本。


1
啊,太好了!这就是为什么如果我更改在bash脚本中运行的脚本(例如使用bash脚本调用的python main.py脚本),它就无法工作的原因,因为对于这个脚本,它不会发送脚本的副本...太棒了,这意味着我的Python脚本的参数不会改变! :D - Charlie Parker
能否将其他脚本复制到内部数据库中?例如,我想要一个配置脚本,在运行过程中会进行更改,但是一旦作业进入队列,我希望保持不变。 - Charlie Parker
@CharlieParker 我不这么认为。你需要将该配置脚本复制到单独的目录中的每个作业(或具有特定作业名称的目录)中。 - damienfrancois
我猜这个不太正规的解决方案虽然有用,只是把提交工作放在配置文件中。因为你可以指定要使用哪种解释器(例如 Python),所以事实上事情变得更加简单,因为提交脚本不必使用 bash。感谢 Damien 的讨论。 - Charlie Parker
1
@CharlieParker 手册 上说:‘重复选项超过一次(例如,“-dd”)将导致显示作业命令也列出批处理脚本,如果作业是批处理作业。’所以实际上只需要一个额外的 d 就足够了。我之所以放三个是因为其他一些工具(例如 sshd)可以使用三个 d - damienfrancois
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接