本文描述了猿輔導開源分布式機器學習庫ytk-learn及分布式通信庫ytk-mp4j的相關內容,可實現在多應用場景中使用。ytk-learn 是基于Java的高效分布式機器學習庫, 簡單易用,文檔詳細,只需要用戶安裝Java 8運行時環境即可,而且所有模型都有可運行的demo。
猿輔導公司開源了兩個機器學習項目——ytk-learn, ytk-mp4j,其中 ytk-mp4j 是一個高效的分布式通信庫,基于該通信庫我們實現了 ytk-learn 分布式機器學習庫,該機器學習庫目前在猿輔導很多應用場景中使用,比如,自適應學習、學生高考分預測、數據挖掘、課程推薦等。
ytk-learn分布式機器學習庫
項目背景
LR(Logistic Regression), GBDT(Gradient Boosting Decision Tree), FM(Factorization Machines), FFM(Field-aware Factorization Machines) 模型是廣告點擊率預測和推薦系統中廣泛使用的模型,但是到目前為止幾乎沒有一個高效的機器學習開源項目集這幾種常用模型于一身,而且很多機器學習開源項目只能在特定計算平臺下使用,最重要的是不能高效的整合到線上生產環境中。ytk-learn 就是解決以上問題而產生的。
圖1 ytk-learn 特性概略
項目簡介
ytk-learn 是基于Java的高效分布式機器學習庫,實現大量的主流傳統機器學習模型(GBDT, LR, FM, FFM等)和loss函數,支持單機多線程、多機集群及分布式計算環境。
其中 GBDT/GBRT 的實現借鑒吸收了 XGBoost 和 LightGBM 的大部分有用特性,支持特征并行和數據并行,支持傳統的精確算法和直方圖近似算法,支持 level-wise 或者 leaf-wise 的建樹方式,而且還實現了分布式帶權分位數近似。在單機數據并行的場景中訓練速度跟 XGBoost 相當,在非$2^n$臺機器的分布式場景中比 LightGBM 速度更快,更穩定。
傳統的 GBDT/GBRT 在含有大量 Categorical 特征的場景中無法使用,我們實現了多種適用于大量 Categorical特征的 GBST(Gradient Boosting Soft Tree)模型,在猿輔導的點擊率預測和推薦場景中效果明顯好于LR、FM、FFM等模型。
ytk-learn 實現了改進的 Hoag(Hyperparameter optimization with approximate gradient, ICML2016)算法,能夠自動高效的進行超參數搜索。當目標函數是凸函數時,hoag 能快速得到最優超參數(kaggle 比賽利器),效率明顯高于傳統的網格超參數搜索算法(grid search),而且在非凸目標函數場景中也適用。
其他特性:
1. 簡單易用,文檔詳細,只需要用戶安裝Java 8運行時環境即可,而且所有模型都有可運行的demo
2. 支持主流的操作系統:Linux,Windows,Mac OS,僅需安裝Java8運行環境即可使用
3. 支持單機多線程,多機集群及分布式環境(Hadoop,Spark),相比Hadoop Mahout, Spark MLlib效率高很多
4. 提供簡單易用的在線預測代碼,可以方便整合到線上生成環境
5. 支持多種目標函數和評估指標,支持L1,L2,L1+L2正則
6. 樹模型支持樣本采樣,特征采樣,提供初始預估值的訓練
7. 支持特征預處理(歸一化,縮放),特征哈希,特征過濾,基于樣本標簽采樣
8. 提供了讀取數據時進行高效數據處理的python腳本
9. 訓練模型支持checkpoint,繼續訓練
10. LR 支持 Laplace 近似,方便做 Exploitation&Exploration
11. 基于猿輔導的 ytk-mp4j 通信庫,分布式訓練效率非常高
ytk-mp4j 分布式機器學習通信庫
?
項目背景
目前可以用于分布式機器學習的通信主要基于MPI和RPC,其中MPI是分布式高性能計算的標配,雖然效率非常高,但是對于開發分布式機器學習任務來說有很多缺點: 開發難度大、數據支持太底層、只能用C/C++, Fortran編寫等等;RPC 方式來實現類似 allreduce 這種操作,在特征維度特別高的場景,通信效率太低。所以我們開發了一套易用且高效的機器學習分布式通信庫。
圖2 ytk-mp4j 特性概略
項目簡介
ytk-mp4j 是基于Java的高效分布式機器學習通信庫,實現了類似 MPI Collective 通信中的大部分操作,包含gather, scatter, allgather, reduce-scatter, broadcast, reduce, allreduce,使用 ytk-mp4j 可以快速地把串行機器學習程序改造成支持多線程和多進程,ytk-learn 中所有涉及到分布式通信操作都是基于 ytk-mp4j 實現(表1中給出了部分例子)。
相比于MPI, ytk-mp4j 擴展實現了一些非常實用的特性:
1. 所有的通信操作都是基于最優算法實現[1,2],性能非常高,同時支持多線程,多進程。同樣的功能,在C/C++ 環境中,可能需要結合 MPI 和 OpenMP 才能實現
2. 不僅支持基本的數據類型(double, float, long, int, short, byte),而且還支持Java String及任意普通Java對象(Java 對象只需要實現 Kryo的 Serializer 接口)
3. 不僅支持傳統數組類型的 Collective 通信,而且還支持Java Map數據類型,使用Map數據類型,用戶可以實現非常復雜的通信操作(例如:集合求交、求并,鏈表的連接等操作)
4. 支持數據壓縮傳輸,在網絡資源很緊張的情況下,可以節約大量的帶寬
5. 純Java代碼實現,可以無縫集成到 Hadoop, Spark 等分布式計算平臺,構建自己的分布式機器學習系統
6. 使用 Java的SDP(Sockets Direct Protocol)可以實現高效的RDMA(Remote Direct Memory Access)
表1 ytk-mp4j在ytk-learn中的使用
ytk-mp4j 操作ytk-learn 中使用場景
allreduceLoss 求和,梯度求和,Hessian 求和,計算分位數,計算平均值,
計算評估指標(AUC, Confusion Matrix…),統計樣本數量、
特征出現次數等等
reduce-scatterGBDT 高效梯度求和
allgatherL-BFGS 中計算Hv,GBDT 同步梯度
allreduce 操作是分布式機器學習中使用最多的通信操作,它對機群中所有的節點對應的數據進行歸約操作,然后再分發給各個節點。下面給出了 ytk-mp4j 在多進程、多進程、數組,Map 下的 allreduce (歸約操作為求和)示意圖:
性能測試
表2給出了 ytk-mp4j 實現的Collective操作時間復雜度,其中 ?是網絡連接延遲, 是傳輸1個字節需要的時間, 是需要傳輸的字節數量, 是進行1字節數據歸約(reduction)操作需要的時間。可以看出,隨著機器數量的增加,所有操作數據傳輸的時間是幾乎不會增加的,只有連接和歸約操作的時間會隨機器數量增加,但在大數據通信時,連接和歸約的時間占比很小。這個時間復雜度特性非常重要,它使得在特征維度、樣本數量超過一定閾值的分布式機器學習訓練任務中,訓練加速比與機器數量接近線性關系。
表2 ytk-mp4j 實現的 Collective 操作時間復雜度
下圖是測試在 1Gigabit Ethernet 網絡下,10億維 double 數組,各種 Collective 通信操作在不同的機器數量下的通信性能(時間單位: ms),從圖中可以看出 ytk-mp4j 中的7種 Collective 操作的通信時間與機器數量的關系與理論值完全符合。
評論
查看更多