通俗来说,模型部署就是在某一框架内训练好的模型(权重文件),通过具体框架进行模型转化或者直接使用对应语言所提供的API接口,load、get一系列操作,使得训练好的“黑箱”能得到实际应用。这种方式可能是简单的pyinstaller库进行简单的封装、也可以是pyqt进行界面集成、接口调用,或者使用flask或者Django框架进行前端和后台服务器的嵌入,这些总体来说,都算是模型部署。
使用docker部署模型的好处在于,避免了与繁琐的环境配置打交道。使用docker,不需要手动安装Python,更不需要安装numpy、tensorflow各种包,直接一个docker就包含了全部。docker的方式是如今部署项目的第一选择。docker简单来说就是一种容器技术,如果有做过技术支持的朋友肯定了解安装软件的痛苦——各种系统环境,导致各种安装报错…docker解决的问题就是,只要你在服务器上安装上docker,那么它会自动屏蔽所有的硬件信息,拉取一个镜像,就能直接启动提供服务。注意正常需要配置docker占用的显存比例
大多数工具可以互换,比如 Keras 可替换成 TensorFlow 或 PyTorch,Django 可代替 Flask,Nginx 可代替 Apache。
1、TensorFlow Serving
TensorFlow Serving是google提供的一种生产环境部署方案,一般来说在做算法训练后,都会导出一个模型,在应用中直接使用。Google提供了一种生产环境的新思路,他们开发了一个tensorflow-serving的服务,可以自动加载某个路径下的所有模型,模型通过事先定义的输入输出和计算图,直接提供rpc或者rest的服务。
一方面,支持多版本的热部署(比如当前生产环境部署的是1版本的模型,训练完成后生成一个2版本的模型,tensorflow会自动加载这个模型,停掉之前的模型)。
另一方面,tensorflow serving内部通过异步调用的方式,实现高可用,并且自动组织输入以批次调用的方式节省GPU计算资源。
2、pytorch
环境配置:首先确保安装了pytorch,因为需要使用flask这个web框架,所以当然需要安装flask,flask框架
配置REST API:我们知道每次启动模型,load参数是一件非常费时间的事情,而每次做前向传播的时候模型其实都是一样的,所以我们最好的办法就是load一次模型,然后做完前向传播之后仍然保留这个load好的模型,下一次有新的数据进来,我们就可以不用重新load模型,可以直接做前向传播得到结果,这样无疑节约了很多load模型的时间。所以我们需要建立一个类似于服务器的机制,将模型在服务器上load好,方便我们不断去调用模型做前向传播,那么怎么能够达到这个目的呢?我们可以使用flask来建立一个REST API来达到这一目的。REST API 是什么呢?REST 是Representational State Transfer的缩写,这是一种架构风格
3、Nginx web 服务器
Nginx:Nginx 是一个开源网络服务器,但也可以用作负载均衡器,其以高性能和很小的内存占用而著称。它可以大量生成工作进程,每个进程能处理数千个网络连接,因而在极重的网络负载下也能高效工作。在上图中,Nginx 是某个服务器或实例的本地均衡器,用于处理来自公共负载均衡器的所有请求。我们也可以用 Apache HTTP Server 代替 Nginx。
转载其他博客一个有趣的对话:
Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Flask来处理这个请求。
WSGI:OK,Nginx。我会设置好环境变量,然后将这个请求传递给Flask处理。
Flask:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。
WSGI:Alright,那我等你。
Flask:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。
WSGI:Good job!Nginx,这里是响应结果,已经按照要求给你传递回来了。
Nginx:Cool,我收到了,我把响应结果返回给客户端。大家合作愉快~