共计 1911 个字符,预计需要花费 5 分钟才能阅读完成。
背景
家喻户晓 python 在机器学习实际中的利用宽泛深刻,而在咱们业务中的利用集中在提供线上实时风控输入服务,比方国内业务的模型在线服务架构和海内业务的后盾决策引擎架构。这两种利用的联合就要求咱们思考如何高效平安便捷地来实现模型的在线部署,为上游提供服务。
在咱们的思考中,无论是代码复杂程度和业务场景,还是语言自身的特点,模型部署都有趋于向微服务架构转型的趋势和须要。一方面,须要进行代码拆散来明确责任分工进步开发效率和容错性。另外一个方面,python 在 CPU 密集型的利用中体现是无奈令人满意的。为了应用协程来进步异步性从而解决更多的并发申请,最间接地就是将 CPU 密集转化为 IO 密集,因为 Python 天生就适宜 IO 密集型的网络应用。
因而,咱们生产中将模型计算抽取为 model_lib 代码库,并且通过微服务 online_model 进行交互。这里咱们调研过两种模型部署的形式,最终抉择了第一种。
一、基于 flask 框架进行模型部署
Flask 是一个轻量级的可定制框架,具备灵便、轻便且高效的特点,并且是规范的 wsgi 接口框架,易于扩大和保护。
1. 为什么选用 nginx+uwsgi+flask 这种技术架构
1)Uwsgi 搭配 nginx 性能快,内存占用低,高度可定制,自带详尽日志性能,反对平滑重启。
2)Flask 齐全兼容了 wsgi 规范;微框架,扩展性强;齐全基于 unicode,不需解决编码问题;自带服务可独立做单元测试及开发。
3)咱们客户端采纳了 tornado 协程,曾经实现了将 cpu 计算转为 io 操作,服务端齐全是 CPU 密集的模型计算,不会开释过程,异步框架放弃大量文件描述符状态消耗内存,因而不实用异步 IO 框架。
2. 业务流程框架
3. 部署形式:
部署形式采纳 nginx+uwsgi+flask 的形式,uwsgi 可间接承受 socket 而不是 http 申请进步性能,再将服务转发给 flask 框架,这里留神 flask 此类 wsgi 标准接口的服务框架比方 djangoweb.py 在生产中个别不应用自带服务,而是在下层部署 uwsgi 或者 gunicorn 作为服务器来进行服务转发,下层再用 nginx 来做负载平衡,这样能够进步服务稳定性和性能。
4. 性能比对
微服务革新后 20 并发申请模型:
微服务革新前 20 并发申请模型:
本机测试并发性能就进步了 20%,但留神这是在高并发的状况下,就单条申请来看,微服务并不能显著进步性能。
二、基于 grpc 进行在线模型部署
在 gRPC 里客户端利用能够像调用本地对象一样间接调用另一台不同的机器上服务端利用的办法,可能更容易地创立分布式应用和微服务。与许多 RPC 零碎相似,gRPC 也是基于以下理念:定义一个服务,指定其可能被近程调用的办法(蕴含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来解决客户端调用。在客户端领有一个存根可能执行在服务端实现的一样的办法(这个办法就相似于接口)
1. 为什么选用 grpc 进行模型部署
- 1)grpc应用 ProtoBuf来定义服务、申请返回的数据格式,压缩和传输效率高,语法简略,表达力强。(如下为ProtoBuf 的序列化和反序列话性能体现)
- 2)grpc 可反对 tensorflow serving 的接口调用,tensorflow 实现模型训练和部署后,可提供服务接口,给 grpc 进行调用。实现不便,高效,自带版本治理、模型热更新等,很适宜大规模线上业务,是咱们下一步模型部署的技术方向。
- 3)gRPC 反对多种语言,并可能基于语言主动生成客户端和服务端性能库。
2. 部署形式(业务流程与之前雷同)
部署形式采纳 nginx+grpc, 要求 nginx 反对 http2.0。在客户端将 json 特色字典转为 protobuf。(https://github.com/NextTuesday/py-pb-converters/blob/master/pbjson.py 这里附上 json 和 protobuf 互相转化的脚本。)
3. 服务发现与负载平衡
4. 开发流程
客户端:
服务端:
三、两种形式线上模型部署比照
1)grpc 应用 protbuf 更加简单,须要在客户端服务端均保留 protbuf 文件并做校验,而 flask 只须要做好对立的接口标准标准即可。
2)grpc 应用 http2.0 更实用挪动端的在线模型预测,或者基于 tensorflowd 的大规模线上模型部署和预测,flask 更实用后端面向服务的手动模型部署和预测。
3) grpc 节俭数据空间,但与 python 交互须要做 json 和 protbuf 数据转换,flask 兼容 wsgi 规范,实用于 RESTful 类服务,但数据传输占用空间较大。