Dask worker 卡在 SLURM 队列中,直到 master 到达 walltime 时才会启动

Dask workers get stuck in SLURM queue and won't start until the master hits the walltime

最近,我一直在尝试在使用 SLURM 调度程序的 HPC 集群上使用 Dask 进行一些机器学习工作。重要的是,在此集群上,SLURM 配置为每个作业的硬墙时间限制为 24 小时。

最初,我 运行 我的代码只有一个工人,但我的工作 运行 内存不足。我试图增加工作人员的数量(因此增加了请求的节点数量),但工作人员被困在 SLURM 队列中(原因是这样被标记为“优先级”)。与此同时,master 会 运行 并最终达到 wall-time,让 worker 在他们最终开始时死去。

考虑到问题可能是我请求了太多 SLURM 作业,我尝试将工作人员压缩到一个多节点作业中 using a workaround I found on github。尽管如此,这些多节点作业 运行 变成了同样的问题。

然后我尝试与集群的 IT 支持团队取得联系。不幸的是,他们对 Dask 不太熟悉,只能提供一般性的指导。他们的主要建议是要么暂停 master 作业,直到 workers 准备好,要么每 24 小时启动一次新 master,直到 workers 可以离开队列。为了帮助实现这一点,他们引用了 SLURM 选项 --begin 和 --dependency。令我懊恼的是,我无法使用任何一个建议找到解决方案。

因此,我想问一下,在 Dask/SLURM 环境中,是否有办法强制 master 在 workers 准备好之前不启动,或者启动一个 master 能够“继承”以前由另一个主人创建的工人。

非常感谢您提供的任何帮助。

我在下面的内容可能是错误的,但根据我使用 SLURM 的经验,Dask 本身将无法与 SLURM 调度程序通信。有 dask_jobqueue 有助于创建工作人员,因此一种选择是在低资源节点上启动调度程序(可能需要更长的时间)。

heterogeneous jobs 在 SLURM 上有一个相对较新的功能(参见 https://slurm.schedmd.com/heterogeneous_jobs.html),据我了解,这将保证您的工作人员、调度程序和客户端同时启动,也许这是您的 IT 可以提供帮助的事情,因为这是特定于 SLURM(而不是 dask)的。不幸的是,这仅适用于非交互式工作负载。

我的问题的答案看似简单。我们的 SLURM 配置使用 backfill scheduler。因为我的 Dask 工作人员正在使用最大可能的 --time(24 小时),这意味着回填调度程序无法有效工作。一旦我将 --time 降低到我认为工作人员完成脚本所需的时间 运行,他们就离开了“队列地狱”!