缘何自研算法serving框架
首先说下我们的背景,我们目前是大数据部门的算法团队,我们的客户:内部子公司与业务部门所服务的CRM客户,我们的使命:为这些客户及客户的客户提供建模服务,针对不同业务需求,我们开发了一系列模型及机器学习算法/产品,但是构建模型只是问题的一部分,我们的建模之后的挑战是要找到一种方法,使得模型可以在生产环境下服务,而且是面向不同客户不同环境提供部署服务。模型服务系统将经受大量的业务。所以需要确保为这些模型提供的软件和硬件基础架构是可扩展的、可靠的和容错的,这对的客户来说是非常重要的。由于好多的需求和涉及算法比较类似,如果为每一个客户提供个性化语言的模型开发势必会造成资源的浪费。基于此我们开始考虑开发一套统一的对外算法服务框架,一来可以对算法的统一开发与管理,二来可以收集客户数据及共享模型给不同的客户(前提是得到客户的许可)。基于这些思考促使我们对算法服务框架的研究。
前期调研
在明确建设目标后,我们对市面上相关的框架进行仔细调研,总结和借鉴这些框架相关部分,以帮助对目标的设计。经过与工程师的多次讨论,我们明确了一些需要具备的核心功能:
- serving时的低延迟,提供REST API
- 横向可扩展
- 分布式serving,增强并发
- 灵活易开发的微服务架构
- 支持开源框架的整合,以支持未来的数据产品
- 支持场景化模型/算法pipeline的开发与部署
- 热部署,即新的算法服务及模型更新不需停掉旧的服务
期间我们研究的框架包括:H2O、PredictionIO、BigML、common_lab_so、tensorflow serving等,这些框架与我们的目标之间各有不同程度重合部分可借鉴。其中,H2O可提供REST API、模型易开发和部署,但不支持横向算法或场景模型的扩展、系统封闭不兼容其他开源框架、没有热部署、分布式serving和场景化pipeline部署功能;PredictionIO支持REST API服务、横向扩展、开源兼容、热部署,但在场景化、灵活性、分布式方面相对比较欠缺;BigML早在12年之前就开始serving方面的研发,是比较早提出MLaas模式的公司,其特点是与H2O类似,提供相对友好的web UI和客户端的接口,主要focus的点也在基础算法的训练和预测,其他方面涉及不多;common_lab_so为微博开发的内部算法serving框架,在灵活、热部署、场景化等方面都有考虑和设计,但其在部署的配置方面非常麻烦,每次上线新的算法都需要配置一堆的逻辑;谷歌的tensorflow serving无疑是大多行内人认可和评价较高的框架,其在我们讨论的各个方面除了兼容开源框架以及场景化pipeline方面的支持之外都是符合的,我们也在后期专门开发了基于python的service,支持tensorflow模型的应用,或届时如业务需要直接部署tensorflow serving。
AlphaML serving
经过网上一系列的调研之后,我们选择C++为框架的开发语言,综合调研几个框架的设计,开发我们自己的模型服务。
Serving 框架:
- 框架说明:
- Offline train:有些线上服务需要离线模型支持,支持方式包括定期、周期更新两种,比如文本相似度计算需要的向量化数据定期即可,Leads模型需要的模型数据可能需要周期性训练并更新,离线模型训练好后保存至其对应的线上算法路径。
- File System:保存离线模型文件。
- AlgoPool:存放线上算法文件,并开发对应的so库,上线时load需要的模型文件,上线时需要向模型管理模块注册,告知新增算法可用,上线举例:
lGLOG_logtostderr=1 ./ftrl.bin -model model -algname ftrl -algmgr localhost:9001 -port 10080
其中,ftrl.bin为算法主文件,-model 为需要load的模型文件,-algname 为该服务名,用户根据服务名区分不同服务,也是通过服务名完成相同服务的分布式(由模型管理模块做负载均衡的管理),-algmgr为该服务的注册IP地址
- Algomgr:模型管理模块,负责上线算法的管理、更新模型文件的检测与自动更新。
- Apiserver:负责对外提供服务,和算法so文件的自动识别和加载,并提供已上线模型服务的查看。需要先启动服务,以供管理模块和算法模块的注册与管理,启动方法:
nohup ./apiserver.bin -port 9000 -algomgr_port 9001 -b > nohup.log 2>&1 &
apiserver只需在master主机上启动即可,worker节点通过IP:port向其注册,其中-port 为对外访问的端口,-algomgr_port为内部算法服务向管理模块注册的地址,算法服务可以部署在不同的worker节点上。
- 通信协议:内部采用thrift实现序列化,对外预测服务采用http协议。
#### 现有功能和pipeline:
- 监督式学习:[GBDT](%E5%B9%BF%E4%B9%89%E7%BA%BF%E6%80%A7%E6%A8%A1%E5%9E%8B,xgboost)(Gradient Boosting Decision Tree,包括poisson regression、LR、linear regression、multiclass classification),[最近邻模型](knn)(k-NearestNeighbor)
- 非监督式学习:聚类问题(Sparse k-means++)、共现矩阵生成算法
在线学习:[在线梯度下降模型](OnlineFTRL)(online stochastic gradient descent)、[在线主题模型-LDA](Bigartm)(LDA、PLSA)
- 文本挖掘:[基础功能](cppjieba-master)(在线分词、基于TF-IDF和TF-entropy关键词提取)、[文本自动分类](cppjieba-master)、[文本内容推荐](cppjieba-master)(sum-vec、cluster2vec、LDA2Vec)、[标签自动标注](tagging)(基于embedding和共现矩阵及Prob-CF框架)、[概率语言模型](kenlm)(依赖kenlm、rnn、knn、trie tree、beam search)
- 推荐算法框架:[内容-协同过滤混合框架](RNN-PLSA-CF)(PLSA-CF)
- Corsets scalable resample online Ensemble框架
为兼容TensorFlow/MXnet等深度学习框架,新增python algo server功能
算法框架组件:
- [特征工程](xgboost):可以对连续变量自动binning,基于GBDT的方法
- [文本向量自动转化](cppjieba-master-clustering-artical2vec.cpp)(x2vector):可将文本内容/行为记录自动映射为向量
- [概率协同过滤框架](%E5%B7%B2%E5%AE%9E%E7%8E%B0)(Prob-CF):可处理标签和推荐类问题
- [数据服务器](Data%20%20service)(Data server):负责批量和实时外部数据传输
#### 期待未来增加的功能清单:
增加积木化的算法框架(比如TensorFlow)和由其产生的场景化模型,当然也无需盲目追求高大上,更重要的还是算法本身与业务之间的切合度。