首页 > 解决方案 > 如何从用 Python 编写的 azure 函数中检索存储在 BLOB 存储中的模型(UnpicklingError)

问题描述

我有一个用 Python 编写的 Azure 函数,其目的很简单:根据我已经训练、测试并存储为 BLOB 的模型返回对新观察的预测。我使用 Jupyter 笔记本创建了模型并将其上传到 Azure BLOB 存储。我可以读取模型文件,但是当我尝试解开它时出现错误:异常:UnpicklingError:无效的加载键,'\xef'。

我是 ML 和 Azure 函数的新手,所以我不知道从哪里开始。我试过在本地加载模型,它工作正常。我试过从 Azure 存储下载文件,它工作正常。

PKL 文件是从这样的笔记本生成的:

pickle.dump(model, open("diabetes-model.pkl", "wb"))

在我的 Azure 函数中,我将 func.InputStream 传递给如下所示的方法:

def do_prediction(modelFileStream):
    mod  = modelFileStream.read()
    modelFileStream.close()
    model = pickle.loads(mod)

该文件在调试器中的开头是这样的(差不多 400KB):

b'\xef\xbf\xbd\x03cxgboost.sklearn\nXGBClassifier\nq\x00)\xef\xbf\xbdq\x01}q\x02(X\t\x00\x00\x00max_depthq\x03K\x0cX\r\x00\x00\x00learning_rateq\x04G?\xef\xbf\xbdz\xef\xbf\xbdG\xef\xbf\xbd\x14{X\x0c\x00\x00\x00n_estimatorsq\x05M,\x01X\t\x00\x00\x00verbosityq\x06K\x01X\x06\x00\x00\x00silentq\x07NX\t\x00\x00\x00objectiveq\x08X\x0f\x00\x00\x00binary:logisticq\tX\x07\x00\x00\x00boosterq\nX\x06\x00\x00\x00gbtreeq\

错误是:异常:UnpicklingError:无效的加载键,'\xef'。

我猜这里存在某种编码问题。我已经看到了一些指导,内容应该在写入之前进行 Base64 编码,但这对我来说似乎效率低下。

希望得到一些关于正在发生的事情或下一步要尝试什么的指导。

标签: pythonazuremachine-learningazure-functionspickle

解决方案


我假设这与打开文件然后将其加载到函数中的方式有​​关。

将腌制文件加载回 Python 程序的过程是**open()**再次使用该函数,但使用 ' rb' 作为第二个参数(而不是 wb)。r stands for read mode and the b stands for binary mode.您将读取一个二进制文件。将此分配给 infile。接下来,使用 pickle.load(),以 infile 作为参数,

infile = open(filename,'rb')
new_dict = pickle.load(infile)
infile.close()

请检查一下是否有帮助。

附加参考:

保存和加载对象以及使用pickle

https://www.datacamp.com/community/tutorials/pickle-python-tutorial


推荐阅读