ITPub博客

首页 > 数据库 > 数据库开发技术 > Xgboost_Ray在Uber大规模生成落地中的优化与实践

Xgboost_Ray在Uber大规模生成落地中的优化与实践

原创 数据库开发技术 作者:3分钟秒懂大数据 时间:2021-07-07 15:56:23 0 删除 编辑

关注并标星 3分钟秒懂大数据

每天1次,打卡阅读

更快更全面获取大数据技术博客

本篇文章将为读者全方面介绍xgboost_ray的设计原理、代码设计、以及它在Uber生成落地中的使用,全文总共分为5部分内容,目录如下:
1、引入xgboost_ray的原因
2、xgboost_ray的架构
3、xgbosot_ray的功能点
4、xgboost_ray代码走读
5、xgboost_ray在uber中的应用

1、引入xgboost_ray的原因


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、xgboost_ray的架构


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来创建。具体做的事如下:
(1)启动daemon线程,提供worker结点注册联接所需的end point,所有的worker结点都可以通过与Tracker程序通信来完成自身状态信息的注册。
(2)co-ordinate worker结点的执行:为worker结点分配Rank编号。基于收到的worker注册信息完成环形网络结构的构建,并广播给worker结点,以确保worker结点之间建立起合规的网络拓扑。

(3)当所有的worker结点都建立起完备的网络拓扑关系以后,就可以启动计算任务监控整个执行过程。


2.4、分布式Xgbosot_Ray运行原理图如下:




(1)在Ray的每个worker节点中使用ray.remote远程调用进行分布式数据集加载;

(2)Driver端分配给每个worker进行xgboost训练,且每个worker都是通过rabit进行通信;
(3)将每个worker的checkpoint结果和训练评估结果反馈给Driver端。



3、xgboost_ray功能点介绍


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、xgboost_ray代码走读


4.1、使用xgboost_ray对数据集进行分布式训练,画出代码执行流程图如下:

下图为训练的具体执行源码,若想看完整流程,可自行在源码中查看

4.2、使用xgboost_ray对模型进行推理,流程图如下:

具体的源码执行过程如下:



5、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大规模生成落地中的优化与实践的讲解内容!觉得好的,点赞,在看,分享三连击,谢谢!!!

End



 找各类大数据技术文章和面经,就来

<3分钟秒懂大数据>

随时更新互联网大数据组件内容

专为学习者提供技术博文

快和身边的小伙伴一起关注我们吧!

作者简介:逆流而上Mr李,秋招7offer,CSDN博客:https://blog.csdn.net/weixin_38201936


原文作者:3分钟秒懂大数据;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-06-15

  • 博文量
    98
  • 访问量
    42101