dask:client.persist 和 client.compute 之间的区别

Posted

技术标签:

【中文标题】dask:client.persist 和 client.compute 之间的区别【英文标题】:dask: difference between client.persist and client.compute 【发布时间】:2017-06-07 23:49:03 【问题描述】:

我对@9​​87654321@ 和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)

这里x1x2 是不同的,但在一个不太简单的计算中result 也是Delayed 对象的列表,使用client.persist(result) 开始计算就像client.compute(result) 一样。

【问题讨论】:

你确定这段代码是正确的吗?你不是说delayed(f)(x)吗? 【参考方案1】:

相关文档页面在这里:http://distributed.readthedocs.io/en/latest/manage-computation.html#dask-collections-to-futures

正如你所说,Client.computeClient.persist 都采用惰性 Dask 集合并启动它们在集群上运行。它们返回的内容不同。

    Client.persist 为每个 dask 集合返回一个副本,它们以前的惰性计算现在已提交以在集群上运行。这些集合的任务图现在只指向当前运行的 Future 对象。

    因此,如果您保留一个包含 100 个分区的 dask 数据帧,您将返回 具有 100 个分区的 dask 数据帧,每个分区指向 当前在集群上运行的未来。

    Client.compute 为每个集合返回一个 Future。这个未来是指在一个工作人员上收集的单个 Python 对象结果。这通常用于小的结果。

    因此,如果您计算一个包含 100 个分区的 dask.dataframe,您会得到一个 Future 指向一个包含所有数据的 Pandas 数据帧

更实用的是,我建议在您的结果很大并且需要分布在多台计算机上时使用持久化,而当您的结果很小并且只希望在一台计算机上使用时使用计算。

在实践中,我很少使用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

使用延迟时

无论如何,延迟对象都只有一个“分区”,因此计算和持久化更容易互换。 Persist 会给你一个惰性的 dask.delayed 对象,而计算会给你一个即时的 Future 对象。

【讨论】:

df.persist()和client.persist(df)有区别吗? 没有。我建议今天使用df.persist 我发现@MRocklin 的这个视频非常有用。 persist() 返回一个 Dask 对象(例如 Dask DF 或 Array)。 compute() 返回一个非 dask 对象(如 numpy 数组或 pandas DF)。对小结果使用 compute(),对大的中间结果使用 persist()。链接:youtu.be/MsnzpzFZAoQ

以上是关于dask:client.persist 和 client.compute 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

与 Dask 共享内存

Dask:我如何将我的代码与 dask 延迟并行化?

compute() 在 dask 中做啥?

深度学习核心技术精讲100篇(八十五)-Dask 分布高性能计算深入讲解

Dask-Rapids 数据移动和内存不足问题

Dask:凸矩阵优化