荔枝机器学习平台与大数据调度系统“双剑合璧”,打造未来数据处理新模式!

编 者 按:在线音频行业在中国仍是蓝海一片。根据 CIC 数据显示,中国在线音频行业市场规模由 2016 年的 16 亿元增长至 2020 年的 131 亿元,复合年增长率为 69.4%。随着物联网场景的普及,音频场景更是从移动端扩展至车载端、智能硬件端、家居端等各类场景,从而最大限度发挥音频载体的伴随性优势。

近年来,国内音频社区成功上市的案例接踵而至。其中,于 2020 年在纳斯达克上市的“在线音频”第一股荔枝,用户数早已超过 2 亿。进入信息化时代,音频行业和所有行业一样,面对平台海量 UGC 数据的产生,音频用户和消费者对于信息传递的效率也有着高要求,互联网音频平台也希望信息能够精准、快速地推送给用户,同时保证平台 UGC 内容的安全性。 为了最高效地达到这一目标,利用日益成熟的机器学习技术与大数据调度系统相结合,以更好地海量数据处理任务,成为各大音频平台探索的方向。荔枝的机器学习智能推荐平台就走在探索的最前沿,尝试将机器学习平台与大数据调度系统 DolphinScheduler 相结合。

01 背景

荔枝是一个快速发展的UGC音频社区公司,非常注重 AI 和数据分析两个领域的技术。因为 AI 可以在海量碎片化的声音中找到每个用户喜欢的声音,并将其打造成一个可持续发展的生态闭环。而数据分析可以为公司快速发展的业务提供指引。两者都需要对海量数据做处理,所以需要使用大数据调度系统。荔枝机器学习平台团队尝试利用大数据调度平台的调度能力与机器学习平台的能力相结合,处理每天涌进荔枝平台的海量 UGC 音频内容。

在 2020 年初之前,荔枝机器学习平台使用的是 Azkaban 调度系统,但是对于 AI 来说,虽然大数据调度的 sql/shell/python 脚本和其他大数据相关组件也能完成整个AI 流程,但不够易用,也很难复用。机器学习平台是专门为 AI 构建的一套系统,它将 AI 开发范式,即获取数据、数据预处理、模型训练、模型预测、模型评估和模型发布过程抽象成组件,每个组件提供多个实现,用 DAG 串联,使用拖拽和配置的方式,就可以实现低代码开发。

目前,荔枝每天有 1600+ 流程和 12000+ 任务(IDC)在 DolphinScheduler 上顺利运行。

02 机器学习平台开发中的挑战

荔枝在进行机器学习平台开发时,对于调度系统有一些明确的需求:

1、需要对海量数据存算,比如筛选样本、生成画像、特征预处理、分布式模型训练等; 2、需要 DAG 执行引擎,将获取数据->数据预处理->模型训练->模型预测->模型评估->模型发布等流程用 DAG 串联起来执行。

而使用之前的 Azkaban 调度系统进行开发时,他们遇到了一些挑战:

挑战1:开发模式繁琐,需要自己打包脚本和构建 DAG 依赖,没有 DAG 拖拽的实现; 挑战2:组件不够丰富,脚本编写的 AI 组件不够通用,需要重复开发,且易出错; 挑战3:单机部署,系统不稳定,容易出故障,任务卡顿容易导致下游任务都无法进行。

03 切换到DolphinScheduler

在旧系统中踩坑无数后,荔枝机器学习团队,包括推荐系统开发工程师喻海斌、林燕斌、谢焕杰和郭逸飞,决定采用 DolphinScheduler。喻海斌表示,他们团队调度系统的主要使用人员为推荐算法 > 数据分析 > 风控算法 > 业务开发(依次减弱),他们对调度系统了解不多,所以对于一个简单易用,可拖拉拽实现的调度系统的需求比较大。相比之下,DolphinScheduler 完美切合了他们的需求:

1、分布式去中心化架构及容错机制,保障系统高可用;

2、可视化 DAG 拖拽 UI,使用简洁方便,迭代效率高;

3、拥有丰富的组件,且可以轻松开发集成自己的组件;

4、社区活跃,无后顾之忧;

5、与机器学习平台运行模式非常接近,使用 DAG 拖拽 UI 编程。

04 应用案例

选型 DolphinScheduler 之后,荔枝机器学习平台在其之上进行了二次开发,并将成果应用于实际业务场景汇总,目前主要是在推荐和风控场景。其中,推荐场景包括声音推荐、主播推荐、直播推荐、播客推荐、好友推荐等,风控场景包括支付、广告、评论等场景中的风险管控。

在平台底层,荔枝针对机器学习的五大范式,获取训练样本、数据预处理、模型训练、模型评估、模型发布过程,进行了扩展组件优化。

一个简单的xgboost案例:

1、获取训练样本

目前还没有实现像阿里 PAI 那样直接从 Hive 选取数据,再对样本进行 join,union,拆分等操作,而是直接使用 shell 节点把样本处理好。

2. 数据预处理

Transformer&自定义预处理配置文件,训练和线上采用同一份配置,获取特征后进行特征预处理。里面包含了要预测的 itemType 及其特征集,用户 userType 及其特征集,关联和交叉的 itemType 及其特征集。定义每个特征预处理的 transformer 函数,支持自定义transformer 和热更新,xgboost 和 tf 模型的特征预处理。经过此节点后,才是模型训练真正要的数据格式。这个配置文件在模型发布时也会带上,以便保持训练和线上预测是一致的。这个文件维护在 DolphinScheduler 的资源中心。

3. Xgboost 训练

支持 w2v、xgboost、tf模型训练组件,训练组件先使用 TensorFlow或 PyTorch封装,再封装成 DolphinScheduler 组件。

例如,xgboost 训练过程中,使用 Python封装好 xgboost训练脚本,包装成 DolphinScheduler 的 xgboost 训练节点,在界面上暴露训练所需参数。经过“训练集数据预处理”输出的文件,经过 hdfs 输入到训练节点。

4. 模型发布

发布模型会把模型和预处理配置文件发到 HDFS,同时向模型发布表插入记录,模型服务会自动识别新模型,进而更新模型,对外提供在线预测服务。

喻海斌表示,基于历史和技术原因,目前荔枝还没有做到像阿里 PAI 那样真正的机器学习平台,但其实践经验已经证明基于 DolphinScheduler 可以做到类似的平台效果。

此外,荔枝还基于 DolphinScheduler 进行了很多二次开发,让调度系统更加符合实际业务需求,如:

  1. 上线工作流定义的时候弹窗是否上线定时
  2. 增加所有工作流定义的显示页面,以方便查找 a) 增加工作流定义筛选并跳转到工作流实例页面,并用折线图表示其运行时长的变化 b) 工作流实例继续下潜到任务实例
  3. 运行时输入参数,还可以进行配置禁用任务节点

05 基于调度的机器学习平台实现或将成未来趋势

深度学习是未来的大趋势,荔枝也针对深度学习模型开发了新的组件,目前已完成 tf 整个流程,后续在开发的还有 LR 和 GBDT 模型相关组件。后两者相对简单,上手更快,一般的推荐场景都可以使用,迭代更快,实现之后可以让荔枝机器学习平台更加完善。

荔枝认为,如果调度系统可以在内核稳定性,支持拖拽 UI,方便扩展的组件化,任务插件化,以及和任务参数传递方向上更加出色,基于调度系统实现机器学习平台,未来有可能会成为业界的普遍做法之一。

06 期待就是我们前进的动力

用户的期待就是 DolphinScheduler 前进的动力,荔枝也对 DolphinScheduler 的未来发展提出了很多具有指导性意义的建议,如期待 DolphinScheduler 未来可以优化插件机制,精减成一个专注于调度的“微内核”,并集成组件插件化,同时支持 UI 插件化,后台开发可以定制插件的 UI 界面。此外,荔枝还希望 DolphinScheduler 能够优化MySQL 表维护的“字典管理”,包含 key,value,desc 等主要字段,方便用户把一些易变量维护在字典表中,而不是维护在 .properties 文件里,这使得配置可以运行时更新,比如某个阈值,避免新增组件带来的配置参数放在 .properties 文件里导致的臃肿和不易维护等问题。

最后,荔枝也表达了对 DolphinScheduler 寄语的期待,希望社区发展越来越好,探索更加广阔的领域,在海外也能取得更好的成绩,实现可持续的商业化开源!