TensorFlow Serving 日志

Tensorflow Serving

机器学习技术支撑着许多 Google 产品的功能,比如:Google 应用中的语音识别收件箱的智能回复,以及Google 照片搜索,等等。尽管软件行业几十年中积累起的无数经验促成了很多用于构建并支持产品的最佳实践,但基于机器学习的服务却还是带来了一些新颖而有趣的挑战

TensorFlow Serving 系统非常适用于大规模运行能够基于真实情况的数据并会发生动态改变的多重模型。它给出了一个把模型应用到实际生产的解决方案

它能够实现:

模型生命周期管理。

使用多重算法进行试验。

GPU 资源的有效使用。 

TensorFlow Serving 能够简化并加速从模型到生产的过程。它能实现在服务器架构和 API 保持不变的情况下,安全地部署新模型并运行试验。除了原生集成 TensorFlow,还可以扩展服务其他类型的模型。下图显示了简化的监督学习过程,向 learner 输入训练数据,然后输出模型:

TensorFlow Serving 使用(之前训练的)模型来实施推理——基于客户端呈现数据的预测。因为客户端通常会使用远程过程调用(RPC)接口来与服务系统通信,TensorFlow Serving 提供了一种基于gRPC的参考型前端实现,这是一种 Google 开发的高性能开源 RPC 架构。当新数据可用或改进模型时,加载并迭代模型是很常见的。事实上,在谷歌,许多管线经常运行,一旦当新数据可用时,就会产生新版本的模型。

文章目录

TensorFlow Serving 日志

一、安装步骤

1. 使用anconda 安装python2环境

2. 安装Tensorflow环境

3. 安装GRCP框架

4. 安装glags

5. 配置编译文件

6. 构建tensorflow Serving(Build)

7. 运行Tesnroflow serving

8. 测试:

9. 下载tensorflow serving 源代码

二.遇到的问题以及解决方案(ISSUE)

1. Python Configuration Warning

解决方法

三、Tensorflow serving 基本用法—以MNIST手写体数字为例

三、深入理解

1. 模型导出的流程

三、扩展阅读


一、安装步骤

在Python3.6编译tensorflow Serving 的过程中出现错误, 经过在github 上调查得知 Tensorflow Seving 目前不支持python3(详情参见Installing TensorFlow Serving with Python 3 support )。

请结合 https://www.tensorflow.org/serving/setup

1. 使用anconda 安装python2环境

conda create -n python2 python=2.7

source activate python2 # 进入环境

source deactivate python2 # 退出环境


2. 安装Tensorflow环境

pip install tensorflow-gpu==1.3.0 # 之前使用的是1.4 发现1.4对cudann6不兼容

3. 安装GRCP框架

python -m pip install grpcio# 安装grpcio 1.7

4. 安装glags

这个组件在tensorflow serving 安装文档中没有指明,但是也是必须的。关于gflags可以参看https://pypi.python.org/pypi/python-gflags

5. 配置编译文件

cd tensorflow

./configure

cd

6. 构建tensorflow Serving(Build)

在编译之前,务必指定python path, 否则会导致测试失败。

bazel build -c opt tensorflow_serving/...

7. 运行Tesnroflow serving

bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server

8. 测试:

bazel test -c opt tensorflow_serving/...

PS:如果测试失败,请认真看错误日志文件。如果是cannot import XX package,请检查你的文件。

9. 下载tensorflow serving 源代码

git clone --recurse-submodules https://github.com/tensorflow/serving #/home/master/testServing

二.遇到的问题以及解决方案(ISSUE)

1. Python Configuration Warning

这个一定不能忽略,如果你忽略了。会在编译的过程中遇到以下错误:

https://github.com/tensorflow/tensorflow/issues/9866

或者是

(python2) master@ubuntu:~/testServing/serving$ bazel build -c opt tensorflow_serving/...

......................

WARNING: /home/master/.cache/bazel/_bazel_master/181dd246736c24d622c89ae092af50b3/external/bazel_tools/tools/build_defs/pkg/pkg.bzl:196:9: pkg_tar: renaming non-dict `files` attribute to `srcs`.

WARNING: /home/master/.cache/bazel/_bazel_master/181dd246736c24d622c89ae092af50b3/external/org_tensorflow/third_party/py/python_configure.bzl:30:3: Python Configuration Warning: 'PYTHON_LIB_PATH' environment variable is not set, using '/usr/local/lib/python2.7/dist-packages' as default.

INFO: Downloading https://mirror.bazel.build/ufpr.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz: 728,119 bytes

解决方法

由于是PYTHON_LIB_PATH 没有设置。设置为:

/home/master/.conda/envs/python2/bin/python

export PYTHON_LIB_PATH=/home/master/.conda/envs/python2/lib/python2.7/site-packages

2 其他问题的解决方法:

https://github.com/tensorflow/tensorflow/issues/9866

https://github.com/tensorflow/tensorflow/issues/14218

https://github.com/tensorflow/tensorflow/issues/14182

https://github.com/tensorflow/tensorflow/issues/14273

https://github.com/tensorflow/tensorflow/issues/14182#issuecomment-342927115

https://stackoverflow.com/questions/44081119/tensorflow-traceback-most-recent-call-last-tensorflow-python-framework-errors

三、Tensorflow serving 基本用法—以MNIST手写体数字为例


Tensorflow 提供有相应的程序片段用于训练并导出模型。

源文件下载:

https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_saved_model.py

训练并且导出模型

python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model

运行服务:

tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/

运行客户端

python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:9000

三、深入理解

1. 模型导出的流程

创建builder对象,并制定保存的路径

SavedModelBuilder采用了设计模型的 生成器/建造者模式的思想。提供了一种创建对象的最佳方式。 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

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

构造TensorInfo proto

将模型的名称、类别、分数统统用tensorInfo封装。

classification_inputs = tf.saved_model.utils.build_tensor_info(

serialized_tf_example)

其中serialized_tf_example是一个palceholder ,value='tf_example'

依次构造classification_outputs_classes、classification_outputs_scores

并使用

tf.saved_model.signature_def_utils.build_signature_def()将模型信息封装起来。

PS:

Protocol Buffer 是谷歌开发的一种语言无关、平台无关、可扩展的序列化结构数据格式,在 tensorflow 中可以理解为处理结构化数据的工具,用于序列化结构化数据(训练好的DNN)。

关于Protocol Buffer的介绍:https://developers.google.com/protocol-buffers/docs/overview

Protocol Buffer的编码方式:https://developers.google.com/protocol-buffers/docs/encoding

Protocol Bufferdf 定义数据格式的文件一般保存在.proto文件中。每一个 message 代表了一类结构化数据,message 里面定义了每一个属性的类型和名字,Protocol Buffer 里属性的类型可以是像布尔型、整数型、实数型、字符型这些基本类型,也可以是另一个 message。可用 required(可选的)、required(必须的)、repeated(可重复的)说明属性是否可选的、必须的或者可重复的。

作用与json类似。给出相关实践手册http://blog.csdn.net/tz_zs/article/details/76637667

将构造出的模型添加builder中

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,

},

legacy_init_op=legacy_init_op)

保存模型

builder.save()

总结

创建builder的是class SaveModelBuilder; 其功能是用来添加SaverModel

protocol buffer 并保存变量和资源,SaverModelBuilder类提供了创建

SaverModel protocol buffer 的函数方法。

说的在朴素一点:

SaverModel protocol buffer(tf.saved_model.utils.build_tensor_info)是用来构造模型的接口的。 add_meta_graph_and_variable 是用来把构造出的接口添加到模型中的。

以上是定义接口并导出模型的方式。如下图所示:



客户端调用接口与使用

https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_client.py

以上文件给出 Client 来调用部署好的 Mode 的实例。

调用过程中需要用到 TensorFlow Serving 的 Predict API 和 gRPC 的 implementations.insecure_channel 来construct 一个 request。特别要注意的是 input 的 signature 和数据必须和之前 export 的模型匹配。本例中为 名称为x1, float32类型,大小为 [28,28] 的 Tensor。模型的输出只要与之前的output匹配即可。



扩展阅读


Can python client be independent of tensorflow ?

How to make predictions on TensorFlow's Wide and Deep model loaded in TensorFlow Serving

https://www.oreilly.com/ideas/object-detection-with-tensorflow

tensorflow Seving API

https://www.tensorflow.org/serving/serving_advanced

https://zhuanlan.zhihu.com/p/23361413

http://www.cnblogs.com/YouXiangLiThon/p/7435825.html#undefined

如果MNIST 的实例或许有点难以理解,不妨看看这个:

https://www.bittiger.io/blog/post/JpcAqsSP3n39gzFbm

http://blog.csdn.net/tz_zs/article/details/76637667

http://blog.innodatalabs.com/the-newb-guide-to-google-cloud-machine-learning-engine-episode-one/

Google Protocol Buffer 的使用和原理

已经部署好的项目:

https://github.com/hetaoaoao/tensorflow_web_deploy

https://github.com/AxelAli/Tensorflow-Image-Classifier-Web-Demo

By 2017年11月17日星期五

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 网址 下载与安装 你可以使用我们提供的 Pip, Docker, Virtualenv, Anaconda 或 源...
    九七学姐阅读 4,732评论 3 11
  • 一.目的 类似学习开发语言的第一个代码,Hello World! 机器学习中,我们通过MNIST来学习手写输入法的...
    Coming0524阅读 6,470评论 2 8
  • 好久没刷朋友圈,刷着刷着,突然好友晓晨的几张小清新照片惊艳到了我。 夏日绿色的背景,只见她穿着一袭白衣黑裤,面庞干...
    木小易512阅读 265评论 0 1
  • 严格说起来,志军认识老刘是在办理退休手续那天。老刘是这条战线的老兵了,退休时混到了副处,在这个千人机关也算是比上不...
    过客无名871阅读 224评论 0 0