2016-09-06 39 views
1

当处理2D数据时,我发现2D阵列上的速度略有提升,但即使在优势消失的大型1D阵列上也是如此。Can Dask可以提供一维数组的加速吗?

例如,在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,支持一维数组提供了一个加速,如果是的话,理想的数据块大小是什么呢?

回答

3

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

此外,(2000,)的块大小对于Dask.array来说太小而没有意义。回想一下,dask引入了每个任务几百微秒的开销,所以你做的每个任务都应该比这个长得多。这解释了你看到的300毫秒的持续时间。

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

但是,即使你去大chunksizes你没有得到这个任何计算加速:

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 
相关问题