我想在我的分布式群集上运行图表/期货,这些图表/期货都有一个加载数据' 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文件,因为我需要多索引和多列分组等内容。
答案 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-0
或from distributed import Future
load_data_future = Future('load_dataset-0', client=client)
一起使用。确实,问题示例的最后一行可以正常工作:
client.compute()
请记住,它使用内部API方法dask.delayed
和train_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)
将其作为功能请求提出