2019独角兽企业重金招聘Python工程师标准>>>

作者:Mao Chan
BitTiger尊重原创版权,转载已经过作者授权。

2016年,机器学习在 Alpha Go 与李世石的世纪之战后变得更加炙手可热。Google也在今年推出了 TensorFlow Serving 又加了一把火。

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

今天我就带大家来用 TensorFlow Serving 部署一个简单的 Linear Regression 模型。

以下演示运行在 Ubuntu 16.04 LTS 之上。

TensorFlow Serving 处于快速迭代期。如果本文内容与官方文档矛盾,请以官方文档为参考。

环境

TensorFlow Serving 目前依赖 Google 的开源编译工具 Bazel。Bazel 是 Google 内部编译工具 Blaze 的开源版本,功能与性能基本一致。具体的安装可以参考官方文档。此外还需要安装 gRPC (Google 又一个内部工具的开源版)。

之后请参考官方安装指南完成。值得注意的是,最后的 bazel build 将会需要大约30分钟时间并占用约5-10G的空间(时间取决于机器性能)。配合使用 -c opt 能一定程度加快 build。

模型训练

接下来我们用 TensorFlow 写一个简单的测试用 Linear Regression 模型。数据的话我就使用正弦函数生成 1000 个点,尝试用一条直线去拟合。

样本数据生成如下:

# Generate input data
x_data = np.arange(100, step=.1)
y_data = x_data + 20 * np.sin(x_data / 10)# Reshape data
x_data = np.reshape(x_data, (n_samples, 1))
y_data = np.reshape(y_data, (n_samples, 1))

然后用一个简单的 y = wx + b 来做一个训练,使用 Adam 算法。简单调整了下参数:

sample = 1000, learning_rate = 0.01, batch_size = 100, n_steps = 500

# Placeholders for batched input
x = tf.placeholder(tf.float32, shape=(batch_size, 1))
y = tf.placeholder(tf.float32, shape=(batch_size, 1))# Do training
with tf.variable_scope('test'):w = tf.get_variable('weights', (1, 1), initializer=tf.random_normal_initializer())b = tf.get_variable('bias', (1,), initializer=tf.constant_initializer(0))y_pred = tf.matmul(x, w) + bloss = tf.reduce_sum((y - y_pred) ** 2 / n_samples)opt = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)with tf.Session() as sess:sess.run(tf.initialize_all_variables())for _ in range(n_steps):indices = np.random.choice(n_samples, batch_size)x_batch = x_data[indices]y_batch = y_data[indices]_, loss_val = sess.run([opt, loss], feed_dict={x:x_batch, y:y_batch})print w.eval()print b.eval()print loss_val

大致把 loss 收敛在 15.8 左右。精度应该足够了,毕竟只是一个简单的测试用模型。

模型导出

接下来的就是本文的重点:导出模型。

tf.train.Saver

用于保存和恢复Variable。它可以非常方便的保存当前模型的变量或者倒入之前训练好的变量。一个最简单的运用:

saver - tf.train.Saver()
# Save the variables to disk.
saver.save(sess, "/tmp/test.ckpt")
# Restore variables from disk.
saver.restore(sess, "/tmp/test.ckpt")

tf.contrib.session_bundle.exporter.Exporter

导出模型还需要这个 Exporter 的协助。令人尴尬的是这个 Exporter 太新了,还没有 API 文档支持,只能参考 Github 的代码实现。

Exporter 的基本使用方式是

  1. 传入 saver 构造一个实例

  2. 调用 init 定义模型的 graph 和 input/output

  3. 使用 export 导出为文件

model_exporter = exporter.Exporter(saver)
model_exporter.init(sess.graph.as_graph_def(),named_graph_signatures={'inputs': exporter.generic_signature({'x': x}),'outputs': exporter.generic_signature({'y': y_pred})})
model_exporter.export(FLAGS.work_dir,         tf.constant(FLAGS.export_version),sess)

大功告成!编译!我们成功导出了一个可以部署在 TensorFlow Serving 上的模型。它接受一个 x 值然后返回一个 y 值。导出的文件夹以 version 命名,包含用于部署的 meta 文件, 模型 checkpoint 文件和序列化的模型 graph:

/tmp/test/00000001
checkpoint export-00000-of-00001 export.meta

模型部署

部署的方式非常简单,只需要以下两步:

$ bazel build //tensorflow_serving/model_servers:tensorflow_model_server
$
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=test --model_base_path=/tmp/test/

我们看到 TensorFlow Serving 成功加载了我们刚刚导出的 model。并且还在不断尝试 poll 新的 model:

客户端

接下来我们写一个简单的 Client 来调用下我们部署好的 Model。这里我们需要用到 TensorFlow Serving 的 Predict API 和 gRPC 的 implementations.insecure_channel 来construct 一个 request。特别要注意的是 input 的 signature 和数据必须和之前 export 的模型匹配。本例中为 名称为 x, float32类型,大小为 [100, 1] 的 Tensor。

from grpc.beta import implementations
import numpy as np
import tensorflow as tffrom tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2tf.app.flags.DEFINE_string('server', 'localhost:9000','PredictionService host:port')
FLAGS = tf.app.flags.FLAGSn_samples = 100host, port = FLAGS.server.split(':')
channel = implementations.insecure_channel(host, int(port))
stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)# Generate test data
x_data = np.arange(n_samples, step=1, dtype=np.float32)
x_data = np.reshape(x_data, (n_samples, 1))# Send request
request = predict_pb2.PredictRequest()
request.model_spec.name = 'test'request.inputs['x'].CopyFrom(tf.contrib.util.make_tensor_proto(x_data, shape=[100, 1]))
result = stub.Predict(request, 10.0)  # 10 secs timeout

别忘了配置一下 bazel 的 BUILD 文件:

py_binary(name = "test_client",srcs = ["test_client.py",],deps = ["//tensorflow_serving/apis:predict_proto_py_pb2","//tensorflow_serving/apis:prediction_service_proto_py_pb2","@org_tensorflow//tensorflow:tensorflow_py",],
)

最后编译运行,就能看到在线预测结果啦!

bazel build //tensorflow_serving/test:test_client && ./bazel-bin/tensorflow_serving/test/test_client

延伸

TensorFlow 封装了众多常用模型成为 Estimator,帮助用户避免了冗长易错的算法实现部分。比如以上的例子就可以完全用 LinearRegressor 来替换。只需要几行代码简单地调用 fit() 函数就能轻松得到收敛的模型。唯一不足的是目前与 TensorFlow Serving 还不能 100% 兼容。虽然 Google 还在全力完善 TensorFlow Serving,但是距离完善还需要一定的时间。

如果既想要使用方便快捷的的 Estimator ,又想线上部署呢?当然也是有办法的,笔者钻研了一下后,实现了一个用 Estimator 训练数据,导出模型后再部署上线的方法。最后用这个线上部署的模型实现一个在线评估房屋价值的系统。

设立于硅谷,专注于编程、数据分析、UIUX设计的在线学习平台:BitTiger。

转载于:https://my.oschina.net/u/2997036/blog/779508

TensorFlow Serving 尝尝鲜相关推荐

  1. STM32CubeMX AI尝尝鲜

    STM32CubeMX AI尝尝鲜 X-Cube-AI介绍 &&开发前提 创建模型 创建工程 修改工程 输出结果   我是在学习Tensorflow 2.0的时候,当然,最终还是为了跑 ...

  2. 如何将TensorFlow Serving的性能提高超过70%?

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」7折优惠最后2天,请扫码咨询 ↑↑↑ 译者 | Major 出品 | AI科技大本营(ID:rgznai100) TensorFlow已 ...

  3. TensorFlow serving远程访问引擎的容器部署

    2019独角兽企业重金招聘Python工程师标准>>> TensorFlow Serving是通过rpc接口远程访问tensorflow引擎的服务器. TensorFlow Serv ...

  4. 刚安装了Fedora 33,尝尝鲜~,哈哈~~~

    RT,Fedora 33已经安装,正在当小白鼠,尝尝鲜.哈哈~~

  5. 刚安装了Fedora32,尝尝鲜~,哈哈~~~

    RT,Fedora32已经安装,正在当小白鼠,尝尝鲜.哈哈~~

  6. tensorflow从入门到精通100讲(六)-在TensorFlow Serving/Docker中做keras 模型部署

    前言 不知道大家研究过没有,tensorflow模型有三种保存方式: 训练时我们会一般会将模型保存成:checkpoint文件 为了方便python,C++或者其他语言部署你的模型,你可以将模型保存成 ...

  7. TensorFlow Serving + Docker + Tornado机器学习模型生产级快速部署

    点击上方"AI搞事情"关注我们 内容转载自知乎:https://zhuanlan.zhihu.com/p/52096200 Justin ho 〉 本文将会介绍使用TensorFl ...

  8. 使用tensorflow serving部署keras模型(tensorflow 2.0.0)

    点击上方"AI搞事情"关注我们 内容转载自知乎:https://zhuanlan.zhihu.com/p/96917543 Justin ho 〉 Tensorflow 2.0.0 ...

  9. Tensorflow Serving部署tensorflow、keras模型详解

    写在篇前   本篇介绍如何使用Tensorflow Serving组件导出训练好的Tensorflow模型,并使用标准tensorflow model server来部署深度学习模型预测服务.tens ...

最新文章

  1. 【bootstrap】bootstrap-4.5.0-example 各个模板展示
  2. 将动画装入MicroPython I2C OLED
  3. 创建程序集时元数据失败 -- 拒绝访问_kubectl 创建 Pod 背后到底发生了什么?
  4. windows mobile创建文本文件并用word打开
  5. es6 --- Proxy的属性(get、set除外)
  6. Kubernetes 1.5安装
  7. 读RESTful API 设计指南心得体会
  8. 关于指针初始化的问题 - 回复下雨天2
  9. 51单片机模拟交通灯c语言程序,51单片机protues仿真——LED模拟交通灯
  10. 【Python学习笔记】《和孩子一起学编程》第2章 记住内存和变量
  11. 简单线性回归的应用及画图(一)
  12. 关于CSS居中显示的总结
  13. 工业无线技术在未来工厂运营中的机遇和挑战
  14. ADB使用及日志分析
  15. Excel vba 调用outlook发送邮件
  16. URI中有关@符号的一些猥琐idea
  17. java如何保证mq一定被消费,RabbitMQ如何保证队列里的消息99.99%被消费?
  18. css word-wrap
  19. Declare and Definition
  20. [iOS]URL编码和解码

热门文章

  1. java it_Java中的Iterator的用法
  2. 论文笔记 《Selective Search for Object Recognition》
  3. 有三AI发布360页11万字深度学习CV算法工程师成长指导手册,可下载收藏打印,未完待续...
  4. 【AI白身境】学深度学习你不得不知的爬虫基础
  5. CryptoAPI与openssl数字签名与验证交互
  6. “三农”谋定金融 中国农民丰收节交易会金融服务研讨会
  7. Hadoop实例之Java代码实现利用MapReduce求π值
  8. ckplayer---vue
  9. git 常用操作命令(Common operation)
  10. Nginx, HTTPS的配置