背景介绍
随着大数据技术的日趋成熟,很多互联网企业都积累了海量的数据资产。如何利用这些数据,充分发掘其价值逐渐成为各个公司亟待解决的新难题。其中机器学习已经被业界证明是十分有用的数据分析与挖掘手段。学术界对机器学习方向的研究已经持续数十年,很多算法已比较成熟。虽然不停有新的改进,但对企业而言不是最重要的。企业级应用最大的障碍在于如何将其平台化和围绕平台化所做的相关工作。因为如果每个使用机器学习的业务都走一整套完整的机器学习流程的话,开发和维护成本是相当高昂的。平台化就是将机器学习系统做成更加通用的、简单易用的平台,相关业务可以很容易接入该平台,从而利用机器学习的手段解决业务问题。
总体架构
公司本身大数据体系以Hadoop+Spark为主,不同业务方具有自己独立的账号和资源配额。目前绝大部分业务数据和日志数据均汇集到Hive数据仓库中。大数据平台已支持使用批量+实时的大数据处理方案满足相关数据处理需求。结合公司现状,机器学习平台应充分利用现有的任务调度方式、资源隔离体系、权限体系等,并尽量整合现有业界机器学习框架和资源,满足通用性机器学习任务的同时,做到一定的可扩展性和灵活性。其主要体现在容易整合相关机器学习框架;容易扩展用户自定义的算法实现;容易对多种硬件资源调度;容易在多种执行引擎间切换。
设计要点
❶ 前端交互
公司大数据平台统一前端入口为http://data.tmall.com。为了复用该工程相关功能,机器学习平台的前端交互/管理部分也会整合进来。具体入口放置在业务组功能菜单下面,下层子菜单包括[我的实验]、[数据管理]、[模型管理]。点击[我的实验]菜单后,在打开的页面中会列出归属于该业务组的实验列表,同时可以点击新建或者进入某个已有实验,这时将跳转到新打开的全新机器学习DAG编辑页面(DeepBlue AI Studio)。该页面的layout会和data.tmall.com的区分开,便于对该Editor页面样式等进行灵活控制。
[数据管理]部分,需要支持Hive表/MySQL表/本地上传方式,载体均是大数据平台的HDFS分布式文件系统。列表展现的时候需要区别是本身有权限的Hive表/导入的MySQL表还是本地上传数据生成的表,对于后面两种表以及之后生成的模型文件,统一放在/user/[业务组名]/ml/data和/user/[业务组名]/ml/model的hdfs路径,/user/[业务组名]/ml/log用于存放输出的日志文件。用户自动导入的表存放在其独享的Hive库中,库名为其业务组名,而中间过程生成的表名为[temp_实验编号_算子实例编号] location 单独到tmp目录,采用内联表,这样drop的时候可以将数据一并删除。模型文件会存入到/user/[业务组名]/ml/model/[模型编号]对应的文件夹下面。所有操作均是用其业务组对应的账号,这样能保证权限是一致和可控的。(需要考虑共享的问题)
ID |
库名 |
表名 |
导入方式 |
|
|
|
Hive/MySQL/File |
DAG Editor页面采用jsPlumb,通过拖拽各个预定义的算子到画布上,然后连线组成有向无环图。需要注意的是定义好各个算子的输入输出约束,这样在连线的时候可以利用其校验是否可以连线,提前避免一些不合理的算子关联关系。整个界面需要支持缩放功能、鼠标右键功能、展现DAG图运行动态。左侧放算子、数据,中间为画布区,右侧为点击各个算子出现的参数配置区域。为了图形化展现一些评估、统计指标,需要采用D3.js/ECharts。平台会将用户编辑的DAG图位置关系保存起来,下次打开按照用户方式布局,具体可以持久化画布区html片段。对于新加入的算子,新加入的连线,需要触发元数据持久化操作,删除算子或者连线的时候亦然。
对于数据源节点,在DAG Editor虽然也算作一个节点,但是和其他算子类节点有着本质的不同,仅代表数据提供源头,本身没有相关任务执行。在持久化元信息和编辑的时候需要特殊对待。
❷ 任务调度
该部分作为整个大数据平台的核心部件,起着承上启下的作用。通过接收用户配置的任务,根据其配置的相关参数将其提交到对应的执行环境,同时检测其执行状态。对于机器学习的任务,其本质属于流程任务。相较于一般流程任务,该DAG任务会涉及到不同的执行环境。调度执行器需要适配不同执行环境的情况,能收集并实时反馈子任务算子的运行状态(日志/监控点信息)。很多状态信息需要持久化到数据库表,同时前端触发某些执行动作的时候切记做好预置条件校验。
❸ 执行环境
目前执行环境主要包含三部分:
· YARN:计划是采用Spark on YARN的形式,对于很多算子均是封装Spark SQL和Spark ML的已有功能。同时这块也可以充分利用现有的大数据计算资源,尽量应对的是传统的机器学习算法;
· Kubernetes:主要利用其很好的资源调度和隔离,同时因为其可以对GPU资源进行统一调度和管理,这对于在上面分布式部署深度学习框架(Tensorflow/MXNet/Caffe)非常合适;
· Local:对于单机运行,需要严格依赖本地特定执行环境的可以考虑,如scikit-learn,或者单机运行的Tensorflow/MXNet/Caffe etc.
❹ 资源隔离
可以在“业务组管理”页面,新增一个选项控制是否开启该账号可以使用机器学习平台相关功能的按钮,同时该部分负责对机器学习相关初始化环境进行准备(独立数据库,独立模型及数据存放路径,独立k8s命名空间和quota,独立yarn对应的queue etc.)
· YARN Env:资源隔离的方式通常采取的是给不同账户分配不同queue。之前流式计算任务采用的队列是stream_data_admin的形式,批处理任务采用的队列是data_admin的形式,机器学习的任务计划采取ml_data_admin的形式,这样做的目的是不同任务类型尽量不相互影响同时也能控制不同账户该类任务资源的使用配额;
· Kubernetes Env:我们需要通过调度服务向api center提交资源申请。提前UI部分也会对每个任务建立单独的命名空间,定义总的资源quota情况;
· Local Env:由于是直接放到物理裸机运行,比较难控制资源隔离,需要做的是单独部署任务调度执行器防止对实时类任务/批处理任务的影响.
❺ 算子建模
{
"algorId": “randomForest”,
"algorType": “AlgorModel”,
"inputs": [
{
"type": "table",
"location": "tmall_ml.data_admin_t_user",
"format": "text"
}
],
"outputs": [
{
"type": "file",
"location": "/workspace/tmall/ml/model/",
"format": "parquet"
}
],
"env": “yarn/k8s/local",
“ownedBy": “public/private”,
"groupCode": “data_order”,
"resouresReq": [
{
“cpus": "2"
},
{
"mem": "10GB"
},
{
"gpus": "1"
}
],
"cmd": "spark-submit"
}
相关算子包括(需要在data管理后台提供对这些算子的元信息管理和维护、另外还有一些平台型元信息维护;明确是采用Java or Scala or Python实现?):
A 数据处理:
> 数据类型转换
> 缺失值(剔除、替换)
> 采样(随机、分层)
> SQL操作
> 数据拆分
B 特征工程:
> 主成分分析PCA
> 特征标准化
> 特征选择过滤器
> 特征离散
> 特征尺度变换
C 算法组件:
> 分类(逻辑回归 决策树 随机森林 多层感知机 支持向量机 朴素贝叶斯)
> 回归(线性回归 决策树 随机森林 梯度下降树)
> 聚类(K-means LDA 二分K均值 GMM)
D 模型评估:
> 二分类评估
> 聚类评估
E 深度学习(待启动)
F 统计分析(待启动)
❻ 框架整合
· on YARN:直接采用Spark的on YARN方式启动算子任务,这样是利用了Spark的环境。目前包括很多深度学习的框架都是可以直接依赖于Spark运行的,比如DL4J/BigDL/Tensorflow/Caffe,后两个是Yahoo开源的实现,可以参考;
· on Kubernetes:这种方式需要对每种机器学习框架做成Docker镜像,运行之前先向Kubernetes申请资源启动Pod。完成训练任务后需要做好收尾工作,如清除现有资源占用等;
· on Local:提前在执行器机器上安装部署好需要版本的软件环境,尽量保证每次修改不会对其他任务的执行造成影响.
❼ 数据存储
依赖的训练、验证、中间数据都是存储在hdfs上面的,所以我们也会统一将数据存储采用HDFS的形式放到分布式存储上。对于单机上需要配置大数据集群的hosts,Kubernetes在启动Pod的时候指定pod.Spec.HostAliases参数将大数据集群的hosts配置进去,依赖的镜像需要及时跟现有环境(大数据环境)保持同步更新。大数据集群本身也通过基于标准FTP协议的服务: ftp.data.tmall.com。
❽ 日志监控
对于Spark,建议采用yarn-client模式提交,这样可以输出大部分日志。前端需要拿到执行器执行前组装的所有参数,运行步骤日志和算子任务执行过程中日志,监控信息可以复用各个框架自带的监控页面,提供跳转链接即可。执行器将日志写入到hdfs路径下/user/[业务组名]/ml/log/,文件名以执行[实验编号]-[算子实例编号]-[执行批次号]。需要扩展过期数据清除任务,对于这类日志,只需要保留3-6个月,防止白白占用空间。
一个完整的一站式机器学习平台需要将大数据的处理过程(拆分、补全、抽样等)和机器学习过程(特征工程、模型训练、模型评估)通过可视化DAG图进行表述。用户就不用再自己开发脚本实现、不用考虑数据如何存储以及如何应对各个复杂模块之间的对接及各个输入输出判断。通过简单的拖拽操作完成算法调用、参数调优、模型预估等,且实现日志、数据、监控等的可视化,极大提高了构建基于机器学习系统的效率,降低了使用机器学习的门槛,为机器学习的公司级别大面积推广奠定基础。整个流程的背后我们需要做很多工作,将这些进行固化和对用户透明。具体而言,我们实现了:
数据导入和预处理
特征工程
模型训练(需支持灵活调整和二次开发)
模型评估
数据持久化
可视化(日志、监控、数据、任务运行)
1. 王正林 华校专 著;Python大战机器学习;电子工业出版社,2017.3
2. 李博 著;机器学习实践应用;人民邮电出版社,2017.1
3. Ian Goodfellow 等著;深度学习(中文版);人民邮电出版社,2017.8
4. 李航 著;统计学习方法;清华大学出版社,2012.3
5. 深度解密京东登月平台基础架构
https://segmentfault.com/p/1210000010378518
6. 阿里机器学习平台—PAI
https://yq.aliyun.com/articles/57677