首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法系统-算法服务化的工程架构探索

前言

AI算法一直是大火特火,对于算法的服务化,相信很多小伙伴正在探索或者已经在实践了。菠菜最近在项目中也有所涉及,趁着有空写出来跟大家分享。本篇文章聚焦于如何将算法包装成系统对外提供服务,对于算法的模型训练、实时计算的特征获取、参数实时调优等暂不涉及。

算法现状/特点

目前的算法主流使用Python来实现(当然也有使用C/C++、Java、Golang等等)。对于Python来说,底层其实并不支持并发(无法充分利用多核CPU)。而还有一个问题比较突出的是,算法是由并不擅长工程研发的算法小伙伴来实现,对于稳定性上会有或多或少的问题。那如何设计工程架构一方面提升性能、一方面提升稳定性就尤为重要了。

算法系统的架构思路

我们先来看看菠菜设计的算法系统架构图:

总体

总体分为服务层算法容器,服务层为主进程,用于对外提供服务+算法容器管理。每个算法容器一个独立的子进程。用于跑真正的算法。

服务层

服务层负责对外提供Http访问的服务。除此之外还有一个特别重要的功能就是算法容器管理。算法容器管理分为三部分:

算法版本管理,用于管理目前运行的算法类型以及相应的版本。不同类型的算法还会提前配置好启动时的版本以及历史可用的版本列表。

运行/监控/异常回滚,基于算法版本管理启动(即启动子进程)对应版本的算法。在运行过程中会实时监控算法运行情况,若发生异常则回滚到上一稳定的版本。

容器通讯,与算法所运行在的子进程进行通讯,达到调用算法的目的。由于考虑到进程间通讯尽可能的高性能,此处是采用Unix Domain的方式(可私下搜索了解下,这里暂不赘述)。

算法容器

每个算法容器运行在一个独立的子进程中,以算法类型+版本为最小粒度启动算法,每个容器只会运行一个算法类型+版本的算法。而算法引擎则主要负责两个事情:

特征数据适配/修正,在实践过程中由于特征数据的格式错误导致的crash比较多,所以在算法引擎这块,需要对每次输入的特征数据进行适配/修正,保证特征数据的正确性。

多语言算法适配,用于适配用不同语言实现的算法。算法系统菠菜是采用Golang来实现,对于Golang可以直接通过cgo来调用C,这样对于C/C++的算法,只要打包成lib即可被调用,而Python也支持用C调用来初始化Python引擎,至此多语言适配都是可行的。

总结一下该设计的好处

稳定性高,服务层与算法容器在不同的进程,算法的crash不会导致服务层crash,而服务层还会进行实时监控以及异常回滚,最大限度的保障服务的稳定性

性能高,对于算法来说,是CPU密集的,数据会提前放入内存,不会有额外的由于数据加载而产生的低性能IO操作(如网络IO、磁盘IO)。而该架构使用多进程,但每个进程只有一个线程,不存在多线程之间的锁等造成的性能浪费(类似于Redis)。另外,多子进程可以充分利用多个CPU,达到性能最优。

最后

年前最后一篇文章啦,写完了,菠菜就要好好过个年了,等年后,菠菜会继续抽时间多写点干货给大家分享,有任何想深入沟通的,欢迎小伙伴们年后找菠菜讨论:)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190211G05G1J00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券