Как получить модель, хранящуюся в хранилище больших двоичных объектов, из функции Azure, написанной на Python (UnpicklingError) - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть функция Azure, написанная на Python, которая имеет простую цель: вернуть прогноз для нового наблюдения на основе модели, которую я обучил, протестировал и сохранил как BLOB. Я создал модель с помощью записной книжки Jupyter и загрузил ее в хранилище больших двоичных объектов Azure. Я могу прочитать файл модели, но когда я пытаюсь распаковать его, я получаю сообщение об ошибке: Исключение: UnpicklingError: неверный ключ загрузки, '\ xef'.

Я новичок в функциях ML и Azure, поэтому я 'Я не уверен, с чего начать. Я попытался загрузить модель локально, и она работает нормально. Я попытался загрузить файл обратно из хранилища Azure, и он отлично работает.

Файл PKL создается из записной книжки следующим образом:

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

В моей функции Azure я передаюa func.InputStream для метода, который выглядит следующим образом:

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

Файл начинается в отладчике следующим образом (это почти 400 КБ):

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, прежде чем оно будет записано, но это мне кажется неэффективным.

Хотелось бы получить некоторые рекомендации о том, что происходит или что попробовать дальше.

1 Ответ

1 голос
/ 01 октября 2019

Я предполагаю, что это связано с тем, как открыть файл и затем загрузить его в функцию.

Процесс загрузки маринованного файла обратно в программу 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()

Пожалуйста, проверьте и посмотрите, поможет ли это.

Дополнительная ссылка:

Сохранениеи загрузка предметов и использование рассола

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

...