在延迟密钥中隐藏散列中的一些参数 (to_task_dask)

Hiding some parameters from the hashing in the delayed key (to_task_dask)

考虑以下用法:

In [49]: class MyClass(dict):
    ...:     def __init__(self,a):
    ...:         self.a = a
    ...:     def get(self):
    ...:         return a
    ...:     

In [50]: a = MyClass(10)

In [51]: @delayed(pure=True)
    ...: def myFunc(a):
    ...:     return a
    ...: 

In [52]: myFunc(a)
Out[52]: Delayed('myFunc-96ed02ea2192c363a45cec74ef5eaefb')

In [53]: myFunc(a)
Out[53]: Delayed('myFunc-96ed02ea2192c363a45cec74ef5eaefb')

In [54]: a = MyClass(10)

In [55]: myFunc(a)
Out[55]: Delayed('myFunc-96ed02ea2192c363a45cec74ef5eaefb')

In [56]: a.a = 1000

In [57]: myFunc(a)
Out[57]: Delayed('myFunc-96ed02ea2192c363a45cec74ef5eaefb')

In [58]: a['foo'] = 'bar'

In [59]: myFunc(a)
Out[59]: Delayed('myFunc-bf4162396d43f090e476de70d30de251')

我的目的是告诉 dask 在计算用于缓存目的的函数纯度时使用哪些参数。这在某些情况下很有用,例如,如果对象具有具有某些数据检索方法的子例程,而这些方法又依赖于内部参数(例如绘图参数)。如果我通过 dask 传递这个数据对象,我显然不希望延迟实例的键在更改这些参数时发生变化。但是,我确实希望保存数据本身(基本上,self[key] = val 在这里,这就是正在发生的事情)。

这似乎可以解决问题。

我想问一下,这种行为会被支持吗?或者,还有更好的方法?或者这与 dask 的愿景不相符?谢谢!

如果您的任务有特殊的命名方案,那么一种选择是使用 dask_key_name= 关键字选项明确提供名称。

In [1]: import dask

In [2]: @dask.delayed(pure=True)
   ...: def f(x, y=10):
   ...:     return x + y
   ...: 

In [3]: f(1, y=10)
Out[3]: Delayed('f-3361ad78bd5bb95a5f748567a245a09e')

In [4]: f(1, y=11)
Out[4]: Delayed('f-4bf1967f6713377c1c0fab72b60ebfd3')

In [5]: f(1, y=10, dask_key_name='f-1')
Out[5]: Delayed('f-1')

In [6]: f(1, y=11, dask_key_name='f-1')
Out[6]: Delayed('f-1')

您可以将其与 dask 的标记化功能 dask.base.tokenize 一起使用来构建您自己的 dask.delayed 变体,该变体仅对您关心的输入进行标记化。