微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每个节点最多具有一个并发作业的 Slurm 阵列作业

如何解决每个节点最多具有一个并发作业的 Slurm 阵列作业

问题

我有数百个文件,对于每个文件,我想运行具有固定数量内核的作业(假设 -c4),以便在任何时间运行这些作业中的一个以上节点。

(如果您感兴趣,原因是:复杂的作业设置超出了我的控制范围。每个作业都会在硬编码端口上启动一堆服务器。如果在一个节点上同时运行,这些会发生冲突:-/(是的,不要告诉我,我知道。))

MVCE

我已经尝试过 -N1-n1--ntasks-per-node=1 和带有 srun 的内部 --exclusive 的各种组合,但遗憾的是没有成功:

sbatch -N1 -n1 -c4 --ntasks-per-node=1 --array=1-128 --wrap \
    'echo "$(hostname) $(date) $(sleep 15) $(date)"'

sbatch -N1 -n1 -c4 --ntasks-per-node=1 --array=1-128 --wrap \
    'srun --exclusive -n1 -c4 --ntasks-per-node=1 -- \
         bash -c '\''echo "$(hostname) $(date) $(sleep 15) $(date)"'\'

但是,如果您查看输出 (cat slurm-*.out),您会在所有情况下快速发现重叠运行:-/

问题

有没有办法限制一个数组作业在任何节点上永远不会同时运行 1 个以上的作业?

我们的集群非常异构。每个节点中的 cpu(范围从 32 到 256),因此简单的解决方法,例如要求足够高的 -c 以便没有 2 可以在节点上运行,从而导致等待时间过长和利用率低下。

任何想法/指示? 有没有办法为每个作业保留某个端口?

解决方法

我可以想到两种方法来实现这一点,一种有一些管理员帮助,另一种没有。:

  1. 如果您很好地询问您的 Slurm 管理员,他可能会向节点添加“假”gres。这允许您为您的工作请求此 gres。如果每个节点只有这些 gres 之一,则每个节点应限制为一个作业,但需要许多其他资源。
  2. 您可以请求一个包含大量节点的大型作业,而不是使用数组,但每个节点有一个任务,每个节点有四个核心。在该作业中,您使用 srun 启动任务,因为每个节点都有一个任务,所以它们应该沿着节点分布。您可能不想等待 128 个节点上的四个内核同时空闲,因此将您的工作负载分成多个块并将它们作为 dependencies 提交(查看单例选项)。

第二个选项的详细说明:

#SBATCH -N16
#SBATCH --ntasks-per-node=1
#SBATCH --job-name=something
#SBATCH --dependency=singleton

for i in `seq 1 $SLURM_JOB_NUM_NODES`; do
  srun -N1 -n1 <your_program> &
done
wait

您可以连续提交 100 个,它们将依次运行大小为 16 的块。这不是很有效,但一次等待 100 个节点有一个空闲任务(所以没有分块),可能需要更长的时间。我当然更喜欢第一个选项,但如果您的管理员不想添加一些 gres,这可能是一个选项。

,

最有效的方法是@Marcus Boden 建议的 gres 方法。

但如果管理员无法帮助您,您可以在提交脚本的开头添加一小段代码,以检查所需的端口是否可用(例如使用 {{ 1}} 命令)。

如果端口不可用,请使用 netstatSLURM_JOB_IDscontrol requeue scontrol update jobid=$SLURM_JOB_ID ExcNodeList=$(hostname -s)`重新排队作业。理想情况下,代码应该更聪明一点,从作业中检索当前排除的节点列表并附加当前节点。

另一种选择是使用 . Before requeueing,in order to prevent the job from hitting the same,unavailable,node,you can edit the job to exclude that node: 修改作业,并将开始时间设置为当前时间加上您作业的典型挂机时间,这样一来,当作业再次符合条件时,当前正在运行的作业在节点上将完成。但是当然不能保证在此期间该节点不会被分配给另一个作业。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。