问题描述
我在使用 dask 的 LocalCluster
时遇到了一些内存问题。我在一台有 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
时处理队列中这些任务的正确方法是什么?
解决方法
一种选择是明确指定任务的资源要求(如果您事先知道的话),here 和 documentation 中有相关答案。
集群将使用 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个任务)。