【问题标题】:Unpickle of a pipeline fail on AWS LambdaAWS Lambda 上的管道解包失败
【发布时间】:2020-08-25 21:08:47
【问题描述】:

首先,很抱歉,如果解决方案已经发布,我查看了很多帖子并没有找到解决方法

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

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

“无法从 ma​​in' 上获取属性 '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() 函数中解压,问题是一样的

非常感谢您的帮助!

亚历克斯

【问题讨论】:

  • 仅供参考,由于此页面的解释,我能够解决此问题:stefaanlippens.net/… 基本上,我需要将主模块和模块拆分为 2 个不同的文件。我相信这是因为 AWS Lambda 的工作方式,尤其是 bootstrap.py。一旦我拆分文件并将导入模块添加到主文件中,代理就明确需要导入它,所以它起作用了。

标签: python scikit-learn aws-lambda pickle xgboost


【解决方案1】:

仅供参考,感谢此页面的解释,我已经能够解决这个问题:

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

基本上,我需要将主模块和模块拆分为 2 个不同的文件。

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

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多