2017-04-27 151 views
2

现在我们可以成功地使用Tensorflow服务为模型服务。我们已经使用以下方法导出模型并将其与Tensorflow服务托管。使用Tensorflow Serving服务Keras模型

 ------------ 
     For exporting 
    ------------------ 
    from tensorflow.contrib.session_bundle import exporter 

    K.set_learning_phase(0) 
    export_path = ... # where to save the exported graph 
    export_version = ... # version number (integer) 

    saver = tf.train.Saver(sharded=True) 
    model_exporter = exporter.Exporter(saver) 
    signature = exporter.classification_signature(input_tensor=model.input, 
              scores_tensor=model.output) 
    model_exporter.init(sess.graph.as_graph_def(), 
       default_graph_signature=signature) 
    model_exporter.export(export_path, tf.constant(export_version), sess) 

     -------------------------------------- 

     For hosting 
     ----------------------------------------------- 

     bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=default --model_base_path=/serving/models 

但是我们的问题是 - 我们希望keras与Tensorflow服务集成。我们希望通过使用Keras的Tensorflow服务为模型提供服务。 我们想要这样做的原因是 - 在我们的架构中,我们遵循几种不同的方式来训练我们的模型,如deeplearning4j + Keras, Tensorflow + Keras,但对于服务,我们只想使用一个可服务的引擎,即Tensorflow服务。我们没有看到任何实现这一目标的直接方式。任何意见 ?

谢谢。

+0

我知道你问TF服务,所以我赢了”不要把这个帖子当作答案,但如果你想要将实际的工具附加到你的模型而不是黑盒子,你也可以看看:https://github.com/deeplearning4j/deeplearning4j/blob/master/deeplearning4j-scaleout/deeplearning4j-scaleout -parallelwrapper/src目录/主/ JAVA /组织/ deeplearning4j /并行/ ParallelInference。java的keras(我只提到这个,因为你使用dl4j作为你的管道的一部分) –

回答

8

最近,TensorFlow改变了它导出模型的方式,所以网上提供的大多数教程都是过时的。我真的不知道deeplearning4j是如何工作的,但我经常使用Keras。我设法创建了一个简单的示例,我已经在TensorFlow Serving Github上发布了此issue

我不确定这是否会对您有所帮助,但我想分享我做过的事情,也许它会给您一些见解。在创建我的自定义模型之前,我的第一个试验是使用Keras上提供的训练模型,例如VGG19。我做了如下。

模型制作

import keras.backend as K 
from keras.applications import VGG19 
from keras.models import Model 

# very important to do this as a first thing 
K.set_learning_phase(0) 

model = VGG19(include_top=True, weights='imagenet') 

# The creation of a new model might be optional depending on the goal 
config = model.get_config() 
weights = model.get_weights() 
new_model = Model.from_config(config) 
new_model.set_weights(weights) 

导出模型

from tensorflow.python.saved_model import builder as saved_model_builder 
from tensorflow.python.saved_model import utils 
from tensorflow.python.saved_model import tag_constants, signature_constants 
from tensorflow.python.saved_model.signature_def_utils_impl import  build_signature_def, predict_signature_def 
from tensorflow.contrib.session_bundle import exporter 

export_path = 'folder_to_export' 
builder = saved_model_builder.SavedModelBuilder(export_path) 

signature = predict_signature_def(inputs={'images': new_model.input}, 
            outputs={'scores': new_model.output}) 

with K.get_session() as sess: 
    builder.add_meta_graph_and_variables(sess=sess, 
             tags=[tag_constants.SERVING], 
             signature_def_map={'predict': signature}) 
    builder.save() 

一些旁注

  • 它可以根据Keras变化,TensorFlow和TensorFlow服务 版本。我用最新的。
  • 请注意签名的名称,因为它们也应该在客户端使用。
  • 创建客户端时,必须执行 模型(例如preprocess_input())所需的所有预处理步骤。我没有尝试 在图本身中添加这样的步骤作为Inception客户端示例。

对于在同一台服务器中提供不同的模型,我认为类似于创建model_config_file可能会对您有所帮助。要做到这一点,你可以创建一个类似的配置文件:

model_config_list: { 
    config: { 
    name: "my_model_1", 
    base_path: "/tmp/model_1", 
    model_platform: "tensorflow" 
    }, 
    config: { 
    name: "my_model_2", 
    base_path: "/tmp/model_2", 
    model_platform: "tensorflow" 
    } 
} 

最后,你可以运行在客户端这样的:

bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --config_file=model_config.conf 
+0

其实我正在寻找一些关于“DL4J到Tensorflow服务”的参考。但无论如何这有助于。谢谢托马斯。 –

+1

我不得不将所有的模型文件放入带有版本号(例如'/ tmp/model/00001')的'base_path'版本子文件夹中。目前找不到这个来源,但也许这会为未来的读者节省一些时间。 –