Dask - LocalCluster 的灵活内存分配

问题描述

我在使用 daskLocalCluster 时遇到了一些内存问题。我在一台有 32 个 cpu 的机器上工作,但我只有 64GB 的内存可用。我正在像这样实例化集群:

cluster = LocalCluster(
    n_workers=os.cpu_count(),threads_per_worker=1
)

认情况下,dask 为每个 worker 分配相同数量的内存(总 RAM 除以 worker 数量)。 我正在使用 dask 来计算研究批次。这些批次的内存需求不同。当我处理 32 个较小的批次时没有任何问题,因为它们适合内存。我的问题来了,当我进入更大的批次时,它无法容纳 2GB 的分配可用 RAM。然后 dask 引发内存分配错误。我已经看到我可以增加工人的超时时间,但这不是很优雅的解决方案。有没有办法告诉 dask 将计划任务保留在队列中,除非资源可用?在使用 LocalCluster 时处理队列中这些任务的正确方法是什么?

解决方法

一种选择是明确指定任务的资源要求(如果您事先知道的话),heredocumentation 中有相关答案。

集群将使用 resources={'mem': 2000} 选项启动,然后在使用 .compute().submit() 执行任务时声明预期的资源使用,例如小任务可以指定client.submit(my_func,small_task,resources={'mem': 1000})(这将在worker上最多执行2个任务),而大任务可以指定client.submit(my_func,large_task,resources={'mem': 2000})(这将在worker上最多执行1个任务)。