我正在尝试向Slurm服务器提交大量作业(数百个),并希望避免为我想要运行的每个作业提交新的shell脚本。提交的代码是一个Python脚本,它接受shell脚本中的两个输入变量,并且这些变量是在不同作业之间唯一变化的变量。以下是适用于单个作业的简短shell脚本的示例:
#!/bin/bash
#SBATCH -n 1
#SBATCH -t 01:00:00
srun python retrieve.py --start=0 --end=10
我想要的是用相同的python脚本提交大量的作业,并且只在作业之间改变'start‘和'end’变量。我读到了一些关于增加所需的核心数量('-n')并在每个srun-命令后写一个&符号的内容,但到目前为止我一直无法让它工作。
如果有人知道做这件事的快捷方法,我将非常感谢!
发布于 2021-04-07 20:20:37
要在当前解决方案的基础上进行构建,您可以使用两个CPU,而不是一个CPU:
#!/bin/bash
#SBATCH -n 2
#SBATCH -t 01:00:00
srun -n1 --exclusive python retrieve.py --start=0 --end=10 &
srun -n1 --exclusive python retrieve.py --start=10 --end=20 &
wait
(您可能需要根据边界是包含的还是排除的来调整--end
)
上面的脚本请求2个CPU,并使用不同的参数创建两个运行Python脚本的任务。对于20.11之前的Slurm版本,--exclusive
部分是必需的(从内存中)。它与请求整个节点的sbatch
的同名选项无关。
与号(&
)允许两个任务并行运行,并且wait
命令用于确保脚本不会在任务之前终止,否则Slurm将直接终止它们。
您可以使用Bash for
-loop或使用GNU Parallel命令进行泛化。
但是,这不会提交多个作业,它将提交具有多个任务的一个作业。
如果要提交多个作业,则需要一个job array。
#!/bin/bash
#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --array=0-10:10
srun python retrieve.py --start=${SLURM_ARRAY_TASK_ID} --end=$((SLURM_ARRAY_TASK_ID+10))
这将提交两个独立的作业,它们将执行与前面描述的作业相同的工作。
https://stackoverflow.com/questions/66919530
复制相似问题