即时重新配置 Dask 作业队列

Reconfigure Dask jobqueue on the fly

我有一个 Slurm 的作业队列配置,类似于:

cluster = SLURMCluster(cores=20,
                       processes=2,
                       memory='62GB',
                       walltime='12:00:00',
                       interface='ipogif0',
                       log_directory='logs',
                       python='srun -n 1 -c 20 python',
                       )

当增加进程数时,每个工作进程获得的内存分配会变小。在我的工作流程开始时,任务是高度并行化的,并且内存使用量很小。但是,流程的结尾目前是串行的,需要更多的内存。除非我将进程设置得很小(即 2 或 3),否则工作人员将 'run out' 内存,而 dask 将重新启动它(这将启动无限循环)。 运行 单个节点上的作业有足够的内存,我想有效地利用每个节点(最小化请求的总数)。

是否可以重新配置 cluster 以便稍后在工作流程中为工作人员提供更大的内存?

不幸的是,即时更改工人并不容易。 GitHub 上讨论了几种解决方法:link1 and link2.

但是,最简单的解决方案是关闭现有的调度程序并启动一个具有不同参数的新调度程序。可以在循环中执行此操作,直到任务完成,这样每次资源都会增加,但如果您的排队时间很长,这可能效果不佳。一些粗略的伪代码:

starting_memory = 10
while num_tasks_remaining>0:
    starting_memory += 5 
    params_dict = {'mem': f'{starting_memory}GB'}
    with SLURMCluster(**params_dict) as cluster, Client(cluster) as client:
        # some code that uses the client and updates the num tasks remaining