覆盖dask调度程序以同时加载多个worker上的数据

时间:2018-01-17 10:54:22

标签: dask dask-distributed

我想在我的分布式群集上运行图表/期货,这些图表/期货都有一个加载数据' root任务,然后是一系列针对该数据运行的培训任务。简化版本如下所示:

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()方法让所有工作人员同时读取文件,但是如何获取您已阅读的数据以提供给下游任务?< / p>

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

2 个答案:

答案 0 :(得分:2)

重温了此问题,并找到了一个相对简单的解决方案,尽管它使用内部API方法并涉及对created_at的阻塞调用。使用与问题中相同的变量:

folder = graphServiceClient.Me.Drive.Items[parentItem.Id].Children.Request().AddAsync(new DriveItem
            {
                Name = 'Name of the folder',
                Folder = new Folder()
            }).Result;

现在,如果您运行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) 。要在下游计算中使用此功能,您只需为密钥创建一个Future:

client.has_what()

,它可以照常与load_dataset-0from distributed import Future load_data_future = Future('load_dataset-0', client=client) 一起使用。确实,问题示例的最后一行可以正常工作:

client.compute()

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

答案 1 :(得分:0)

截至今天(distributed.__version__ == 1.20.2)你所要求的是不可能的。最接近的是计算一次,然后显式复制数据

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

您可能希望在https://github.com/dask/distributed/issues/new

将其作为功能请求提出