一、背景
期望通过强大易用的功能,来辅助算法研发人员,帮助大家脱离繁琐的工程化开发,把有限的精力聚焦于算法策略的迭代上面。通过一站式打通特征工程、模型训练、在线预测&上线等重要步骤,避免重复造轮子,以及解决特征穿越等问题。
二、调研
我们参考多个大公司的机器学习平台的实践经验,几乎都是拖拽+组件构成DAG图执行的方式来做。以下是几个重要的调研地址:
通过剖析和理解,大概有了几点实现思路:
- 它核心是一个调度系统,支持手动和定时运行DAG
- 支持扩展组件,尤其是机器学习组件
- 支持组件之间参数传递
- 打通hive、hdfs等存储系统
- 打通特征平台、模型管理平台等外部系统
对于2-3人开发团队来说,要完成这个大系统,很难从零自研去做,只好借助开源的力量。
算法原本使用azkaban系统,用shell、python脚本来完成算法侧所有工作,所以想基于azkaban来二次开发。但azkaban缺少DAG拖拽UI支持;机器学习组件扩展也不方便;且是基于flow调度,而不是job,粒度太大。
我们关注到海豚调度(ds)这个项目在apache孵化,当时刚release 1.2.1版本,非常适合这个场景。ds官网https://dolphinscheduler.apache.org/zh-cn/index.html,体验地址http://106.75.43.194:8888/dolphinscheduler/ui/view/login/index.html
三、实现
实现是基于ds的二次开发,首先完善调度核心改造,然后和算法RD合作,完成机器学习组件制作。
1、改造工作
- 兼容azkaban:新平台定位是调度+机器学习,除了算法RD外,还有数据分析工程师使用,大家对azk使用习惯特别深入。新平台借鉴了azk的一些特性,比如“流程运行趋势图”、“手动执行选节点enable/disable”等。同时增加azk任务依赖组件,打通ds和azk任务依赖。
- 任务(组件)参数传递:ds之前不支持参数传递,但机器学习下层组件,依赖上层组件的输出,参数传递很有必要,目前实现了文件(hdfs),数据库(hive)两种输出类型。
- 参数体系改造:增加手动运行参数,调整参数优先级,目前是按天补数>运行参数>局部参数>全局参数(azk特性,支持手动调试DAG)。
- 搭建ds的发版机制及预发环境,加速迭代效率。
- gitlab hook注册,用户只需idea提交代码,平台自动pull,可直接在平台引用。
- 执行机器定制,方便业务定制自己的执行机器。
- 机器学习组件的开发,需要工程RD对算法领域有比较多的涉猎,比如理解tensorflow,xgboost,特征预处理,模型训练,模型评估等知识,和算法RD通力协作。
- 二次开发遇到比较多BUG(毕竟当时ds才开源不久),比如容错失败、调度重复触发、状态异常等,依靠社区力量和团队努力都很好的解决了。遗憾的是平台重点在机器学习组件开发,对ds社区贡献不多。
2、重要页面原型
- 工作流(DAG)编辑
- 项目列表
- 工作流(DAG)定义列表
- 工作流(DAG)实例列表
- 任务(组件)列表
- 工作流(DAG)实例运行趋势图
- 简易发版程序
- gitlab hook注册管理
- 定制执行机器
四、总结
这是机器学习平台的一个小实践,因为是公司项目,不能放太多细节。为了贴合公司业务特性,以业务优先,我们定制了很多东西,同时自身能力也有待提升,不能和阿里PAI、腾讯TI-ONE、美团Turing这种平台相提并论。