1

次のように繰り返し構築する配列があります。

step1.shape = (200,200)
step2.shape = (200,200,200)
step3.shape = (200,200,200,200)

次に、次のように変形します。

step4.shape = (200,200**3)

これを行うのは、dask.array.atop では (200,200) -> (200,200**2) のような形状から移動できないようだからです。これは、チャンキングと遅延評価に関連しているためだと思います。

step4 を実行して形状を変更しようとすると、dask は形状を変更する前に行列を計算するようになり、その結果、計算時間とメモリが大幅に使用されます。

これを回避する方法はありますか?

リクエストに応じて、ダミーコードをいくつか示します。

def prod_mat(matrix_a,matrix_b):
    #mat_a.shape = (300,...,300,200)
    #mat_b.shape = (300, 200)
    mat_a = matrix_a.reshape(-1,matrix_a.shape[-1])
    #mat_a = (300**n,200)
    mat_b = matrix_b.reshape(-1,matrix_b.shape[-1])
    #mat_b = (300,200)
    mat_temp = np.repeat(mat_a,matrix_b.shape[0],axis=0)*np.tile(mat_b.T,mat_a.shape[0]).T
    new_dim = int(math.log(mat_temp.shape[0])/math.log(matrix_a.shape[0]))
    new_shape = [matrix_a.shape[0] for n in range(new_dim)]
    new_shape.append(-1)
    result = mat_temp.reshape(tuple(new_shape))
    #result.shape = (300,...,300,300,200)
    return result

b = np.random.rand(300,200)
b = da.from_array(b,chunks=100)
c=da.atop(prod_mat,'ijk',b,'ik',b,'jk')
d=da.atop(prod_mat,'ijkl',c,'ijl',b,'kl')
e=da.atop(prod_mat,'ijklm',d,'ijkm',b,'lm')
f = e.sum(axis=-1)
f.reshape(300,300**3) ----> This is slow, as if it is using compute()
4

1 に答える 1