为 TensorFlow Serving 保存模型

Posted

技术标签:

【中文标题】为 TensorFlow Serving 保存模型【英文标题】:Save model for Tensorflow Serving 【发布时间】:2018-02-01 10:18:13 【问题描述】:

我是张量流的新手。我已按照 tensorflow 服务说明在 docker 容器中提供模型。我可以按照 https://www.tensorflow.org/serving/ 的说明为 mnist 和 inception 模型服务。

服务模型保存在以下结构中:

.
|-- inception-export
|   `-- 1
|       |-- saved_model.pb
|       `-- variables
|           |-- variables.data-00000-of-00001
|           `-- variables.index
`-- mnist_model
    `-- 1
        |-- saved_model.pb
        `-- variables
            |-- variables.data-00000-of-00001
            `-- variables.index

问题:

    如何为重新训练的模型提供服务?

我正在按照https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0 的指示重新训练模型。

python retrain.py \
  --bottleneck_dir=bottlenecks \
  --how_many_training_steps=500 \
  --model_dir=inception \
  --summaries_dir=training_summaries/basic \
  --output_graph=retrained_graph.pb \
  --output_labels=retrained_labels.txt \
  --image_dir=flower_photos

上述命令创建 retrained_graph.pb 以及 retrained_label.txt 和瓶颈目录。

如何转换格式的输出,以便重新训练的模型可以通过 Tensorflow 服务服务器提供服务?

    如何提供预训练模型?

    我查看了对象检测演示 https://github.com/tensorflow/models/blob/master/object_detection/object_detection_tutorial.ipynb,它解释了如何使用“SSD with Mobilenet”模型 (https://github.com/tensorflow/models/blob/master/object_detection/g3doc/detection_model_zoo.md) 进行对象检测。

    ssd_mobilenet_v1_coco_11_06_2017.tar.gz 包含

    - a graph proto (graph.pbtxt)
    - a checkpoint (model.ckpt.data-00000-of-00001, model.ckpt.index, model.ckpt.meta)
    - a frozen graph proto with weights baked into the graph as constants (frozen_inference_graph.pb) 
    

    如何将上述文件转换为格式,以便预训练模型可以通过 Tensorflow 服务服务器提供服务?

    如何为通过 Tensorflow 服务服务器提供的自定义模型创建客户端?

我已按照http://fdahms.com/2017/03/05/tensorflow-serving-jvm-client/ 的说明创建自定义模型。该博客解释了如何创建自定义,通过 tensorflow 服务服务器和客户端访问模型。创建客户端的过程不是很清楚。我想用 Python 和 Java 创建客户端。

是否有更好的示例或指南来帮助理解为通过 Tensorflow 服务服务器提供的自定义模型创建客户端代码的过程。

【问题讨论】:

可能使用:***.com/questions/46098863/… 请参考link 并确认这是否有帮助。谢谢。 【参考方案1】:

Tensorflow Serving 现在支持 SavedModel 格式。如果你有一个重新训练的模型,实际上你不需要使用对象检测。您可以做的是使用 saver 从以前格式重新训练的模型中恢复会话,然后使用 SavedModelBuilder 再次导出它,通过该保存的模型可以生成 tf serving can serve 。 Here 是我对类似问题的另一个答案。

客户端可以参考下面的代码,这也是tf serving/example中的例子:

from grpc.beta import implementations
import tensorflow as tf

from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2

tf.app.flags.DEFINE_string('server', 'localhost:9000',
                           'PredictionService host:port')
FLAGS = tf.app.flags.FLAGS


def main(_):
  host, port = FLAGS.server.split(':')
  channel = implementations.insecure_channel(host, int(port))
  stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)

  request = predict_pb2.PredictRequest()
  request.model_spec.name = 'model_name'
  request.model_spec.signature_name = 'signature_name'
  request.inputs['input_key'].CopyFrom(
        tf.contrib.util.make_tensor_proto(your_data, shape=data_size))
  result = stub.Predict(request, 10.0)  # 10 secs timeout
  print(result.output)

【讨论】:

以上是关于为 TensorFlow Serving 保存模型的主要内容,如果未能解决你的问题,请参考以下文章

你可以在同一个 tensorflow/serving 二进制文件中提供来自不同 tensorflow 版本的模型吗?

使用 TensorFlow Serving 服务 Keras 模型

如何使 TensorFlow Hub 模型为 TensorFlow Serving REST 请求做好准备(使用 base64 编码图像)?

Tensorflow Serving 初探

如何使用 tensorflow-serving 发布自定义(非 tensorflow)模型?

Tensorflow Serving介绍及部署安装