当计算速度比 dask 分布式传输速度更快时如何复制数据?
How to replicate data when it is faster to compute than transfer in dask distributed?
我有一个较大的对象 (150 MB),我需要将其广播给所有 dask 分布式工作人员,以便在未来的任务中使用。我尝试了几种方法:
Client.scatter(broadcast=True)
:这需要从一台机器(我在其中 运行 连接客户端和调度程序)发送所有数据,这会造成带宽瓶颈。
Client.submit
后跟 Client.replicate
:这些工作人员共享一个文件系统,因此我可以安排加载数据的任务,然后将数据复制到所有工作人员,而不是发送数据。这似乎使用树策略来分发数据,这比以前的选项更快。
但是,强制每个工作人员 运行 在本地加载数据功能可能会更快,而不是将数据加载到一个工作人员上并将其序列化为从一个工作人员到另一个工作人员。有没有办法做到这一点? Client.run
似乎是我想要的一部分,但我需要为加载的数据找回未来,我可以稍后将其传递给其他任务。
这里的简短回答是 "no",没有直接的方法来完成这个。如果您习惯于使用内部代码(可能会在没有警告的情况下更改),则可以将某些东西组合在一起。
另一种方法是定义对象序列化的计算行为,然后在反序列化代码中再次调用该函数。
我遇到了与我在 Whosebug 上询问并最近解决的完全相同的问题,请参阅 了解我的解决方案。
我有一个较大的对象 (150 MB),我需要将其广播给所有 dask 分布式工作人员,以便在未来的任务中使用。我尝试了几种方法:
Client.scatter(broadcast=True)
:这需要从一台机器(我在其中 运行 连接客户端和调度程序)发送所有数据,这会造成带宽瓶颈。Client.submit
后跟Client.replicate
:这些工作人员共享一个文件系统,因此我可以安排加载数据的任务,然后将数据复制到所有工作人员,而不是发送数据。这似乎使用树策略来分发数据,这比以前的选项更快。
但是,强制每个工作人员 运行 在本地加载数据功能可能会更快,而不是将数据加载到一个工作人员上并将其序列化为从一个工作人员到另一个工作人员。有没有办法做到这一点? Client.run
似乎是我想要的一部分,但我需要为加载的数据找回未来,我可以稍后将其传递给其他任务。
这里的简短回答是 "no",没有直接的方法来完成这个。如果您习惯于使用内部代码(可能会在没有警告的情况下更改),则可以将某些东西组合在一起。
另一种方法是定义对象序列化的计算行为,然后在反序列化代码中再次调用该函数。
我遇到了与我在 Whosebug 上询问并最近解决的完全相同的问题,请参阅