gpt4 book ai didi

python - Dask 能否为一维数组提供加速?

转载 作者:行者123 更新时间:2023-11-30 22:50:26 39 4
gpt4 key购买 nike

在处理 2D 数据时,我发现 2D 数组的速度略有加快,但即使在大型 1D 数组上,这种优势也消失了。

例如,在 2D 中:

In [48]: x = np.random.random((3000, 2000))

In [49]: X = da.from_array(x, chunks=(500,500))

In [50]: %timeit (np.cumsum(x - x**2, axis=0))
10 loops, best of 3: 131 ms per loop

In [51]: %timeit (da.cumsum(X - X**2, axis=0)).compute()
10 loops, best of 3: 89.3 ms per loop

但是在一维中:

In [52]: x = np.random.random(10e5)

In [53]: X = da.from_array(x, chunks=(2000,))

In [54]: %timeit (np.cumsum(x - x**2, axis=0))
100 loops, best of 3: 8.28 ms per loop

In [55]: %timeit (da.cumsum(X - X**2, axis=0)).compute()
1 loop, best of 3: 304 ms per loop

Dask 能否为一维数组提供加速,如果可以,理想的 block 大小是多少?

最佳答案

您的 FLOP/Byte 比率仍然太低。 CPU 不是瓶颈,内存层次才是。

此外,(2000,) 的 block 大小对于 Dask.array 来说太小了,没有意义。回想一下,dask 会为每个任务带来几百微秒的开销,因此您执行的每个任务应该比这个长得多。这解释了您所看到的 300 毫秒的持续时间。

In [11]: 10e5 / 2000  # number of tasks
Out[11]: 500.0

但即使您确实选择更大的 block 大小,您也不会在此计算上获得任何加速:

In [15]: x = np.random.random(1e8)
In [16]: X = da.from_array(x, chunks=1e6)

In [17]: %timeit np.cumsum(x - x**2, axis=0)
1 loop, best of 3: 632 ms per loop

In [18]: %timeit da.cumsum(X - X**2, axis=0).compute()
1 loop, best of 3: 759 ms per loop

但是,如果您执行的操作需要每个字节进行更多计算,那么您就进入了并行处理实际上可以提供帮助的状态。例如 arcsinh 实际上计算起来相当昂贵:

In [20]: %timeit np.arcsinh(x).sum()
1 loop, best of 3: 3.32 s per loop

In [21]: %timeit da.arcsinh(X).sum().compute()
1 loop, best of 3: 724 ms per loop

关于python - Dask 能否为一维数组提供加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39344258/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com