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



Dask 支持定义自定义计算图以及机会缓存。问题是如何将它们一起使用。

例如,让我们定义一个非常简单的计算图,它计算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 并附加到图形中的所有键。有没有更简单的方法,特别是因为tokenize函数不是公共API的一部分?

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

重要的是,

dask 图中的关键名称是唯一的(如上面所发现的(。此外,我们希望相同的计算具有相同的键,这样我们就可以避免多次计算它们 - 这不是 dask 工作所必需的,它只是提供了一些优化的机会。

在 dask 的内部结构中,我们利用 dask.base.tokenize 来计算输入的"哈希",从而产生确定性的键名。您也可以自由使用此功能。在您上面链接的问题中,我们说该函数是公开的,只是实现可能会更改(而不是签名(。

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

最新更新