动态重新配置Dask作业队列



我有一个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(,否则工作进程将"耗尽"内存,dask将重新启动它(这将启动一个无限循环(。有足够的内存在单个节点上运行作业,我希望有效利用每个节点(最大限度地减少请求的总量(。

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

不幸的是,随时更换工人并不容易。GitHub上讨论了几种解决方法:link1和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

最新更新