【问题标题】:Dask slower than numpyDask 比 numpy 慢
【发布时间】:2022-08-18 23:17:59
【问题描述】:

我是一个新的 dask 用户,我正在尝试在我的程序中运行函数点。我注意到即使我在整个矩阵中只使用一个块,dask 的函数 dot 也比它的 numpy 版本慢。如何解释这种行为?

import dask.array as da 
import numpy as np
x = da.random.normal(10, 0.1, size=(20000 * 100000), chunks=(20000 * 100000))
z = x.dot(x)
%time z.compute()
\'\'\'
CPU times: user 1min 1s, sys: 17.3 s, total: 1min 18s
Wall time: 52 s
\'\'\'
y = x.compute()

%time w =y.dot(y)
\'\'\'
CPU times: user 19 s, sys: 8.24 s, total: 27.2 s
Wall time: 767 ms
\'\'\'
  • 这回答了你的问题了吗? why is dot product in dask slower than in numpy
  • 性能差异有点令人惊讶。但请注意,dask 确实必须分配那个巨大的数组作为任务的一部分。为了公平比较,在时间块内创建 numpy 数组,并确保它的大小与 dask 相同。

标签: python numpy dask


【解决方案1】:

如果你只使用一个块,那么 dask 不可能比 numpy 快。 Dask 正在执行以下操作(非常简单):

  • 启动调度程序。这是一个带有数据库的单独进程,用于跟踪和管理集群中的工作
  • 启动工作器。这是进行计算的地方。工作人员连接到调度程序,调度程序指导集群上节点之间的通信
  • 安排作业。您的主线程与调度程序通信以将任务分解为 dask 可以理解和管理的部分,并执行任何计算以了解数组尺寸、类型和大小,以及多阶段图中的依赖关系。
  • 对输入数据进行序列化、传输和反序列化。你已经很好地使用了 dask.random 创建数组,所以这里没有输入数据。但是您传递给 dask 的任何内容都需要转换为字节字符串并通过端口在进程之间传递。
  • 在工作人员上执行任务。此步骤与您的 numpy 等效项执行完全相同的工作。由于它只是一个块,它不会并行发生。它只是发生在不同的过程中。
  • 对结果进行序列化、传输和反序列化。答案需要通过端口发送回主线程。

这是一个简单的描述,但你明白了。您可以将 dask 运行时视为(并行化的 numpy 运行时)/n_workers + 非并行化运行时 + 开销,而开销并非微不足道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 2018-12-13
    • 2014-02-24
    • 1970-01-01
    • 2019-04-18
    • 2021-06-15
    • 2020-10-22
    相关资源
    最近更新 更多