Платформа Google AI: непредвиденная ошибка при загрузке модели: объект 'str' не имеет атрибута 'decode' [Keras 2.3.1, TF 1.15]

Я пытаюсь использовать бета-версию Google Custom Prediction Routine в Google AI Platform для запуска действующей версии моей модели.

Я включаю в свой пакет predictor.py который содержит Predictor класс как таковой:

import os
import numpy as np
import pickle
import keras
from keras.models import load_model

class Predictor(object):
    """Interface for constructing custom predictors."""

    def __init__(self, model, preprocessor):
        self._model = model
        self._preprocessor = preprocessor

    def predict(self, instances, **kwargs):
        """Performs custom prediction.

        Instances are the decoded values from the request. They have already
        been deserialized from JSON.

        Args:
            instances: A list of prediction input instances.
            **kwargs: A dictionary of keyword args provided as additional
                fields on the predict request body.

        Returns:
            A list of outputs containing the prediction results. This list must
            be JSON serializable.
        """
        # pre-processing
        preprocessed_inputs = self._preprocessor.preprocess(instances[0])

        # predict
        outputs = self._model.predict(preprocessed_inputs)

        # post-processing
        outputs = np.array([np.fliplr(x) for x in x_test])
        return outputs.tolist()

    @classmethod
    def from_path(cls, model_dir):
        """Creates an instance of Predictor using the given path.

        Loading of the predictor should be done in this method.

        Args:
            model_dir: The local directory that contains the exported model
                file along with any additional files uploaded when creating the
                version resource.

        Returns:
            An instance implementing this Predictor class.
        """
        model_path = os.path.join(model_dir, 'keras.model')
        model = load_model(model_path, compile=False)

        preprocessor_path = os.path.join(model_dir, 'preprocess.pkl')
        with open(preprocessor_path, 'rb') as f:
            preprocessor = pickle.load(f)

        return cls(model, preprocessor)

Полная ошибка Create Version failed. Bad model detected with error: "Failed to load model: Unexpected error when loading the model: 'str' object has no attribute 'decode' (Error code: 0)" указывает, что проблема в этом скрипте, особенно при загрузке модели. Однако я могу успешно загрузить модель в свой ноутбук локально с тем же блоком кода в predict.py:

from keras.models import load_model
model = load_model('keras.model', compile=False)

Я видел похожие сообщения, в которых предлагается установить версию h5py<3.0.0но это не помогло. Я могу установить версии модулей для моей пользовательской процедуры прогнозирования как таковые в setup.py файл:

from setuptools import setup

REQUIRED_PACKAGES = ['keras==2.3.1', 'h5py==2.10.0', 'opencv-python', 'pydicom', 'scikit-image']

setup(
    name='my_custom_code',
    install_requires=REQUIRED_PACKAGES,
    include_package_data=True,
    version='0.23',
    scripts=['predictor.py', 'preprocess.py'])

К сожалению, я не нашел хорошего способа отладки развертывания модели на платформе искусственного интеллекта Google, и руководство по устранению неполадок бесполезно. Любые указатели будут очень признательны. Благодаря!

Изменить 1:

Версия модуля h5py неверна - 3.1.0, несмотря на то, что она установлена ​​на 2.10.0 в setup.py. Кто-нибудь знает почему? Однако я подтвердил, что версия Keras и другие модули установлены правильно. я пытался 'h5py==2.9.0' и 'h5py<3.0.0'но безрезультатно. Подробнее о включении зависимостей пакетов PyPi здесь.

Изменить 2:

Оказывается, в настоящее время Google не поддерживает эту возможность.

1 ответ

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

Через некоторое время я смог заставить его работать со средой выполнения 2.2и версия питона 3.7. Я также использую пользовательскую процедуру прогнозирования, и моя модель была простой двухуровневой двунаправленной LSTM, обслуживающей классификации.

У меня была настроена виртуальная машина для ноутбука с TF == 2.1 и понижена версия h5py до <3.0.0 с помощью:

!pip uninstall -y h5py

!pip install 'h5py < 3.0.0'

Мой setup.py выглядит так:

      from setuptools import setup

REQUIRED_PACKAGES = ['tensorflow==2.1', 'h5py<3.0.0']

setup(
  name="my_package",
  version="0.1",
  include_package_data=True,
  scripts=["preprocess.py", "model_prediction.py"]
)

Я добавил в свой код загрузки модели. Без него я столкнулся с другой проблемой при развертывании, которая выдавала следующую ошибку: Create Version failed. Bad model detected with error: "Failed to load model: Unexpected error when loading the model: 'sample_weight_mode' (Error code: 0)"

Изменение кода от OP:

      model = keras.models.load_model(
        os.path.join(model_dir,'model.h5'), compile = False)

И это позволило развернуть модель, как и раньше, без проблем. я подозреваю compile=Falseможет означать более медленное обслуживание прогнозов, но пока ничего не заметил.

Надеюсь, это поможет любому, кто застрял и погуглил эти проблемы!

Другие вопросы по тегам