首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度学习基础-tensorflow serving

前言

在机器学习的大部分使用场景中,模型是要为线上业务服务的,需要处理业务请求来做实时的预估。 所以需要把模型发布成为一个服务。 最近在测试我司对tensorflow的集成功能的时候,涉及到了模型的上线。在github上面有tensorflow serving的开源项目,它就是专门为了让一个tensorflow 模型发布成线上服务而设立的,它能够支持固定的tensorflow模型格式,让保存到本地的模型不需要做任何改动就可以发布上线的同时,也提供了统一的API让我们访问模型服务。

模型的保存

在tensorflow中保存模型有好几种方式, 从最一开始的tf.saver到后来的exporter再到现在的savedmodel。 随着tensorflow serving的发展,模型的API和格式都发生了变化。 目前tensorflow serving推荐的模型格式是savedmodel, 接下来我们就看看tf.saved_model.builder.SavedModelBuilder

上面是声明一个savedmodel的代码。 创建这个builder的方式很简单,只需要传递想要保存的模型的路径就可以了。 注意在这里我使用了gaofei_cnn/0 这样的格式。 这是tensorflow seving的约定俗成。 /之前的gaofei_cnn是模型名称,之后的0是模型的版本。 在tensorflow serving中,我们是可以同时上线不同版本的模型的。所以我们一般都用这样的路径保存模型的。

签名(signature)

同时保存模型需要至少一个签名(signature),上面的代码就是声明一个签名。那这个签名有什么用呢,在我们的模型发布上线之后,其实就一个API。 我们调用API的时候需要把线上的数据传递过去。 但这里会有一个问题,我再之前的文章中写过。 一个模型训练的过程差不多是下面的样子的。

数据进来以后需要拼接,清洗,特征抽取等等过程。 之后才会输入到机器学习训练算法中进行训练。 也就是数据是要经过一系列的处理后才会进入模型训练。 同样的,在我们做线上预测的时候,也需要这样的步骤,才能输入到在线的模型中进行预测。 这是在机器学习中会遇到的很常见的问题。 同样的逻辑分布在线上和线下,但他们的代码却不一样。在之前很多的机器学习场景中,这都是非常头疼的问题,我们之前要做的线上线下模型一致性测试,其实就是这个问题带来的。 其实严格上说不是模型的一致性, 而是处理数据的逻辑的一致性。 测试他们是不是对数据处理的过程都是一样准确的。 如果线上处理的逻辑的代码出现了问题,和线下的不一样,那么输入到模型的数据就是不一致的,导致预测结果不准确。 而tensorflow的signature,可以很好的帮我们解决这个问题,从之前对于tensorflow的学习来看,在tf中的代码中我们也需要针对数据进行处理之后(比如上一篇我们用pandas对数据进行了筛选)才进行的训练。 所以如果我们能把这份数据处理的代码也保存在模型里并带上线的话。 就可以解决这个问题了。 这就是我们签名(signature)的作用。 在signature 中,我们可以把训练中的tensor op 通过signature 的方式保存到模型中。 这些tensor op其实都是一段计算逻辑。 我们的tf是图计算的,一个tensor会保存之前的所有操作。我们看看一个例子。

上面定义signature的过程中,我们要定义inputs 和outputs。 分别代表了输入和输出的tensor op。 inputs代表了模型的输入, 输入的数据要使用inputs中定义的op 进行处理。 而outputs则代表了输出。 当我们将模型上线后,数据经过inputs处理后, 得到的是outputs中设置的tensor。 上图是我再做一个cnn模型的时候,保存模型的一段代码。 inputs使用的名字是image,代表了图片数据,线上数据通过inputs中定义的tensor op处理后, 输入到模型中进行预测。 而得到的结果就是在outputs中定义的softmax和prediction。 其中softmax得到的是minist作为10分类的每一个分类的概率, 而prediction就是最后的预测值。这两个tensor op都是在代码中定义的。 之后,我们调用builder的方法来保存模型了。

上面的代码我们把signature加入到了模型中, 参数有sess,sess是tf.Session。 我们把训练中的计算图传递了进来。 在加上signature,就可以使用builder.save保存模型了。

tensorflow serving

我们安装tensorflow的服务。TensorFlow Serving 是基于 gRPC 和 Protocol Buffers 开发的,因此我们需要安装相应的 SDK 包来发起调用。需要注意的是,官方的 TensorFlow Serving API 目前只提供了 Python 2.7 版本的 SDK,不过社区有人贡献了支持 Python 3.x 的软件包。调用过程很容易理解:我们首先创建远程连接,向服务端发送 Example 实例列表,并获取预测结果。client的代码我就不演示了,我没太研究,我直接使用的我们产品的功能调用的服务请求。

输入的数据是一个图片,处理起来很很麻烦。 需要把图片转换成像素矩阵。 我们不演示了。 直接看下面的图。

还记得我们保存签名的时候,使用的images这个inputs中定义的名字么。 在调用的时候我们也要指明使用它。然后得到得的结果是我们outputs中定义的softmax和prediction。

如下:

我们的input是一个图片。 输出的prediction预测为5(我们使用的是之前mnist手写图片识别的场景demo),以及softmax输出的10分类中,每一分类的概率, 可以看到第六个分类(分类从0开始,第六个就是5这个数据) 的概率最高。所以prediction才输出为5.

结尾

最后附上完整的模型训练和模型保存的代码。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180619G07S8S00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券