2

我想用 sbatch 运行 python 脚本,但是,用 sbatch 运行 python 脚本的唯一方法似乎是有一个 bash 脚本,然后运行 ​​python 脚本。就像拥有batch_main.sh

#!/bin/bash
#SBATCH --job-name=python_script

arg=argument

python python_batch_script.sh

然后运行:

sbatch batch_main.sh

这个问题是我希望有一个单独的参数配置文件(因为它通常不是单个数字或参数)并且还能够使用数组选项。此外,我通常同时运行多个不同的 sbatch 作业(具有不同的配置),因此如果更改配置文件不会使不同的 sbatch 运行相互妨碍(因为如果作业排队然后配置文件稍后更改,它将运行最新的配置文件,而不是我运行 sbatch 时的配置副本)。为了解决这个问题,我发现当我运行一个 sbatch 脚本时,SLURM 实际上会将提交脚本复制到它的内部数据库中(我在询问后发现了它:在运行期间更改发送到 sbatch 的 bash 脚本是个坏主意?)。因此,我实际上决定将配置硬编码到 bash 提交脚本中(使提交脚本本质上是配置文件)。这样我只需编辑提交脚本,然后运行文件。但是,我想停止这种情况,因为这让我用 bash 编写,我想不惜一切代价避免。

理想情况下,我想运行一个直接运行 python 的 sbatch。

由于这可能是不可能的,我想知道还有哪些其他选项可以解决这个问题。例如,是否可以让 slurm 将不同的文件(如 python 配置文件)复制到其内部数据库,以便在将作业排队时运行我确切想要运行的作业?(请注意,运行 sbatch 作业然后更改配置文件不是这样做的方法,因为这可能会在更改配置文件时引起问题,slrum 将读取配置的最新副本而不是配置的副本作业运行时)。或者我还有什么其他选择?我真的坚持编写 bash 还是我可以做其他事情来处理 python 中的配置而不是其他一些奇怪的 hack?

总的来说,我还想知道人们在现实世界中为此做了什么,或者对此有什么好的做法/标准。

4

1 回答 1

4

Python 脚本是有效的提交文件,前提是它们以 python shebang(通常#!/usr/bin/env python)开头。

例如:

#!/usr/bin/env python
#SBATCH --time=...
#SBATCH --partition=...

import sys
jobid=sys.environ["SLURM_JOB_ID"]
print "Hello World from job %s" % jobid

请注意,如果您的脚本import是自定义模块,即使它们位于当前目录中,您也需要设置 PYTHONPATH。

于 2017-08-26T17:09:02.043 回答