2016-09-06 8 views
1

При работе с 2D-данными я вижу небольшое ускорение на 2D-массивах, но даже на больших 1D-массивах это преимущество исчезает.Может ли Dask обеспечить ускорение для 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 

Может Даск обеспечить ускорение для 1D массивов и, если да, то что бы идеальный размер порции быть?

ответ

3

Отношение FLOP/Byte все еще слишком низкое. ЦП не является узким местом, и ваша иерархия памяти.

Кроме того, chunksizes (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