tensorflow serving:bazel方式部署模型+docker方式部署模型及提供服务以及使用该服务介绍(总有一款适合你)

来源:互联网 发布:vb语言程序设计 编辑:程序博客网 时间:2024/06/09 17:46

写在前面 

  随着机器学习/AI的越来越热,相信很多公司算法岗所开发使用的模型也是越来越丰富,伴随的模型的增多一个很严酷的问题肯定会摆在越来越多的公司面前,线上使用的模型会越来越让服务器的内存空间吃紧且使用起来混乱。可能是借鉴了很多编程里面可以调用api调用函数/服务的方式的影响,google在去年提出了原生支持tensorflow的tensorflow serving工具包。它支持模型的热更新和自动版本管理管理。可以通过它让我们更加方便更加高效的部署线上的服务。
  基于以上所提的优点,以及本人实习过程中业务的需要,楼主开始接触Google的这一大杀器。写这篇文章的目的有以下几点:1.在学习的时候发现网上可以借鉴的资料很少,所以把自己的一点心得和大家分享;2.自己摸索的时候遇到了很多坑,所以跟大家分享的过程中让您少走弯路;3.在介绍的时候会加入一些楼主的心得,可能会帮助您更好的理解tensorflow serving,并能够更加方便的使用;4.楼主现阶段刚解决的这个任务,所以现在记得最清楚,也作为一个备忘录吧.
  好了,前面扯了那么多,现在我们开始do it!

  part1:利用bazel进行编译和开启tensorflow serving。。

    首先比较推荐的是使用bazel的方式来使用tensorflow serving,通过该方式你能过更加深入的了解tensorflow serving的运行机制。
    利用bazel的方式主要借鉴的是官方的文档,传送门:https://tensorflow.github.io/serving/setup

    1.1bazel的安装

        安装的话按照官方的安装方式就好了,楼主主要说两个要注意的点:一个是安装下载的版本,bazel下载的网址:https://github.com/bazelbuild/bazel/releases
        这里一定要根据自己的系统下载对应的安装包,然后对安装实例代码进行针对性的修改,如果你点进去的时候你会发现其实还要安装很多依赖的包,传送门:https://docs.bazel.build/versions/master/install.html。按照上面的官方文档一步一步进行吧,心理默默祈祷不要出什么问题,如果出了什么问题就自己针对性的查找解决办法啦。另一个点是环境的配置:export PATH="$PATH:$HOME/bin"。如果少了这句就会经常出现之前还能用bazel怎么后来又不能用啦,这个时候不要第一时间怀疑自己的人品,先加这么一句.

  1.2进行gRPC的安装

         这个没什么好说的,复制粘贴吧,然后心里默念。。。

  1.3重点来了,tensorflow serving的安装啦

        找个你想安装的地方,然后1.从github上下载文件
git clone --recurse-submodules https://github.com/tensorflow/serving
2到serving文件夹下
cd serving
3到tensorflow文件夹下
cd tensorflow
4.tensorflow serving配置自己的环境和依赖文件
./configure
5.返回到serving目录下
cd ..
6.进行利用bazel进行编译并生成对应的tensorflow_model_server二进制服务器,bazel-bin/tensorflow_serving/model_servers/目录下可以看到一个名为tensorflow_model_server的二进制可执行文件,这个文件就是TensorflowServing接口服务器了
To build the entire tree, execute:
bazel build tensorflow_serving/...
Binaries are placed in the bazel-bin directory, and can be run using a command like:
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server
To test your installation, execute:
bazel test tensorflow_serving/...
如果test完都通过测试的话至此tensorflow serving安装就告一段落啦。

1.4 tensorflow serving的使用

网上有一些基于tensorflow serving样例的文章,这里楼主更想谈谈利用tensorflow serving为自己的模型进行提供服务。

这里面的参数要说明的话:一个是第一行是指定你想把用于tensorflow serving的checkpint文件(tensorflow serving支持的模型保存方式)生成的地方。第二行来制定你的这个模型的版本,如果是第一次使用的话指定为1,如果有更新就2,以此类推,tensorflow serving会将新版本覆盖旧版本,方便版本管理,第三行的saver是利用了tensorflow.train.Sever()将模型保存成一个ckpt文件。然后其他还需要改动的地方是这个x,和y,楼主使用的x,y,也可以是input/output,不过设定完一定要记得,这个在后面要使用的,然后就是后面的东西了,这个是对应你设计的模型的输入输出。然后它执行完之后会在你指定路径生存一个00000001的文件夹,里面有4个文件,是tensorflow serving保存你模型和要提供服务的文件。
然后:启动server服务
bazel build //tensorflow_serving/model_servers:tensorflow_model_server (注意你现在是cd到serving路径的)
然后:生成tensorflow serving服务
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/Users/jeff/PycharmProjects/tmp/test_age/test/
——》将之前的checkpoint文件用端口9000(可修改),调用tensorflow serving
(mnist是模型名字,可修改,/Users/jeff/PycharmProjects/tmp/test_age/test/是checkpoint所在位置)
至此你会发现tensorflow serving已经在端口9000上开启了tensorflow serving的服务了,接下来就是自己创建一个client来进行使用该服务进行

1.5使用tensorflow serving的服务

这里要注意的点是:1.自己的输入一个要和自己先前定义的模型的输入匹配;
2.端口要对应;

不同主机的端口要一一对应

3.提供服务自己的模型的名字。2&3相当于是来唯一寻找该服务的。

4.然后输出的话需要说一下。

这里是说可以取出result结果中的float_val对应的结果,然后取其中的最大值。完整代码的话楼主有时间的话传一份到github上吧,里面要注意的点细说的其实还有很多.

Part2:利用docker进行编译和开启tensorflow serving。。
有了part1,现在再来看part2就会轻松很多
2.1首先docker的安装
2.2 tensorflow serving的Dockerfile文件设定:
Google很贴心的给出来了:https://tensorflow.github.io/serving/docker.html,楼主在使用的时候有个小bug,jdk后面的斜杆要空一格,应该会很快修复吧。
2.3 利用docker将Dockerfile生成镜像文件
docker build -it $USER/tensorflow-serving -f Dockerfile .
楼主是利用gitlab让其自动生成一个镜像的,利用docker的目的是想这样生成的镜像以后多个项目都可以用,然后其他一些服务可以在这个镜像的基础上进行扩展。
2.4 在该基础的镜像的基础上新建模型并使用tensorflow serving部署模型提供服务
主要是把part1中提到的利用tensorflow serving生成的checkpoint及其余三个文件拷贝到新的Dockerfile中,然后在里面写个shell文件来进行执行调用tensorflow serving对该checkpint生成服务。这样就可以生成一个你需要模型的镜像文件,然后在调用该镜像的时候调用该脚本生成tensorflow serving服务。
脚本文件为:

下面利用docker调用shell文件。其中的hub.musical.ly:6000/tensorflow_serving_predict_age:70830aa是楼主的模型的镜像名称和位置

这样就利用docker和tensorflow serving部署了模型并提供了服务
2.5 接下来使用client来使用该服务完全和part1一样,这里不再赘述。

如果有什么问题欢迎留言,楼主有时间都会回答的,共勉

-------------------------------------------------------------------------------------------------我是一条华丽的分隔符------------------------------------------------------------------------------------------------------
楼主在具体业务上使用的时候遇到了两个问题:
1.就是部署的模型的输出可能特别多,但是可能业务上需要的只有结果中的一部分,这样如果全部输出所有结果的话可能会极大的增加模型的predict时间,而且多输出会造成服务器内存以及传输性能上的不足;
2.有些模型的输入或者输出可能不只一个,这个问题有的时候其实挺常见的,楼主遇到了这个问题在网上查找借鉴了很多方案,最终调试成功了,现与君分享:

请仔细参考楼主的代码,其中要注意的是模型的输出一定要转化为Tensor,如果需要楼主的完整代码的,请私信我哦

阅读全文
2 0
原创粉丝点击