模型服务架构及部署
# 模型服务架构及部署
介绍如何将深度学习模型部署成网络服务(微服务)
常见的模型服务方式有两种
- http web服务方式(被动)
- mq 消费者方式(主动)
# 模型 http 服务方式
- 假设有一个训练好的模型
- 假设 batch 只能是 1
- A在推理一个样本的时间是 1S
- 推理需要的资源是1核1G
# 单一模型来处理一个请求
建一个单一的(单进程,一次只能处理一个请求的)服务,这个很简单。
flask 创建 1 个 app 进程 + 模型直接启动就可以了(在 app 进程中调用模型)。
如果来2个请求,则第二个请求要等待第一个请求处理完,要一个一个的处理。
# 两个模型来处理两个请求
flask 创建 2 个 app 进程,每个进程都加载一个模型
⚠注意
需要 2核2G ,如果资源不足,会卡死或者爆内存
⚠注意
这里不能使用线程或者协程,即不能在一个 flask app 进程中开两个线程来加载模型 ,想要用线程来并行 CPU 任务是不正确的。 因为这是两个 CPU 任务,不能使用多线程并行,线程无法使用多核,导致两个 CPU 任务只能串行。 如果是 纯 IO 任务,或者 IO + CPU 任务,则可以使用多线程来提速。 当然,如果是非常小的 CPU 任务,也可以用多线程加速。
# 个模型来处理 个请求
个请求是并行的,同时来 个请求,则设置 个 app,同时处理这 个请求。
所以, 模型服务能处理几个请求(QPS),并发量是多少,取决于 flask app 进程个数,也即取决于服务器核数和内存等资源数。当然还有网络。而不是由线程或者协程等并行优化技术决定的。
⚠注意
在部署 个进程之后,初始时刻进来 个请求后,1S 时间内,其他 之后的请求是无法处理的,进不来/不响应。
⚠问题
这里只能做 个并发,但是一个完整的 web 服务,除了有模型服务之外,还有注册登陆等服务, 这些服务可能需要远大于 的并发量,在扩展其他服务的并发量的时候,要注意模型的并发是多少,避免超过 之后 带来的性能下降甚至卡死。
# 负载均衡
使用 nginx 来对服务做负载均衡,控制具体哪个请求分配到哪个app 上
使用 flask 来建立 http app
# 服务的水平扩展
一台服务器资源不够用,可以很容易的添加服务器,建立相同的 app,然后使用 nginx 负载均衡。
# 部署时要考虑的点
- 一个模型需要多少资源
- 想要处理几个请求
- 服务器的资源是多少
# 保证服务高可用
所有进程 (nginx+app) 都需要保证高可用
- nginx 挂了怎么办 - 使用心跳来做备份
- flask 挂了怎么办
# 进程日志的采集
所有进程 nginx+app 都需要日志采集
# http 客户端
上面说的是 http 服务端的部署
客户端在发起 http 请求调用模型的时候,需要是异步的, 因为这里的 模型求解最少也需要 1S 的时间,可以在这 1S 的时间内执行一些其他的程序,然后异步等待结果即可。
# http 优缺点
- batch 不能控制。
- http 进程更容易监控其状态,更符合微服务的要求,比如使用 k8s 来部署和监控进程。
- http 是被动调用的。
- 一般进程是需要设置超时的,由于是 http,懒得话,可以省略超时
# 模型 mq 消费者服务方式
将请求送到消息队列当中 把模型变成消费者进程 多个消费者进程来抢任务
# 消费者优缺点
- batch 能控制
- 主动调用
- 进程不容易监控
# web 模型
web 业务模型
- django
- flask
- sanic
# 基础工具
web 模型中应该尽可能少的有状态(磁盘存储) 所有磁盘存储都要用单独的服务(文件、日志、业务数据)
因为为了能够水平扩展,就不能把数据存在本机,如果存在本机,则把数据固定到本机上, 扩展后的服务器无法访问本机数据。
# 基础工具
- 文件服务 hdfs (服务要保证高可用、日志回收等)
- 日志服务 ELK/EFK
- 业务数据库 mysql等
服务-进程:一个或多个进程,对外提供某一功能
# 前后端分离
本质就是js 语言通过 http 的形式调用 python 等语言,json 做数据交互。
- 接口 function a (入参json)-> (出参json)
- 路由 /a/b/c
- 前端路由 vue-router 等来进行页面切换,这与传统的前端路由不同。
get post 统一使用 post ,调用接口哪里来的 get/post?所以统一使用 post, get post 是上个世纪的产物了。
当然如果是 restfulapi 可以是其它形式,把计算机上的东西都变成资源 但有些并不都是资源,比如模型服务
# 身份验证
- cookies
- token
# 其他
# trainer-xy
https://gitee.com/lambda-xy/trainer-xy
训练过程可视化。动态绘制训练的 loss 等信息,并且可以发送消息来暂停/继续训练进程。 由于训练进程和可视化的进程是独立的,所以关闭可视化进程不会影响训练进程,且重新打开可视化进程时,仍然能正常显示。
# ma-xy
https://www.ma-xy.com
主要包含了计算机和数值计算方向的一些模型和算法