在Dask中使用可重用的自定义图形进行机会缓存

时间:2018-01-10 09:12:59

标签: python caching dask

Dask支持定义custom computational graphs以及opportinistic caching。问题是它们如何一起使用。

例如,让我们定义一个非常简单的计算图,它计算x+1运算,

import dask

def compute(x):
    graph = {'step1': (sum, [x, 1])}
    return dask.get(graph, 'step1')

print('Cache disabled:', compute(1), compute(2))

按预期产生23

现在我们启用机会缓存,

from dask.cache import Cache

cc = Cache(1e9)
cc.register()

print('Cache enabled: ', compute(1), compute(2))
print(cc.cache.data)

我们在两种情况下都得不到2的结果,因为无论输入如何,cc.cache.data都是{'step1': 2}

我想这意味着需要对输入进行哈希处理(例如使用dask.base.tokenize并附加到图中的所有键。是否有更简单的方法,尤其是the tokenize function is not part of the public API?< / p>

问题在于,在复杂的图形中,随机步骤名称需要考虑提供给它的子步骤的所有输入的哈希值,这意味着完成图形分辨率是必要的

1 个答案:

答案 0 :(得分:2)

重要的是,dask图中的关键名称是唯一的(如上所述)。另外,我们希望相同的计算具有相同的密钥,因此我们可以避免多次计算它们 - 这对于dask工作来说并不是必需的,它只是提供了一些优化机会。

在dask的内部,我们使用dask.base.tokenize来计算&#34;哈希&#34;输入,导致确定性的键名。您也可以自由使用此功能。在上面链接的问题中,我们说该函数是公共的,只是实现可能会改变(而不是签名)。

另请注意,对于许多用例,我们建议现在使用dask.delayed而不是自定义图表来生成自定义计算。这将在幕后为您进行确定性哈希。