重写dask计划程序以同时加载多个工作进程上的数据

重写dask计划程序以同时加载多个工作进程上的数据,dask,dask-distributed,Dask,Dask Distributed,我想在分布式集群上运行graphs/futures,这些集群都有一个“加载数据”根任务,然后是一组在该数据上运行的训练任务。简化版本如下所示: from dask.distributed import Client client = Client(scheduler_ip) load_data_future = client.submit(load_data_func, 'path/to/data/') train_task_futures = [client.submit(train_func

我想在分布式集群上运行graphs/futures,这些集群都有一个“加载数据”根任务,然后是一组在该数据上运行的训练任务。简化版本如下所示:

from dask.distributed import Client
client = Client(scheduler_ip)
load_data_future = client.submit(load_data_func, 'path/to/data/')
train_task_futures = [client.submit(train_func, load_data_future, params) 
                      for params in train_param_set]
如上所述运行调度程序会让一个工人读取文件,然后将数据溢出到磁盘,与其他工人共享。然而,加载数据通常是从一个大的HDF5文件中读取,这可以并发完成,因此我想知道是否有一种方法可以强制所有工作人员并发读取此文件(他们都计算根任务),而不是让他们等待一个工作人员完成,然后缓慢地从该工作人员传输数据

我知道有一种
client.run()
方法,我可以使用它让所有工作人员同时读取该文件,但是您如何才能获取已读取的数据以将其输入下游任务

我无法使用dask数据原语同时读取HDF5文件,因为我需要多个索引和在多个列上分组。

从今天开始(
distributed.\uuu version\uu==1.20.2
)您所要求的是不可能的。最接近的方法是计算一次,然后显式地复制数据

future = client.submit(load, path)
wait(future)
client.replicate(future)

您可能希望在

中作为功能请求提出此问题。再次查看此问题并找到了一个相对简单的解决方案,尽管它使用内部API方法并涉及对
client.run()的阻塞调用。使用与问题中相同的变量:

from distributed import get_worker
client_id = client.id
def load_dataset():
    worker = get_worker()
    data = {'load_dataset-0': load_data_func('path/to/data')}
    info = worker.update_data(data=data, report=False)
    worker.scheduler.update_data(who_has={key: [worker.address] for key in data}, 
                                 nbytes=info['nbytes'], client=client_id)
client.run(load_dataset)
现在,如果运行
client.has\u what()
您应该会看到每个工作人员都持有键
load\u dataset-0
。要在下游计算中使用此选项,只需为密钥创建未来:

from distributed import Future
load_data_future = Future('load_dataset-0', client=client)
这可以像往常一样与
client.compute()或
dask.delayed一起使用。事实上,问题中示例的最后一行很好:

train_task_futures = [client.submit(train_func, load_data_future, params) 
                      for params in train_param_set]
请记住,它使用内部API方法
Worker.update_data
Scheduler.update_data
并在
发布时运行良好。u版本=1.21.6
,但可能会在将来的版本中发生更改