Chaitanya Patil
Chaitanya Patil

Reputation: 333

Attribute Error : pickle.load() Seldon Deployment

I am doing a seldon deployment. I have created custom pipelines using sklearn and it is in the directory MyPipelines/CustomPipelines.py. The main code ie. my_prediction.py is the file which seldon will execute by default (based on my configuration). In this file I am importing the custom pipelines. If I execute my_prediction.py in my local (PyCharm) it executes fine. But If I deploy it using Seldon I get the error : Attribute Error: Can't get Attribute 'MyEncoder'

It is unable to load modules in CustomPipelines.py. I tried all the solutions from Unable to load files using pickle and multiple modules None of them worked.

MyPipelines/CustomPipelines.py

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

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

Error:

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'

Upvotes: 1

Views: 413

Answers (1)

One of the constrains of the pickle module is that it expects that the same classes (under the same module) are available in the environment where the artifact gets unpickled. In this case, it seems like your my_prediction class is trying to unpickle a MyEncoder artifact, but that class is not available on that environment.

As a quick workaround, you could try to make your MyEncoder class available on the environment where my_prediction runs on (i.e. having the same folders / files present there as well). Otherwise, you could look at alternatives to pickle, like cloudpickle or dill, which can serialise your custom code as well (although these also come with their own set of caveats).

Upvotes: 2

Related Questions