[机器学习] LightGBM并行计算算子具体实现
?一 LightGBM網(wǎng)絡組網(wǎng)步驟
????????LightGBM并行計算中,計算節(jié)點之間采用靜態(tài)互連網(wǎng)絡,即程序執(zhí)行期間,節(jié)點與節(jié)點之間的連接保持不變。LightGBM網(wǎng)絡的建立需要事先定義所有worker的ip以及port,組網(wǎng)的過程通過Network::Init()完成,主要步驟如下:
1.1 網(wǎng)絡初始化入口
? ? ? ??
? ? ? ? 建立網(wǎng)絡連接主要的邏輯在new Linkers(config)中。?
1.2 LightGBM中網(wǎng)絡初始化過程
????????初始化過程主要是建立Linkers對象:
? ? ? ??網(wǎng)絡初始化過程中,首先從配置中讀取當前worker的端口號。然后解析machine list文件,獲取所有worker的ip列表以及port列表。接下來需要對Bruck算法及Recursive Halving算法計算出當前worker需要連接到其他哪些worker。
?????? 從2.12可以看出BruckMap不要求workers數(shù)量為2的k次方,因此對于任意數(shù)量的workers,都可以按以上步驟計算當前節(jié)點需要在第k步通信時發(fā)送數(shù)據(jù)給哪個worker以及接收哪個worker發(fā)送過來的數(shù)據(jù)。
????? 從2.6.1可知,Recursive Halving算法要求workers數(shù)量為2k,但當workers數(shù)量非2k時,可以通過2.6.2介紹的方法進行解決這一問題。以上construct步驟主要是計算哪些worker需要參于到Recursive Halving過程中,同時計算第k次通信配對的worker,以及第k次通信發(fā)送、接收的數(shù)據(jù)塊大小及位置(此處的值只是一個基數(shù),具體位置及大小在實際的執(zhí)行過程中根據(jù)實際數(shù)據(jù)塊的大小計算)
?????? 計算完需要連接的worker之后,Construct將依次連接到需要連接的worker上,并等待被連接的worker的連接。連接與監(jiān)聽過程分別在兩個線程中執(zhí)行。自此,LightGBM靜態(tài)互連網(wǎng)絡的建立已經(jīng)完成。
二 LightGBM中Allreduce、ReduceScatter、Allgather實現(xiàn)解析
? ? ? ? LightGBM的并行訓練過程中使用了大量的數(shù)值歸約操作,如隨機種子的同步用到了Allreduce、對數(shù)據(jù)進行分桶時計算bin_mapper用到了Allgather、計算最佳分裂時用到了ReduceScatter等,以下分別對這三種歸約操作的代碼進行解析。
2.1 Allgather代碼解析
LightGBM中Allgather的實現(xiàn)采用Bruck Algorithm算法:
?以上的操作經(jīng)過log(N)次的通信能夠完成Allgather。每一次通信數(shù)據(jù)塊的大小為*send_size。可以理解,這種方式適用于N不太大并且數(shù)據(jù)塊大小不太大的情形。
?
2.2 ReduceScatter代碼解析
????????
以上僅介紹非2k個節(jié)點的情形,workers為時執(zhí)行過程僅需要第二個for循環(huán)。
2.3 Allreduce代碼解析
????????Allreduce根據(jù)數(shù)據(jù)塊的大小的不同,分別采用兩種方式進行操作。在需要歸約的數(shù)據(jù)塊較小時采用Allgather加上一個reducer操作完成。針對數(shù)據(jù)塊較大的情形則采用另一種方式:ReduceScatter + Allgather操作。
2.4 一個調(diào)用Allreduce的例子
以下介紹一個使用Allreduce的例子,在訓練之前以label的平均值作為初始值:
????????因為init_score的size小,因此先通過Allgather收集所有worker上的init_score,然后在本地進行reducer操作,此處的reducer是做sum。
?
?
總結(jié)
以上是生活随笔為你收集整理的[机器学习] LightGBM并行计算算子具体实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [机器学习]LightGBM分布式使用完
- 下一篇: [链表]---链表中环的入口节点