通过Google Cloud ML部署Keras模型

时间:2017-01-31 13:52:45

标签: tensorflow google-cloud-platform keras google-cloud-ml

我希望使用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上构建的图形中?

4 个答案:

答案 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')

一些要点:

  • 创建模型后,您必须调用tf.add_to_collection 但在你打电话给K.get_session()之前,等等,
  • 您应该确定何时设置输入和输出图层的名称 您将它们添加到图表中是因为您需要引用它们 当你发送预测请求时。

答案 3 :(得分:0)

这是另一个可能有用的答案。假设您已经有一个keras模型,您应该可以将此模型追加到脚本的末尾,并获得该模型的ML Engine兼容版本(协议缓冲区)。请注意,您需要将saved_model.pb文件和带有变量的同级目录上载到ML Engine,才能使其正常工作。还请注意,.pb文件必须命名为saved_model.pbsaved_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