@作者: 机器学习算法 @迪吉老农
最近使用GBDT时,想通过分布式进行训练,尝试了一些框架,但原理不太了解。有些东西与同事讨论后,也还不甚明了,于是专心看了一下文档,在此记录一下。
1、分布式原理
常用分布式训练方式,应该是参数服务器。worker把sample的统计结果推送到单台参数服务器机器上,参数服务器汇总 后,再推送到worker端。有点类似于单reducer的方式。
相比于参数服务器的中心化方案,这里提到的都是去中心化方案。
LightGBM与XGBoost的其中一个区别,是实现了真正的分布式,原因是LightGBM不依托hive,TaskManager之间可以暴露端口进行通信,而Hivemall依托Hive,只能实现无通信的分布式。
把这几种机制梳理一下,目前一共是4种方案,
- Bagging
- Feature Parallel
- Data Parallel
- Voting
其中,Bagging方式是不带通信机制的;另外三种则通过通信,做到了针对GBDT的分布式训练(好像可以类比,数据并行,模型并行?)
LightGBM文档建议,按照下面方式选择并行方式,
| #data is small | #data is large | |
|---|---|---|
| #feature is small | Feature Parallel | Data Parallel |
| #feature is large | Feature Parallel | Voting Parallel |
1.1、Bagging
完全非中心化的架构,通过Data Parallel的方式将数据打散为多份,分布式训练,最后训练多颗子树,在最终阶段进行Bagging输出。其实严格来说,这个不是GBDT分布式了,而是一个随机森林了。在Hivemall封装的XGB中,就是这样实现的。XGB的文档中,对于分布式的描述不多,没有看到其他带有通信机制的分布式的介绍。具体训练流程后面介绍。
