Dask:任务提交时资源限制不起作用

Dask : tasks submit with resources constraints not working

我提交了一个这样的 Dask 任务:

client = Client(cluster)
future = client.submit(
    # dask task
    my_dask_task,  # a task that consume at most 100MiB

    # task arguments
    arg1,
    arg2,
)

一切正常。

现在我设置了一些约束:

client = Client(cluster)
future = client.submit(
    # dask task
    my_dask_task,  # a task that consume at most 100MiB

    # task arguments
    arg1,
    arg2,

    # resource constraints at the Dask scheduler level
    resources={
        'process': 1,
        'memory': 100*1024*1024  # 100MiB
    }
)

问题是,那样的话,未来永远无法解决。 Python 程序永远等待。即使只有 'process': 1 and/or 设置非常少的 ram,如 'memory': 10。所以很奇怪。

沿着这个简化的例子,在我的真实世界应用程序中,给定的 Dask worker 配置为具有多个进程,因此可能 运行 同时执行多个任务。

所以我想设置每个任务的 RAM 数量,以避免 Dask 调度程序在给定的 Dask worker 上执行 运行 个任务,这可能导致内存不足错误。

为什么它没有按预期工作?如何调试?

谢谢

添加到@pavithraes 的评论 - resources argument to client.submit 和其他调度调用不会修改可用的工作人员。相反,它对可用于给定任务的工作人员创建了一个约束。重要的是,您在此处使用的术语“进程”和“内存”不会被 dask 解释为物理硬件 - 它们只是您可以定义的限定符,dask 用于将可用的工作人员过滤为仅符合您的标签标准的工作人员。

来自dask docs

Resources listed in this way are just abstract quantities. We could equally well have used terms “mem”, “memory”, “bytes” etc. above because, from Dask’s perspective, this is just an abstract term. You can choose any term as long as you are consistent across workers and clients.

It’s worth noting that Dask separately track number of cores and available memory as actual resources and uses these in normal scheduling operation.

因此,您的任务永远挂起,因为调度程序实际上是在等待满足您条件的工作人员出现,以便它可以调度这些任务。除非您创建应用了这些标签的工作人员,否则工作将永远不会开始。

请参阅有关指定和使用 worker resources, and especially the section on Specifying Resources 的 dask 文档,了解有关如何配置 worker 以应用此类资源限制的更多信息。