繁体   English   中英

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

[英]Dask Distributed - how to run one task per worker, making that task running on all cores available into the worker?

我是使用distributed python库的新手。 我有4名工人,我已成功为每个工人使用14个核心(在16个可用的核心中)启动了一些并行运行,导致4 * 14 = 56个并行运行的任务。

但是如果我想在每个工人中同时只做一个任务,那该怎么办呢。 通过这种方式,我期望一个任务在工作者上并行使用14个核心。

Dask worker维护一个用于启动任务的线程池。 每个任务始终使用此池中的一个线程。 您无法告诉任务从此池中获取多个线程。

但是,还有其他方法可以控制和限制dask worker中的并发性。 在您的情况下,您可以考虑定义工作者资源 这可以让你阻止许多大任务同时在同一个工人上运行。

在下面的示例中,我们定义每个worker有一个Foo资源,每个任务需要一个Foo才能运行。 这将阻止任何两个任务在同一个worker上同时运行。

dask-worker scheduler-address:8786 --resources Foo=1
dask-worker scheduler-address:8786 --resources Foo=1

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

下面是一个示例,当您希望在python而不是命令行中启动worker时分配资源约束:

from dask.distributed import Client
from dask import delayed
import time
import os

client_with_foo = Client(processes = False,
    n_workers= 2,
    threads_per_worker=10,
    resources = {'foo':1}
               )

@delayed
def do_work(cmd=None, interval=2):
    time.sleep(interval)
    return None


task_graph = []
for i in range(10):
    task_graph.append(do_work())

start = time.time()
result = client_with_foo.compute(task_graph, resources = {'foo':1})
output = client_with_foo.gather(result)
end = time.time()
print(end - start)

分配给两个工作人员的10个2秒任务需要10秒才能执行,因此上述代码的输出大约为10。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM