代码之家  ›  专栏  ›  技术社区  ›  rth

Dask中具有可重用自定义图的机会缓存

  •  2
  • rth  · 技术社区  · 7 年前

    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))
    

    这将产生 2 3 正如所料。

    现在我们启用了机会主义缓存,

    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 ?

    问题是,在复杂图中,随机步骤名称需要考虑提供给其子步骤的所有输入的散列,这意味着需要进行完整的图解析。

    1 回复  |  直到 7 年前
        1
  •  3
  •   jiminy_crist    7 年前

    dask图中的键名必须是唯一的(如上所述),这一点很重要。此外,我们希望相同的计算具有相同的密钥,这样我们可以避免多次计算它们-虽然dask不需要这样做,但它只是提供了一些优化的机会。

    在达斯克的内部,我们利用 dask.base.tokenize 计算输入的“哈希”,从而得到确定性的键名。您也可以自由使用此功能。在您上面链接的问题中,我们说函数是公共的,只是因为实现可能会更改(而不是签名)。

    还要注意,对于许多用例,我们建议使用 dask.delayed 现在不再使用自定义图形来生成自定义计算。这将在幕后为您执行确定性哈希。