模型服务架构及部署

小艾同学 ... 大约 5 分钟

# 模型服务架构及部署

介绍如何将深度学习模型部署成网络服务(微服务)

常见的模型服务方式有两种

  • http web服务方式(被动)
  • mq 消费者方式(主动)

# 模型 http 服务方式

  • 假设有一个训练好的模型 AA
  • 假设 batch 只能是 1
  • A在推理一个样本的时间是 1S
  • 推理需要的资源是1核1G

# 单一模型来处理一个请求

建一个单一的(单进程,一次只能处理一个请求的)服务,这个很简单。

flask 创建 1 个 app 进程 + 模型AA直接启动就可以了(在 app 进程中调用模型AA)。

如果来2个请求,则第二个请求要等待第一个请求处理完,要一个一个的处理。

# 两个模型来处理两个请求

flask 创建 2 个 app 进程,每个进程都加载一个模型AA

注意

需要 2核2G ,如果资源不足,会卡死或者爆内存

注意

这里不能使用线程或者协程,即不能在一个 flask app 进程中开两个线程来加载模型 AA,想要用线程来并行 CPU 任务是不正确的。 因为这是两个 CPU 任务,不能使用多线程并行,线程无法使用多核,导致两个 CPU 任务只能串行。 如果是 纯 IO 任务,或者 IO + CPU 任务,则可以使用多线程来提速。 当然,如果是非常小的 CPU 任务,也可以用多线程加速。

# nn 个模型来处理 nn 个请求

nn 个请求是并行的,同时来 nn 个请求,则设置 nn 个 app,同时处理这 nn 个请求。

所以,AA 模型服务能处理几个请求(QPS),并发量是多少,取决于 flask app 进程个数,也即取决于服务器核数和内存等资源数。当然还有网络。而不是由线程或者协程等并行优化技术决定的。

注意

在部署 nn 个进程之后,初始时刻进来 nn 个请求后,1S 时间内,其他 nn 之后的请求是无法处理的,进不来/不响应。

问题

这里只能做 nn 个并发,但是一个完整的 web 服务,除了有模型服务之外,还有注册登陆等服务, 这些服务可能需要远大于 nn 的并发量,在扩展其他服务的并发量的时候,要注意模型的并发是多少,避免超过 nn 之后 带来的性能下降甚至卡死。

# 负载均衡

  • 使用 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 消费者服务方式

将请求送到消息队列当中 把模型AA变成消费者进程 多个消费者进程来抢任务

# 消费者优缺点

  • 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

trainer

https://gitee.com/lambda-xy/trainer-xy

训练过程可视化。动态绘制训练的 loss 等信息,并且可以发送消息来暂停/继续训练进程。 由于训练进程和可视化的进程是独立的,所以关闭可视化进程不会影响训练进程,且重新打开可视化进程时,仍然能正常显示。

# ma-xy

https://www.ma-xy.com

主要包含了计算机和数值计算方向的一些模型和算法

上次编辑于: 2021年12月11日 15:44