# 十分钟搞定 Tensorflow 服务

Tensorflow 服务是谷歌推荐用来部署 Tensorflow 模型的方法。如果你不具备一定的计算机工程知识背景，即使你对 Tensorflow 本身感觉很顺手，但是我觉得想要搞定 Tensorflow 服务也不是辣么容易的。以下三点是我总结的难点：

• （谷歌官方）教程含有 C++ 代码（我不会 C++）
• 教程里含有 kubernetes，gRPG，Bezel（其中一些我也是第一次见）
• 需要被编译出来。那个过程时间太长了，恐怕要用一个世纪吧！

`avloss/tensorflow-serving-rest.`

`docker run --rm -it -p 8888:8888 -p 9000:9000 -p 5000:5000 quay.io/avloss/tensorflow-serving-rest`

```import tensorflow as tf

x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

y = tf.matmul(x,W) + b

cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

`pred = tf.argmax(y,axis=1)`

```from tensorflow.examples.tutorials.mnist import input_data

sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())for _ in range(1000):
batch = mnist.train.next_batch(100)
train_step.run(feed_dict={x: batch[0], y_: batch[1]})```
```Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz```

```%matplotlib inlineimport matplotlib.pyplot as plt

number = mnist.train.next_batch(1)[0]

plt.imshow(number.reshape(28,28))```
`<matplotlib.image.AxesImage at 0x7fa28919ae90>`

`sess.run(pred,feed_dict={x: number})[0]`
`6`

```EXPORT_PATH = "/tmp/models"
VERSION=1```

```from tensorflow.contrib.session_bundle import exporter

saver = tf.train.Saver(sharded=True)
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({'pred': pred})})
model_exporter.export(EXPORT_PATH, tf.constant(VERSION), sess)```
`INFO:tensorflow:/tmp/models/00000001-tmp/export is not in all_model_checkpoint_paths. Manually adding it.'/tmp/models/00000001'`

`!ls -lhR /tmp/models`
```/tmp/models:
total 12K
drwxr-xr-x 2 root root 4.0K Mar 10 10:29 00000001
-rw-r--r-- 1 root root 7.6K Mar 10 10:29 model.log

/tmp/models/00000001:
total 72K
-rw-r--r-- 1 root root 119 Mar 10 10:29 checkpoint
-rw-r--r-- 1 root root 31K Mar 10 10:29 export.data-00000-of-00001
-rw-r--r-- 1 root root 159 Mar 10 10:29 export.index
-rw-r--r-- 1 root root 29K Mar 10 10:29 export.meta```

## Services

• `jupyter notebook`

• `/serving/bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server`

• `/serving/bazel-bin/tensorflow_serving/example/flask_client`

`!tail -n2 /tmp/models/model.log`
```2017-03-10 10:29:49.461339: I tensorflow_serving/core/loader_harness.cc:86] Successfully loaded servable version {name: default version: 1}
2017-03-10 10:29:49.464518: I tensorflow_serving/model_servers/main.cc:257] Running ModelServer at 0.0.0.0:9000 ...```

## REST 请求

```import numpy as np
import cPickle as pickle
import requests

URL = "http://localhost:5000/model_prediction"

s = pickle.dumps({"x":x}, protocol=0)

DATA = {"model_name": "default",
"input": requests.utils.quote(s)}

r = requests.get(URL, data=DATA)
return r.json()```

```%matplotlib inline
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

number = mnist.train.next_batch(1)[0]

plt.imshow(number.reshape(28,28))```
```Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz

<matplotlib.image.AxesImage at 0x7fa28d001050>```

## 预测过程

`test_flask_client(number)`
```{u'outputs': {u'pred': {u'dtype': u'DT_INT64',
u'int64Val': [u'7'],
u'tensorShape': {u'dim': [{u'size': u'1'}]}}}}```

`int(test_flask_client(number)["outputs"]["pred"]["int64Val"][0])`
`7`

## 完成!

`docker commit XXXXXX my_name/my_model:version1`

`docker save my_name/my_model:version1 > my_name.my_model.version1.tar`

`docker load --input my_name.my_model.version1.tar`

`docker run --rm -it -p 8888:8888 -p 9000:9000 -p 5000:5000 my_name/my_model:version1`

0 条评论

• ### 基于 Tensorflow eager 的文本生成，注意力，图像注释的完整代码

我总是发现生成和序列模型令人着迷：他们提出的问题与我们刚开始学习机器学习时常遇到的问题不同。当我第一次开始学习ML时，我学了分类和回归（和大多数人一样）。这些帮...

• ### 专栏 | 目标检测算法之YOLOv3及YOLOV3-Tiny

昨天稍微填上了YOLOv2损失函数的坑，然后我在知乎关注了一个有趣的问题，地址是：https://www.zhihu.com/question/35700517...

• ### Github 项目推荐 | TensorFlow 项目模板架构最佳实践

一个简单且设计良好的架构对于任何深度学习项目来讲非常有必要，这里的 Tensorflow 项目模板经过了大量的实践，拥有简单性、良好的文件结构以及 OOP 设计...

• ### 20项任务全面碾压BERT，全新XLNet预训练模型

这是继BERT发布以来又一个令广大NLPer兴奋的消息， CMU 与谷歌大脑提出的 XLNet 在 20 个任务上超过了 BERT 的表现，并在 18 个任务上...

• ### 最新版chevereto3.10.5使用体验

使用chevereto图床几天之后，发现这个图床系统还是挺好用的，虽然安装简单，功能很强大。 既然是一个功能的网站，就说说他使用的体验 ? chevereto网...

• ### 优雅的备份博客内的外链图片

这是我早就想做的一件事情了，但没想到不得不做这件事的这一天这么快就来临了。其实从一开始，我就对免费图床并不放心，在国内一直使用的是付费的作业部落的图片存储（阿里...

• ### 如何揭开Linux中的命名空间和容器的神秘面纱【Containers】

容器已经席卷全球了。听到这个术语时，无论您想到Kubernetes，Docker，CoreOS，Silverblue还是Flatpak，很明显，现代应用程序都在...

• ### 如何揭开Linux中的命名空间和容器的神秘面纱

集装箱已经席卷全球了。听到这个术语时，无论您想到Kubernetes，Docker，CoreOS，Silverblue还是Flatpak，很明显，现代应用程序都...

• ### TidyFriday 每天 5 分钟，轻轻松松上手 R 语言（六）数据读取与保存

我们最先要了解的是我们的工作目录，当文件在当前目录下时我们输入文件名即可， 没有在当前目录我们就要输入数据文件的绝对路径。