【问题标题】:why is dot product in dask slower than in numpy为什么 dask 中的点积比 numpy 慢
【发布时间】:2016-01-21 16:02:33
【问题描述】:

dask 中的点积似乎比 numpy 中的运行速度慢得多:

import numpy as np
x_np = np.random.normal(10, 0.1, size=(1000,100))
y_np = x_np.transpose()
%timeit x_np.dot(y_np)
# 100 loops, best of 3: 7.17 ms per loop

import dask.array as da
x_dask = da.random.normal(10, 0.1, size=(1000,100), chunks=(5,5))
y_dask = x_dask.transpose()
%timeit x_dask.dot(y_dask)
# 1 loops, best of 3: 6.56 s per loop

有人知道这可能是什么原因吗?我在这里有什么遗漏吗?

【问题讨论】:

  • 这个问题本质上是由矩阵大小引起的,而不是由点和我认为在这方面起主要作用的块。
  • @saopayne,谢谢。块确实起着重要作用。
  • 调整和解决问题是我们注册的目的:)

标签: python numpy profiling dask


【解决方案1】:

调整块大小

@isternberg 的回答是正确的,您应该调整块大小。一个好的块大小选择遵循以下规则

  1. 一个块应该足够小以舒适地放入内存中。
  2. 一个块必须足够大,这样在该块上的计算所花费的开销远远超过 dask 产生的每个任务的 1ms 开销(因此 100ms-1s 是一个很好的目标)。
  3. 块应该与您想要执行的计算对齐。例如,如果您计划经常沿特定维度进行切片,那么将块对齐会更有效,这样您就必须接触更少的块。

我通常会拍摄 1-100 兆字节的块。任何小于该值的东西都没有帮助,而且通常会创建足够多的任务,导致调度开销成为我们最大的瓶颈。

对原问题的评论

如果您的数组大小仅为(1000, 100),则没有理由使用dask.array。相反,请使用 numpy,如果您真的关心使用多核,请确保您的 numpy 库与 MLK 或 OpenBLAS 等高效的 BLAS 实现链接。

如果您使用多线程 BLAS 实现,您实际上可能想要关闭 dask 线程。这两个系统将相互干扰并降低性能。如果是这种情况,那么您可以使用以下命令关闭 dask 线程。

dask.set_options(get=dask.async.get_sync)

要实际计时执行 dask.array 计算,您必须在计算结束时添加 .compute() 调用,否则您只是在计时创建任务图所需的时间,而不是执行它。

更大的例子

In [1]: import dask.array as da

In [2]: x = da.random.normal(10, 0.1, size=(2000, 100000), chunks=(1000, 1000))  # larger example

In [3]: %time z = x.dot(x.T)  # create task graph
CPU times: user 12 ms, sys: 3.57 ms, total: 15.6 ms
Wall time: 15.3 ms

In [4]: %time _ = z.compute()  # actually do work
CPU times: user 2min 41s, sys: 841 ms, total: 2min 42s
Wall time: 21 s

【讨论】:

    【解决方案2】:

    调整块时,dask中点积的计算运行得更快:

    import dask.array as da
    x_dask = da.random.normal(10, 0.1, size=(1000,100), chunks=1000)
    y_dask = x_dask.transpose()
    %timeit x_dask.dot(y_dask)
    # 1000 loops, best of 3: 330 µs per loop
    

    更多关于 dask 中的块 docs.

    编辑: 正如@MRocklin 所写,要真正获得计算时间,必须在函数上调用.compute()

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2023-03-09
      • 2017-10-28
      • 2017-11-09
      • 2013-12-07
      • 2014-08-10
      相关资源
      最近更新 更多