web-dev-qa-db-ja.com

dask:client.persistとclient.computeの違い

client.persist()client.compute()の違いが何であるかについて混乱しています。両方とも(場合によっては)計算を開始し、両方とも非同期オブジェクトを返しますが、私の簡単な例ではそうではありません。

この例では

_from dask.distributed import Client
from dask import delayed
client = Client()

def f(*args):
    return args

result = [delayed(f)(x) for x in range(1000)]

x1 = client.compute(result)
x2 = client.persist(result)
_

ここで_x1_と_x2_は異なりますが、resultDelayedオブジェクトのリストでもある簡単な計算では、client.persist(result)を使用してclient.compute(result)と同じように計算します。

15
johnbaltis

関連するドキュメントページはこちら: http://distributed.readthedocs.io/en/latest/manage-computation.html#dask-collections-to-futures

あなたが言うように、Client.computeClient.persistの両方が遅延のあるDaskコレクションを取得し、クラスターで実行を開始します。彼らは彼らが返すもので異なります。

  1. Client.persistは、クラスターで実行するために送信された以前の遅延計算のあるdaskコレクションのそれぞれのコピーを返します。これらのコレクションのタスクグラフは、現在実行中のFutureオブジェクトをポイントするだけです。

    したがって、100パーティションのdaskデータフレームを永続化すると、100パーティションのdaskデータフレームが返され、各パーティションは現在クラスターで実行されているfutureを指します。

  2. Client.computeは、コレクションごとに単一のFutureを返します。この未来は、1人のワーカーで収集された単一のPythonオブジェクト結果を指します。これは通常、小さな結果に使用されます。

    したがって、100パーティションのdask.dataframeを計算すると、単一のPandasすべてのデータを保持するデータフレームを指すFutureが返されます

より実用的には、結果が大きく、多くのコンピューターに分散する必要がある場合は、persistを使用し、結果が小さく、1台のコンピューターだけで実行したい場合は、computeを使用することをお勧めします。

実際には、私はめったにClient.computeを使用しません。代わりに、中間ステージングにpersistを使用し、dask.computeを使用して最終結果をプルダウンする方を好みます。

df = dd.read_csv('...')
df = df[df.name == 'alice']
df = df.persist()  # compute up to here, keep results in memory

>>> df.value.max().compute()
100

>>> df.value.min().compute()
0

遅延使用の場合

遅延オブジェクトは「パーティション」を1つしか持たないため、計算と永続化はより交換可能です。 Persistは遅延のあるdask.delayedオブジェクトを返し、computeは即時のFutureオブジェクトを返します。

27
MRocklin