无法在AWS Lambda上管道失败

问题描述

首先,很抱歉,如果解决方案已经发布,我看了这么多帖子,却找不到解决该问题的方法

我有一个Python类可以在我的机器上正常工作,以便训练+运行ML模型。

我想在AWS Lambda上执行RUN(并且仅运行),但是在pickle.load期间失败,因为它似乎找不到管道使用的转换函数(尽管它们在代码中可用)

“无法从以下位置获取 main '上的'myMLClass'属性 '/var/runtime/awslambda/bootstrap.py'>“,” errorType“:” AttributeError“

代码是Python 3.6中的代码,它使用sklearn管道,XGBOOST和Pickle来保存/加载模型。

这是它的概述:

import stuff

class myMLClass:

    def myTransformation(self,dataframe): 
        #myTransformations

    def train_model(self)
        preprocessor = FunctionTransformer(myTransformation,validate=False)
        xgb = XGBClassifier()
        pipeline_xgb = make_pipeline(preprocessor,xgb)
        #[XGB Stuff: fit,predict,...]
        with open("myTrainedPipeline.pkl",'wb') as file:
            pickle.dump(pipeline_xgb,file)

    def run_model(self)
        with open("myTrainedPipeline.pkl",'rb') as file:
            pipeline = pickle.load(file)    ==> Which trigger the error

def main():
    myObject = myMLClass("DEV")
    myObject.run_model()

同样,同一课在我的机器上可以正常进行训练和跑步。我知道Pickle不会序列化转换函数,而只是对其进行序列化,因此这就是为什么我将训练和跑步两种操作都包含在同一类中的原因

注意:,如果我尝试从main()函数中解除锁定,则会出现相同的问题

非常感谢您的帮助!

亚历克斯

解决方法

仅供参考,由于此页面的解释,我得以解决此问题:

https://www.stefaanlippens.net/python-pickling-and-dealing-with-attributeerror-module-object-has-no-attribute-thing.html

基本上,我需要将main和module分成2个不同的文件。

我相信这是因为AWS Lambda的工作方式,尤其是bootstrap.py。拆分之后,对于代理来说,明确需要导入专用模块,因为导入是在主容器中声明的