在处理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
但是在1D:
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可以为1D阵列提供加速,如果是这样,理想的块大小会是多少?
答案 0 :(得分:3)
您的FLOP /字节比率仍然太低。 CPU不是瓶颈,而是你的内存层次结构。
此外,(2000,)的chunksizes对于Dask.array而言太小而无意义。回想一下,dask会为每个任务带来几百微秒的开销,因此你所做的每项任务都应该比这要长得多。这解释了你所看到的300毫秒的持续时间。
In [11]: 10e5 / 2000 # number of tasks
Out[11]: 500.0
但即使你选择更大的块,你也不会在这个计算上获得任何加速:
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