如果任务之间的数据流很大,那么利用 dask 多处理调度程序的最有效方法是什么?
What is the most efficient way to utilize dask multiprocessing scheduler if data flow between tasks is big?
我们有一个 dask 计算图(非常自定义,所以我们使用 dask delayed 而不是集合)。我在文档中读到当前的调度策略是后进先出,这样工作进程就有很大的机会获得它刚刚计算的数据,以便在图中进一步执行。但据我了解任务
即使在这种情况下,计算结果仍然(反)序列化到硬盘。
所以问题是我要保持多少性能提升
尽可能少的任务沿着图中独立计算的单一路径:
A) 每条路径上有许多小 "map" 任务
t --> t --> t -->...
some reduce stage
t --> t --> t -->...
B) 每个路径都有一个巨大的 "map" 任务
T ->
some reduce stage
T ->
谢谢!
dask multiprocessing 调度程序会自动将线性任务链融合为单个任务,因此您上面的案例 A 将自动成为案例 B。
如果您的工作负载更复杂并且确实需要节点间通信,那么您可能想在单台计算机上尝试分布式调度程序。它更智能地管理工作人员之间的数据移动。
$ pip install dask distributed
>>> from dask.distributed import Client
>>> c = Client() # Starts local "cluster". Becomes the global scheduler
进一步阅读
- http://dask.pydata.org/en/latest/scheduler-choice.html
- http://dask.pydata.org/en/latest/optimize.html
更正
另外,请注意,Dask 不会将中间结果保存在磁盘上。相反,它直接在进程之间传递中间结果。
我们有一个 dask 计算图(非常自定义,所以我们使用 dask delayed 而不是集合)。我在文档中读到当前的调度策略是后进先出,这样工作进程就有很大的机会获得它刚刚计算的数据,以便在图中进一步执行。但据我了解任务 即使在这种情况下,计算结果仍然(反)序列化到硬盘。
所以问题是我要保持多少性能提升 尽可能少的任务沿着图中独立计算的单一路径:
A) 每条路径上有许多小 "map" 任务
t --> t --> t -->...
some reduce stage
t --> t --> t -->...
B) 每个路径都有一个巨大的 "map" 任务
T ->
some reduce stage
T ->
谢谢!
dask multiprocessing 调度程序会自动将线性任务链融合为单个任务,因此您上面的案例 A 将自动成为案例 B。
如果您的工作负载更复杂并且确实需要节点间通信,那么您可能想在单台计算机上尝试分布式调度程序。它更智能地管理工作人员之间的数据移动。
$ pip install dask distributed
>>> from dask.distributed import Client
>>> c = Client() # Starts local "cluster". Becomes the global scheduler
进一步阅读
- http://dask.pydata.org/en/latest/scheduler-choice.html
- http://dask.pydata.org/en/latest/optimize.html
更正
另外,请注意,Dask 不会将中间结果保存在磁盘上。相反,它直接在进程之间传递中间结果。