Dask Distributed - 如何为每个工作线程运行一个任务,使该任务在工作线程可用的所有核心上运行?

You*_*cef 6 python cpu-cores dask-distributed

我对使用distributedpython 库非常陌生。我有 4 个工作线程,并且我已经为每个工作线程使用 14 个核心(在 16 个可用核心中)成功启动了一些并行运行,从而导致 4*14=56 个任务并行运行。

但是,如果我只想让每个工人同时执行一项任务,该怎么办?这样,我期望在工作线程上并行使用 14 个内核执行一项任务。

MRo*_*lin 6

Dask 工作线程维护一个用于启动任务的线程池。每个任务始终消耗该池中的一个线程。您无法告诉任务从该池中获取许多线程。

但是,还有其他方法可以控制和限制 dask 工作线程中的并发性。根据您的情况,您可能会考虑定义工作人员资源。这可以让您阻止许多大型任务同时在相同的工作线程上运行。

在下面的示例中,我们定义每个工作线程都有一个Foo资源,并且每个任务都需要一个资源Foo来运行。这将阻止任何两个任务在同一工作线程上同时运行。

dask-worker scheduler-address:8786 --resources Foo=1
dask-worker scheduler-address:8786 --resources Foo=1
Run Code Online (Sandbox Code Playgroud)

from dask.distributed import Client
client = Client('scheduler-address:8786')
futures = client.map(my_expensive_function, ..., resources={'Foo': 1})
Run Code Online (Sandbox Code Playgroud)

  • 当运行 num_workers > 0 的 pytorch 模型时,这是一个非常重要的答案。并发是杀手,有挂起的 dask 工作线程等。 (2认同)