可序列化对象在 dask 中不可序列化

问题描述 投票:0回答:0

我在以下函数上调用 dask.delay,用于循环中的多个“自我”(同一类的不同对象)。

这是延迟函数,在 keras.engine.training.Model 的自定义子类中定义:

def fit(self, X: Union[pd.DataFrame, list, np.array], y=None):
        if not isinstance(X, pd.DataFrame):
            super().fit(X, y) # calls keras.models fit
            return
        df = X
        X, y = self.to_supervised(df, to_train=True) # transforms df into a supervised problem
        self.history = super().fit(X, y)
        return self

这就是我在循环中延迟和计算函数的方式:

def fit_estimator(estimator, train_df):
    return estimator.fit(train_df) #calls fit method shown previously

lazy_results = []
for mlp in mlps:
    lazy_result = dask.delayed(fit_estimator)(mlp,train_df.copy())
    lazy_results.append(lazy_result)
lazy_results = dask.compute(*lazy_results)

这个子类有一个名为“network”的对象属性,类型为tensorflow.python.trackable.data_structures._DictWrapper。 这个对象是可序列化的,因为 pickle.dumps 和 dask 的序列化 API 也可以序列化它。此外,整个子类的对象的序列化/反序列化工作没有任何问题。 但是,当我调用 lazy_results = dask.compute(*lazy_results) 时,会抛出错误“Exception: TypeError("can not serialize '_DictWrapper' object")”。更具体地说,返回“自我”并因此对其进行序列化是这里的问题。

  • Dask版本:2022.12.1
  • Python版本:3.9

如果我不在“fit”中返回“self”而是直接返回它的序列化,它工作正常,但我必须在调度程序接收到序列化对象后手动反序列化它。 我错过了什么或者这是一个错误吗?

如果我不在“fit”中返回“self”而是直接返回它的序列化,它工作正常,但我必须在调度程序接收到序列化对象后手动反序列化它。我错过了什么或者这是一个错误吗?

python serialization dask dask-delayed
© www.soinside.com 2019 - 2024. All rights reserved.