那棵树看起来生气了
TensorFlow Serving
前言
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}"
>
- 查看服务器是否启动
telnet localhost 50051
使用telnet命令发现端口是打开的,所以排除是服务器启动失败造成的。
- 关闭服务器
后来我关闭服务器,再次启动,发现客户端报错仍然是这个,我就想服务器和客户端之间一定存在某种障碍,然后就想到了是不是代理的问题。
- 查看代理
使用命令查看代理是否存在,果然有代理,试着关闭代理
env | grep proxy
https_proxy=http://*:888
- 关闭所有代理
unset http_proxy
- 再次启动服务器,客户端,成功
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.
解决办法
- 修改代码
$ vim tensorflow/core/platform/env.cc
找到coded_stream.SetTotalBytesLimit(1024LL << 20, 512LL << 20);
coded_stream.SetTotalBytesLimit(INT_MAX, INT_MAX);
然后修改参数即可
- 重新编译
结束
相关链接:
https://blog.csdn.net/wc781708249/article/details/78606514
http://www.dataguru.cn/article-14189-1.html
三合一收款
下面三种方式都支持哦