4

dask のドット積は、numpy よりもはるかに遅く実行されるようです:

import numpy as np
x_np = np.random.normal(10, 0.1, size=(1000,100))
y_np = x_np.transpose()
%timeit x_np.dot(y_np)
# 100 loops, best of 3: 7.17 ms per loop

import dask.array as da
x_dask = da.random.normal(10, 0.1, size=(1000,100), chunks=(5,5))
y_dask = x_dask.transpose()
%timeit x_dask.dot(y_dask)
# 1 loops, best of 3: 6.56 s per loop

その理由が何であるかを知っている人はいますか?ここに欠けているものはありますか?

4

2 に答える 2

5

チャンクサイズを調整する

チャンクサイズを調整する必要があるという@isternbergの回答は正しいです。チャンク サイズの適切な選択は、次の規則に従います。

  1. チャンクは、メモリに快適に収まる程度に小さくする必要があります。
  2. チャンクは、そのチャンクでの計算が、タスクごとに発生する 1 ミリ秒のオーバーヘッドよりも大幅に多くかかるように、十分な大きさでなければなりません (したがって、100 ミリ秒-1 秒は適切な数値です)。
  3. チャンクは、実行する計算に合わせて調整する必要があります。たとえば、特定の次元に沿って頻繁にスライスすることを計画している場合、チャンクが整列されていると、より少ないチャンクに触れる必要があり、より効率的です。

私は通常、1 ~ 100 メガバイトの大きさのチャンクを撮影します。それよりも小さいものは役に立たず、通常、スケジューリングのオーバーヘッドが最大のボトルネックになる十分なタスクが作成されます。

元の質問に関するコメント

配列のサイズのみの場合、(1000, 100)使用する理由はありませんdask.array。代わりに numpy を使用し、複数のコアの使用を本当に気にする場合は、numpy ライブラリが MLK や OpenBLAS などの効率的な BLAS 実装に対してリンクされていることを確認してください。

マルチスレッドの BLAS 実装を使用している場合、実際にはダッシュスレッドをオフにしたい場合があります。2 つのシステムが互いに干渉し合い、パフォーマンスが低下します。この場合は、次のコマンドを使用して、dask スレッドをオフにすることができます。

dask.set_options(get=dask.async.get_sync)

実際に dask.array 計算の実行時間を計るに.compute()は、計算の最後に呼び出しを追加する必要があります。そうしないと、タスク グラフを実行するのではなく、タスク グラフの作成にかかる時間を計るだけです。

より大きな例

In [1]: import dask.array as da

In [2]: x = da.random.normal(10, 0.1, size=(2000, 100000), chunks=(1000, 1000))  # larger example

In [3]: %time z = x.dot(x.T)  # create task graph
CPU times: user 12 ms, sys: 3.57 ms, total: 15.6 ms
Wall time: 15.3 ms

In [4]: %time _ = z.compute()  # actually do work
CPU times: user 2min 41s, sys: 841 ms, total: 2min 42s
Wall time: 21 s
于 2015-12-23T15:11:55.060 に答える
0

チャンクを調整すると、dask での内積の計算がはるかに高速になります。

import dask.array as da
x_dask = da.random.normal(10, 0.1, size=(1000,100), chunks=1000)
y_dask = x_dask.transpose()
%timeit x_dask.dot(y_dask)
# 1000 loops, best of 3: 330 µs per loop

dask docsのチャンクについての詳細。

編集: @MRocklin が書いたように、実際に計算時間を取得する.compute()には、関数を呼び出す必要があります。

于 2015-12-23T11:51:26.663 に答える