处理作业提交限制

Dealing with job submission limits

我正在使用 --array 运行宁 slurm 作业数组,我想 运行 大约 2000 tasks/array 个项目。然而,这超出了集群一次提交约 500 个作业的限制。

是否有任何tips/best拆分的做法?我想一次提交所有内容,并且如果可能的话仍然能够将数组 id 参数 1-2000 传递给我的程序。我认为等待提交数组片段之类的操作可能会有所帮助,但我目前不确定如何执行此操作。

如果限制在数组的大小上:

您必须将数组拆分为多个作业数组。 --array 参数接受 <START>-<END> 形式的值,因此您可以提交四个作业:

sbatch --array=1-500 ...
sbatch --array=501-1000 ...
sbatch --array=1001-1500 ...
sbatch --array=1501-200 ...

这样您将绕过 500 的限制并仍然保持 SLURM_ARRAY_TASK_ID 在 1 到 2000 之间。

为了简化事情,您可以像这样将所有内容写在一行中:

paste -d- <(seq 1 500 2000) <(seq 500 500 2000) | xargs -I {} sbatch --array={} ... 

如果限制是提交作业的数量:

然后一个选项是让数组的最后一个作业提交以下块。

#!/bin/bash
#SBATCH ...
...
...
if [[ $((SLURM_ARRAY_TASK_ID % 500)) == 0 ]] ; then 
    sbatch --array=$((SLURM_ARRAY_TASK_ID+1))-$((SLURM_ARRAY_TASK_ID+500)) [=12=]
fi

请注意,理想情况下,阵列的最后一个 运行 作业应该提交作业,它可能是也可能不是具有最高 TASK ID 的作业,但这在许多实际用途中都有效情况。

另一种选择是设置一个 cron job to monitor the queue and submit each chunk when possible, or to use a workflow manager 来满足您的需求。

您可以 运行 一个脚本来提交您的作业,并尝试让程序在每 500 次提交后休眠几秒钟。见 https://www.osc.edu/resources/getting_started/howto/howto_submit_multiple_jobs_using_parameters