TypechoJoeTheme

半醉残影

统计

TensorFlow Serving

2019-01-11
/
0 评论
/
539 阅读
/
正在检测是否收录...
01/11

前言

TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库。它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用。更加让人眼前一亮的是,它支持模型热更新与自动模型版本管理。这意味着一旦部署 TensorFlow Serving 后,你再也不需要为线上服务操心,只需要关心你的线下模型训练。

TensorFlow Serving的典型的流程如下:学习者(Learner,比如TensorFlow)根据输入数据进行模型训练。等模型训练完成、验证之后,模型会被发布到TensorFlow Serving系统服务器端。客户端提交请求,由服务端返回预测结果。客户端和服务端之间的通信采用的是RPC协议。

正文

下载源码

下载源码

$ git clone https://github.com/tensorflow/serving.git

编译

编译Tensorflow Serving

$ bazel build --config=mkl --copt="-DEIGEN_USE_VML" -c opt //tensorflow_serving/model_servers:tensorflow_model_server

Patch

编辑serving根目录下的配置文件WORKSPACE

如果使用其他版本的TensorFlow,WORKSPACE中sha256和git_commit都需要修改,否则会报错,编辑serving/tensorflow_serving/repo.bzl配置需要的TensorFlow下载地址,

$ vim serving/WORKSPACE
 10 load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 11 
 12 tensorflow_http_archive(
 13     name = "org_tensorflow",
 14     sha256 = "5aae44f967556dc524e6b184643bbd33a2d78184bc654b72c09f041f266b89a2",
 15     git_commit = "a6d8ffae097d0132989ae4688d224121ec6d8f35",
 16 )

在编译之前修改下载的TensorFlow源码,修改完成之后再编译Tensorflow Serving

保存模型

服务端保存模型


builder = tf.saved_model.builder.SavedModelBuilder(export_path)

tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)

prediction_signature = (
    tf.saved_model.signature_def_utils.build_signature_def(
        inputs={'images': tensor_info_x},
        outputs={'scores': tensor_info_y},
        method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))

builder.add_meta_graph_and_variables(
    sess, [tf.saved_model.tag_constants.SERVING],
    signature_def_map={
        'predict_images':
            prediction_signature,
        tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
            classification_signature,
    },
    main_op=tf.tables_initializer(),
    strip_default_attrs=True)

builder.save()

启动服务

$ nohup tensorflow_model_server --port=9000 \
--model_name=test \
--rest_api_num_threads=10 \
--tensorflow_session_parallelism=4 \
--model_base_path=/home/dyb/test &

启动客户端


from grpc.beta import implementations
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2

import numpy as np
import tensorflow as tf

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 = 'test'
request.model_spec.signature_name = 'predict_images'
request.inputs['images'].CopyFrom(tf.contrib.util.make_tensor_proto(x_data, shape=[100, 28*28*1]))

result = stub.Predict(request, 10.0)  # 10 secs timeout

常见错误

关闭代理

在进行部署TensorFlow Serving环境过程中,总是报错(如下错误信息),刚开始以为是服务器没有启动,后来才发现是代理问题

<_Rendezvous of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "Socket closed"
        debug_error_string = "{"created":"@1545792723.752821509","description":"Error received from peer","file":"src/core/lib/surface/call.cc","file_line":1036,"grpc_message":"Socket closed","grpc_status":14}"
>
  1. 查看服务器是否启动
telnet localhost 50051

使用telnet命令发现端口是打开的,所以排除是服务器启动失败造成的。

  1. 关闭服务器

后来我关闭服务器,再次启动,发现客户端报错仍然是这个,我就想服务器和客户端之间一定存在某种障碍,然后就想到了是不是代理的问题。

  1. 查看代理

使用命令查看代理是否存在,果然有代理,试着关闭代理

env | grep proxy

https_proxy=http://*:888

  1. 关闭所有代理
unset http_proxy
  1. 再次启动服务器,客户端,成功

Load Model Failed

在做TensorFlow模型量化过程中,会用到transform_graph,然后在进行模型压缩时候因为自己的模型有1.7GB,所以程序报错。
[libprotobuf ERROR external/protobuf_archive/src/google/protobuf/io/coded_stream.cc:190] A protocol message was rejected because it was too big (more than 1073741824 bytes). To increase the limit (or to disable these warnings), see CodedInputStream::SetTotalBytesLimit() in google/protobuf/io/coded_stream.h.

解决办法

  1. 修改代码
$ vim tensorflow/core/platform/env.cc

找到coded_stream.SetTotalBytesLimit(1024LL << 20, 512LL << 20);

coded_stream.SetTotalBytesLimit(INT_MAX, INT_MAX);

然后修改参数即可

  1. 重新编译

结束

相关链接:
https://blog.csdn.net/wc781708249/article/details/78606514
http://www.dataguru.cn/article-14189-1.html

深度学习
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!

三合一收款

下面三种方式都支持哦

微信
QQ
支付宝
打开支付宝/微信/QQ扫一扫,即可进行扫码打赏哦
版权属于:

半醉残影

本文链接:

https://blog.dengyb.com/archives/52/(转载时请注明本文出处及文章链接)

评论 (0)