Google AI Platform:加载模型时出现意外错误:'str' 对象没有属性 'decode' [Keras 2.3.1,TF 1.15]
Google AI Platform: Unexpected error when loading the model: 'str' object has no attribute 'decode' [Keras 2.3.1, TF 1.15]
我正在尝试将 Google 的 AI 平台中的测试版 Google 自定义预测例程用于 运行 我模型的实时版本。
我在我的包 predictor.py
中包含一个 Predictor
class 这样的:
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 的 AI 平台中调试模型部署的好方法,故障排除指南也没有帮助。任何指针将不胜感激。谢谢!
编辑 1:
h5py 模块的版本错误 – 在 3.1.0,尽管在 setup.py
中将其设置为 2.10.0。有人知道为什么吗?我确认 Keras 版本和其他模块设置正确。我试过 'h5py==2.9.0'
和 'h5py<3.0.0'
都无济于事。有关包含 PyPi 包依赖项的更多信息 here.
编辑 2:
So it turns out google currently does not support this capability.
我在使用 AI 平台和两个月前 运行 还不错的代码时遇到了同样的问题,当时我们上次训练我们的模型。确实是因为h5py的依赖,突然加载h5模型失败
一段时间后,我能够使其与运行时 2.2
和 python 版本 3.7
一起使用。我也在使用自定义预测例程,我的模型是一个简单的 2 层双向 LSTM 服务分类。
我用 TF == 2.1 设置了一个笔记本 VM,并将 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"]
)
我在我的模型加载代码中添加了 compile=False
。没有它,我 运行 遇到了另一个部署问题,它给出了以下错误: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
可能意味着预测服务速度变慢,但目前尚未发现任何问题。
希望这可以帮助任何陷入困境并用谷歌搜索这些问题的人!
我正在尝试将 Google 的 AI 平台中的测试版 Google 自定义预测例程用于 运行 我模型的实时版本。
我在我的包 predictor.py
中包含一个 Predictor
class 这样的:
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 的 AI 平台中调试模型部署的好方法,故障排除指南也没有帮助。任何指针将不胜感激。谢谢!
编辑 1:
h5py 模块的版本错误 – 在 3.1.0,尽管在 setup.py
中将其设置为 2.10.0。有人知道为什么吗?我确认 Keras 版本和其他模块设置正确。我试过 'h5py==2.9.0'
和 'h5py<3.0.0'
都无济于事。有关包含 PyPi 包依赖项的更多信息 here.
编辑 2:
So it turns out google currently does not support this capability.
我在使用 AI 平台和两个月前 运行 还不错的代码时遇到了同样的问题,当时我们上次训练我们的模型。确实是因为h5py的依赖,突然加载h5模型失败
一段时间后,我能够使其与运行时 2.2
和 python 版本 3.7
一起使用。我也在使用自定义预测例程,我的模型是一个简单的 2 层双向 LSTM 服务分类。
我用 TF == 2.1 设置了一个笔记本 VM,并将 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"]
)
我在我的模型加载代码中添加了 compile=False
。没有它,我 运行 遇到了另一个部署问题,它给出了以下错误: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
可能意味着预测服务速度变慢,但目前尚未发现任何问题。
希望这可以帮助任何陷入困境并用谷歌搜索这些问题的人!