首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性错误: pickle.load() Seldon部署

属性错误: pickle.load() Seldon部署
EN

Stack Overflow用户
提问于 2021-10-20 22:44:29
回答 1查看 179关注 0票数 1

我在做赛尔登的部署。我已经使用sklearn创建了自定义管道,它位于MyPipelines/CustomPipelines.py.目录中。主要代码my_prediction.py是seldon默认将执行的文件(基于我的配置)。在此文件中,我将导入自定义管道。如果我在本地( my_prediction.py )执行了PyCharm,它就会执行得很好。但是,如果我使用Seldon部署它,就会得到错误:Attribute Error: Can't get Attribute 'MyEncoder'

它无法在CustomPipelines.py中加载模块。我尝试了来自Unable to load files using pickle and multiple modules的所有解决方案,它们都没有起作用。

MyPipelines/CustomPipelines.py

代码语言:javascript
复制
from sklearn.preprocessing import LabelEncoder
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline

class MyEncoder(BaseEstimator, TransformerMixin):
    def __init__(self):
        super().__init__()

    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
        df = X
        vars_cat = [var for var in df.columns if df[var].dtypes == 'O']
        cat_with_na = [var for var in vars_cat if df[var].isnull().sum() > 0]
        df[cat_with_na] = df[cat_with_na].fillna('Missing')

        return df

my_prediction.py

代码语言:javascript
复制
import pickle
import pandas as pd
import dill
from MyPipelines.CustomPipelines import MyEncoder
from MyPipelines.CustomPipelines import *
import MyPipelines.CustomPipelines

class my_prediction:
   
    def __init__(self):

        file_name = 'model.sav'
        with open(file_name, 'rb') as model_file:
                self.model = pickle.load(model_file)

    def predict(self, request):
        data = request.get('ndarray')
        columns = request.get('names')
        X = pd.DataFrame(data, columns = columns)
        predictions = self.model.predict(X)
        return predictions

错误:

代码语言:javascript
复制
File microservice/my_prediction.py in __init__                       
self.model = pickle.load(model_file)                 
Attribute Error: Can't get Attribute 'MyEncoder' on <module '__main__' from 'opt/conda/bin/seldon-core-microservice'
EN

回答 1

Stack Overflow用户

发布于 2021-10-27 15:27:47

pickle模块的约束之一是,它期望相同的类(在同一个模块下)在工件未被提取的环境中可用。在这种情况下,您的my_prediction类似乎试图解开MyEncoder工件,但该类在该环境中不可用。

作为一种快速解决方法,您可以尝试在运行MyEncoder的环境中使用您的my_prediction类(也可以在其中显示相同的文件夹/文件)。否则,您可以查看pickle的替代方案,比如cloudpickledill,它们也可以序列化您的自定义代码(尽管它们也附带了自己的一组注意事项)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69653835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档