1

我也有大数组可以在大量迭代中相乘。

我正在训练一个数组长约 1500 的模型,我将执行 3 次乘法约 1000000 次,这几乎需要一周的时间。

我发现 Dask 我试图将它与普通的 numpy 方式进行比较,但我发现 numpy 更快:

x = np.arange(2000)

start = time.time()
y = da.from_array(x, chunks=(100))

for i in range (0,100):
    p = y.dot(y)

#print(p)
print( time.time() - start)

print('------------------------------')

start = time.time()

p = 0

for i in range (0,100):
    p = np.dot(x,x)

print(time.time() - start)

0.08502793312072754

0.00015974044799804688

我是用错了 dask 还是 numpy 这么快?

4

1 回答 1

2

性能.dot很大程度上取决于NumPy 实现所链接到 的BLAS 库。

如果您有像 OpenBLAS 或 MKL 这样的现代实现,那么 NumPy 已经使用您的所有内核全速运行。在这种情况下, dask.array可能只会妨碍,在没有保证的情况下尝试添加进一步的并行性,从而导致线程争用。

如果您已经通过 Anaconda 安装了 NumPy,那么您可能已经安装了 OpenBLAS 或 MKL,所以我会对您拥有的性能感到满意并收工。

但是,在您的实际示例中,您使用的块太小(chunks=(100,))。dask 任务调度程序会为每个任务带来大约一毫秒的开销。您应该选择一个块大小,以便每个任务花费 100 毫秒的时间,以隐藏​​此开销。一般来说,一个好的经验法则是针对大小超过 1 MB 的块。这就是导致您所看到的性能差异很大的原因。

于 2016-06-23T20:05:53.090 回答