我希望使用Google Cloud ML托管我的Keras模型,以便我可以调用API并进行一些预测。我遇到了Keras方面的一些问题。
到目前为止,我已经能够使用TensorFlow构建模型并将其部署在CloudML上。为了使其工作,我不得不对我的基本TF代码进行一些更改。这些更改记录在此处:https://cloud.google.com/ml/docs/how-tos/preparing-models#code_changes
我也能够使用Keras训练类似的模型。我甚至可以使用与TF相同的export和export.meta格式保存模型。
from keras import backend as K
saver = tf.train.Saver()
session = K.get_session()
saver.save(session, 'export')
我缺少的部分是如何将输入和输出的占位符添加到我在Keras上构建的图形中?
答案 0 :(得分:14)
在Google Cloud ML Engine上训练您的模型后(请查看this awesome tutorial),我用
命名了我的图表的输入和输出signature = predict_signature_def(inputs={'NAME_YOUR_INPUT': new_Model.input},
outputs={'NAME_YOUR_OUTPUT': new_Model.output})
您可以看到已经过培训的keras模型的完整导出示例' model.h5'下面。
import keras.backend as K
import tensorflow as tf
from keras.models import load_model, Sequential
from tensorflow.python.saved_model import builder as saved_model_builder
from tensorflow.python.saved_model import tag_constants, signature_constants
from tensorflow.python.saved_model.signature_def_utils_impl import predict_signature_def
# reset session
K.clear_session()
sess = tf.Session()
K.set_session(sess)
# disable loading of learning nodes
K.set_learning_phase(0)
# load model
model = load_model('model.h5')
config = model.get_config()
weights = model.get_weights()
new_Model = Sequential.from_config(config)
new_Model.set_weights(weights)
# export saved model
export_path = 'YOUR_EXPORT_PATH' + '/export'
builder = saved_model_builder.SavedModelBuilder(export_path)
signature = predict_signature_def(inputs={'NAME_YOUR_INPUT': new_Model.input},
outputs={'NAME_YOUR_OUTPUT': new_Model.output})
with K.get_session() as sess:
builder.add_meta_graph_and_variables(sess=sess,
tags=[tag_constants.SERVING],
signature_def_map={
signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature})
builder.save()
您还可以看到我的full implementation。
编辑:如果我的答案解决了你的问题,请在这里给我一个提升:)
答案 1 :(得分:3)
我发现为了在google cloud上使用keras,必须使用setup.py脚本安装它并将其放在运行gcloud命令的同一个文件夹中:
├── setup.py
└── trainer
├── __init__.py
├── cloudml-gpu.yaml
├── example5-keras.py
在setup.py中你输入了以下内容:
from setuptools import setup, find_packages
setup(name='example5',
version='0.1',
packages=find_packages(),
description='example to run keras on gcloud ml-engine',
author='Fuyang Liu',
author_email='fuyang.liu@example.com',
license='MIT',
install_requires=[
'keras',
'h5py'
],
zip_safe=False)
然后你可以开始在gcloud上运行你的工作,例如:
export BUCKET_NAME=tf-learn-simple-sentiment
export JOB_NAME="example_5_train_$(date +%Y%m%d_%H%M%S)"
export JOB_DIR=gs://$BUCKET_NAME/$JOB_NAME
export REGION=europe-west1
gcloud ml-engine jobs submit training $JOB_NAME \
--job-dir gs://$BUCKET_NAME/$JOB_NAME \
--runtime-version 1.0 \
--module-name trainer.example5-keras \
--package-path ./trainer \
--region $REGION \
--config=trainer/cloudml-gpu.yaml \
-- \
--train-file gs://tf-learn-simple-sentiment/sentiment_set.pickle
要使用GPU,请在模块中添加cloudml-gpu.yaml
等文件,其中包含以下内容:
trainingInput:
scaleTier: CUSTOM
# standard_gpu provides 1 GPU. Change to complex_model_m_gpu for 4
GPUs
masterType: standard_gpu
runtimeVersion: "1.0"
答案 2 :(得分:1)
我不太了解Keras。我咨询了一些专家,以下内容应该有效:
from keras import backend as k
# Build the model first
model = ...
# Declare the inputs and outputs for CloudML
inputs = dict(zip((layer.name for layer in model.input_layers),
(t.name for t in model.inputs)))
tf.add_to_collection('inputs', json.dumps(inputs))
outputs = dict(zip((layer.name for layer in model.output_layers),
(t.name for t in model.outputs)))
tf.add_to_collection('outputs', json.dumps(outputs))
# Fit/train the model
model.fit(...)
# Export the model
saver = tf.train.Saver()
session = K.get_session()
saver.save(session, 'export')
一些要点:
答案 3 :(得分:0)
这是另一个可能有用的答案。假设您已经有一个keras模型,您应该可以将此模型追加到脚本的末尾,并获得该模型的ML Engine兼容版本(协议缓冲区)。请注意,您需要将saved_model.pb
文件和带有变量的同级目录上载到ML Engine,才能使其正常工作。还请注意,.pb文件必须命名为saved_model.pb
或saved_model.pbtxt
。
假设您的模型名为model
from tensorflow import saved_model
model_builder = saved_model.builder.SavedModelBuilder("exported_model")
inputs = {
'input': saved_model.utils.build_tensor_info(model.input)
}
outputs = {
'earnings': saved_model.utils.build_tensor_info(model.output)
}
signature_def = saved_model.signature_def_utils.build_signature_def(
inputs=inputs,
outputs=outputs,
method_name=saved_model.signature_constants.PREDICT_METHOD_NAME
)
model_builder.add_meta_graph_and_variables(
K.get_session(),
tags=[saved_model.tag_constants.SERVING],
signature_def_map={saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_def
})
model_builder.save()
会将模型导出到目录/exported_model
。