Slurm 将工作分成比并发度更多的部分
Slurm divide work into more parts than concurrency degree
我有一项大型任务,我想将其分成多个部分并 运行 使用 slurm 并行处理。具体来说,我想将工作分成更多的部分,而不是 运行 在我的系统上同时使用我想要分配的资源。我想到的基本习惯用法是调用 sbatch
,将工作分成 k
(大于某些 N
最大并发任务数)部分,并让 slurm 队列任务直到有运行 他们可用的资源。具体来说,假设我有一些文件,其中每一行代表一项要完成的工作,我想将该工作分成 1000 份,运行使用一些单线程脚本来处理集群上的每份总共有 128 个 CPU。我当前的 sbatch 脚本看起来像:
#!/bin/bash
#SBATCH --cpus-per-task=1
#SBATCH --ntasks=128
split -a 4 -d -n l/1000 workfile work_part_
PART_ID=0000 srun --ntasks=1 ./do_work.sh &
PART_ID=0000 srun --ntasks=1 ./do_work.sh &
.
.
.
PART_ID=0999 srun --ntasks=1 ./do_work.sh &
wait
其中 do_work.sh
使用 PART_ID
找到合适的工作部分文件,并写出一些输出部分文件。当我尝试 运行 时,出现一堆 Resource temporarily unavailable
错误,许多作业步骤显示为 'Cancelled' 或 'Cancelled by <my user id>'。我觉得这应该是某种常见的用例,但我无法弄清楚如何让 slurm 在单个作业中正确分配资源。我知道我可以在 slurm 之外执行拆分并使用 srun
排队 1000 个单独的作业,但我更愿意将它们全部组合在一个作业下 sbatch
。
对于此特定用例,srun
需要 --exclusive
关键字,否则即使您指定 --ntasks=1
.
,它也会继承完整分配
请注意,在最新版本的 slurm --exclusive
中,--exact
已弃用,在更新的版本中,如果您在 srun
行中明确指定 --cpus-per-task
, --exact
将被隐含。
您会在日志中看到所有 srun
都将启动,但其中只有 128 个会完成工作,而其他人会抱怨资源暂时不可用,直到其他一些人终止并释放资源。
请注意,您可以使用 Bash 循环或 GNU Parallel 工具来避免在提交脚本中显式编写所有步骤。
我有一项大型任务,我想将其分成多个部分并 运行 使用 slurm 并行处理。具体来说,我想将工作分成更多的部分,而不是 运行 在我的系统上同时使用我想要分配的资源。我想到的基本习惯用法是调用 sbatch
,将工作分成 k
(大于某些 N
最大并发任务数)部分,并让 slurm 队列任务直到有运行 他们可用的资源。具体来说,假设我有一些文件,其中每一行代表一项要完成的工作,我想将该工作分成 1000 份,运行使用一些单线程脚本来处理集群上的每份总共有 128 个 CPU。我当前的 sbatch 脚本看起来像:
#!/bin/bash
#SBATCH --cpus-per-task=1
#SBATCH --ntasks=128
split -a 4 -d -n l/1000 workfile work_part_
PART_ID=0000 srun --ntasks=1 ./do_work.sh &
PART_ID=0000 srun --ntasks=1 ./do_work.sh &
.
.
.
PART_ID=0999 srun --ntasks=1 ./do_work.sh &
wait
其中 do_work.sh
使用 PART_ID
找到合适的工作部分文件,并写出一些输出部分文件。当我尝试 运行 时,出现一堆 Resource temporarily unavailable
错误,许多作业步骤显示为 'Cancelled' 或 'Cancelled by <my user id>'。我觉得这应该是某种常见的用例,但我无法弄清楚如何让 slurm 在单个作业中正确分配资源。我知道我可以在 slurm 之外执行拆分并使用 srun
排队 1000 个单独的作业,但我更愿意将它们全部组合在一个作业下 sbatch
。
对于此特定用例,srun
需要 --exclusive
关键字,否则即使您指定 --ntasks=1
.
请注意,在最新版本的 slurm --exclusive
中,--exact
已弃用,在更新的版本中,如果您在 srun
行中明确指定 --cpus-per-task
, --exact
将被隐含。
您会在日志中看到所有 srun
都将启动,但其中只有 128 个会完成工作,而其他人会抱怨资源暂时不可用,直到其他一些人终止并释放资源。
请注意,您可以使用 Bash 循环或 GNU Parallel 工具来避免在提交脚本中显式编写所有步骤。