关注并标星 3分钟秒懂大数据
每天1次,打卡阅读
更快更全面获取大数据技术博客
原文链接:Xgboost_Ray在Uber大规模生成落地中的优化与实践
本篇文章将为读者全方面介绍xgboost_ray的设计原理、代码设计、以及它在Uber生成落地中的使用,全文总共分为5部分内容,目录如下:
- 引入xgboost_ray的原因
- xgboost_ray的架构
- xgbosot_ray的功能点
- xgboost_ray代码走读
- xgboost_ray在uber中的应用
1.1、什么是xgboost?
XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。
说到XGBoost,不得不提GBDT(Gradient Boosting Decision Tree)。因为XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致,所以叫X (Extreme) GBoosted,两者都是boosting方法。
复制代码
1.2、为什么使用分布式的xgboost?
•单机进行xgboost训练和预测无法满足大数据量的需求
•单机不支持多GPU加速训练
复制代码
1.3、当前分布式xgboost有哪些?
•基于spark、Dask、kubernetes
复制代码
1.4、当前分布式xgboost的不足?
•动态计算图
•容错处理
•多GPU支持
•与超参数集成
复制代码
1.5、xgboost_ray能做什么?
•每个Ray actors是有状态训练的workers
•容错机制好
•多GPU支持
•支持分布式数据加载
•与分布式超参数优化ray tune的集成
复制代码
2.1、分布式Xgbosot_Ray架构图如下:
Xgboost的分布式逻辑是通过Rabit来完成的,并且用Rabit Tracker完成任务的协调。
Rabit是一个实现Allreduce(规约)和broadcast的容错接口的轻量级库,底层是用socket进行通信的
2.2、Xgbosot_ray 架构图执行逻辑如下:
(1)先在driver端启动一个RabitTracker,RabitTracker提供N个endpoint给worker连接。
(2)每一个xgboost训练节点通过rabit框架和rabitTracker通信完成注册,rabitTracker将这些rabit编号并形成环形网络结构。
(3)当所有的worker结点都建立起完备的网络拓扑关系以后,就可以启动计算任务监控整个执行过程。
2.3、RabitTracker具体执行任务:
RabitTracker是由工程下的tracker.py来创建。具体做的事如下:
- 启动daemon线程,提供worker结点注册联接所需的end point,所有的worker结点都可以通过与Tracker程序通信来完成自身状态信息的注册。
- co-ordinate worker结点的执行:为worker结点分配Rank编号。基于收到的worker注册信息完成环形网络结构的构建,并广播给worker结点,以确保worker结点之间建立起合规的网络拓扑。
- 当所有的worker结点都建立起完备的网络拓扑关系以后,就可以启动计算任务监控整个执行过程。
2.4、分布式Xgbosot_Ray运行原理图如下:
- 在Ray的每个worker节点中使用ray.remote远程调用进行分布式数据集加载;
- Driver端分配给每个worker进行xgboost训练,且每个worker都是通过rabit进行通信;
- 将每个worker的checkpoint结果和训练评估结果反馈给Driver端。
3.1、分布式数据集加载:
•此处分布式数据集加载引用了modin组件
原因:pandas是单核运行的,当大数据量加载入缓存时,会将庞大的dataframe同时拷贝入缓存中,引入modin(ray),充分利用多核cpu
•如何进行分区数据传输
查看分区dataframe数据当前位于哪些节点上,并将分区分配给当前workers结点以最小化跨节点数据传输,且每个分区大小是统一的。
3.2、分布式数据集加载—api使用
如上图所示:在通过api 编写代码时,先导入所需模块,然后将加载的数据集转为modin dataframe,然后再将训练集和标签集转为xgboost的数据格式。
3.3、xgboost_ray容错机制
在分布式训练中,部分节点一定会出现失败情况,xgboost_ray的容错机制中提供三种恢复方式:
(1)单点恢复
•默认:单节点从上一次checkpoint中恢复
当在训练的时候,如果某台worker挂掉,xgboost_ray将默认从上一次checkpoint中恢复训练的结果,然后重新进行训练。
(2)Non-elastic(非弹性) 训练
•warm 重启(从上一次失败的worker节点进行进行重启恢复)
(3)Elastic训练
•继续在更少的worker上进行训练,直到失败的actors起来
3.4、容错机制—api使用
下图为容错机制的具体配置方式:
3.5、容错机制–benchmark
- 在少量workers失败情况下,随着挂掉的workes增加,训练时长缓慢增加
- 在non elastic训练模式下,训练就表现的很差,基本是其他两种情况的一倍
- 在elastic训练模式下,训练表现的最好,在2节点挂掉时候达到最优的训练时长
3.6、基于ray tune超参数调优
•并行运行多个XGBoost-Ray 训练同时,每个运行具有不同的超参数配置。将训练代码移动到一个函数中,然后将该函数传递给tune.run. 在内部,train将检测是否由tune正在使用并自动报告结果以进行调整。
3.7、基于ray tune超参数调优—api使用
4.1、使用xgboost_ray对数据集进行分布式训练,画出代码执行流程图如下:
下图为训练的具体执行源码,若想看完整流程,可自行在源码中查看
4.2、使用xgboost_ray对模型进行推理,流程图如下:
具体的源码执行过程如下:
5.1、在uber中的应用
下图为xgboost_ray在Uber中使用的流程图:
通过使用Spark + xgboost_ray技术进行实现:
- Transformer:转换器,是一种可以将一个DataFrame转换为另一个DataFrame的算法。Transformer实现了一个方法transform(),它通过附加一个或多个列将一个DataFrame转换为另一个DataFrame。
- Estimator:评估器,它是学习算法或在训练数据上的训练方法的概念抽象。Estimator实现了一个方法fit(),它接受一个DataFrame并产生一个转换器。
运用Saprk+xgboost_ray的流程图如下:
- spark中进行数据预处理
- 创建ray context
- 创建ray Estimator
- 使用ray estimator进行训练和与预测集转换
- 保存和加载模型
spark+ xgboost_ray 代码使用如下:
Flink+xgboost_ray进行分布式训练流程图如下:
以上就是 Xgboost_Ray在Uber大规模生成落地中的优化与实践的讲解内容!觉得好的,点赞,分享,谢谢!!!
找各类大数据技术文章和面经,就来
<3分钟秒懂大数据>
随时更新互联网大数据组件内容
专为学习者提供技术博文
快和身边的小伙伴一起关注我们吧!