將sklearn訓練速度提升100多倍,美國「返利網」開源sk-dist框架

2021-01-10 機器之心Pro

選自Medium

作者:Evan Harris

機器之心編譯

參與:高璇、張倩

在本文中,Ibotta(美國版「返利網」)機器學習和數據科學經理 Evan Harris 介紹了他們的開源項目 sk-dist。這是一個分配 scikit-learn 元估計器的 Spark 通用框架,它結合了 Spark 和 scikit-learn 中的元素,可以將 sklearn 的訓練速度提升 100 多倍。

在 Ibotta,我們訓練了許多機器學習模型。這些模型為我們的推薦系統、搜尋引擎、定價優化引擎、數據質量等提供了支持,在與我們的移動 app 互動的同時為數百萬用戶做出預測。

雖然我們使用 Spark 進行大量的數據處理,但我們首選的機器學習框架是 scikit-learn。隨著計算成本越來越低以及機器學習解決方案的上市時間越來越重要,我們已經踏出了加速模型訓練的一步。其中一個解決方案是將 Spark 和 scikit-learn 中的元素組合,變成我們自己的融合解決方案。

項目地址:https://github.com/Ibotta/sk-dist

何為 sk-dist

我們很高興推出我們的開源項目 sk-dist。該項目的目標是提供一個分配 scikit-learn 元估計器的 Spark 通用框架。元估計器的應用包括決策樹集合(隨機森林和 extra randomized trees)、超參數調優(網格搜索和隨機搜索)和多類技術(一對多和一對一)。

我們的主要目的是填補傳統機器學習模型分布選擇空間的空白。在神經網絡和深度學習的空間之外,我們發現訓練模型的大部分計算時間並未花在單個數據集上的單個模型訓練上,而是花在用網格搜索或集成等元估計器在數據集的多次迭代中訓練模型的多次迭代上。

實例

以手寫數字數據集為例。我們編碼了手寫數字的圖像以便於分類。我們可以利用一臺機器在有 1797 條記錄的數據集上快速訓練一個支持向量機,只需不到一秒。但是,超參數調優需要在訓練數據的不同子集上進行大量訓練。

如下圖所示,我們已經構建了一個參數網格,總共需要 1050 個訓練項。在一個擁有 100 多個核心的 Spark 集群上使用 sk-dist 僅需 3.4 秒。這項工作的總任務時間是 7.2 分鐘,這意味著在一臺沒有並行化的機器上訓練需要這麼長的時間。

import timefrom sklearn import datasets, svmfrom skdist.distribute.search import DistGridSearchCVfrom pyspark.sql import SparkSession # instantiate spark sessionspark = ( SparkSession .builder .getOrCreate() )sc = spark.sparkContext # the digits datasetdigits = datasets.load_digits()X = digits["data"]y = digits["target"]# create a classifier: a support vector classifierclassifier = svm.SVC()param_grid = {"C": [0.01, 0.01, 0.1, 1.0, 10.0, 20.0, 50.0], "gamma": ["scale", "auto", 0.001, 0.01, 0.1], "kernel": ["rbf", "poly", "sigmoid"] }scoring = "f1_weighted"cv = 10# hyperparameter optimizationstart = time.time()model = DistGridSearchCV( classifier, param_grid, sc=sc, cv=cv, scoring=scoring, verbose=True )model.fit(X,y)print("Train time: {0}".format(time.time() - start))print("Best score: {0}".format(model.best_score_))Spark context found; running with sparkFitting 10 folds for each of 105 candidates, totalling 1050 fitsTrain time: 3.380601406097412Best score: 0.981450024203508該示例說明了一個常見情況,其中將數據擬合到內存中並訓練單個分類器並不重要,但超參數調整所需的擬合數量很快就會增加。以下是運行網格搜索問題的內在機制,如上例中的 sk-dist:

使用 sk-dist 進行網格搜索

對於 Ibotta 傳統機器學習的實際應用,我們經常發現自己處於類似情況:中小型數據(100k 到 1M 記錄),其中包括多次迭代的簡單分類器,適合於超參數調優、集合和多類解決方案。

現有解決方案

對於傳統機器學習元估計訓練,現有解決方案是分布式的。第一個是最簡單的:scikit-learn 使用 joblib 內置元估計器的並行化。這與 sk-dist 非常相似,除了一個主要限制因素:性能受限。即使對於具有數百個內核的理論單臺機器,Spark 仍然具有如執行器的內存調優規範、容錯等優點,以及成本控制選項,例如為工作節點使用 Spot 實例。

另一個現有的解決方案是 Spark ML。這是 Spark 的本機機器學習庫,支持許多與 scikit-learn 相同的算法,用於分類和回歸問題。它還具有樹集合和網格搜索等元估計器,以及對多類問題的支持。雖然這聽起來可能是分配 scikit-learn 模式機器學習工作負載的優秀解決方案,但它的分布式訓練並不能解決我們感興趣的並行性問題。

分布在不同維度

如上所示,Spark ML 將針對分布在多個執行器上的數據訓練單個模型。當數據很大且無法將內存放在一臺機器上時,這種方法非常有效。但是,當數據很小時,它在單臺計算機上的表現可能還不如 scikit-learn。此外,當訓練隨機森林時,Spark ML 按順序訓練每個決策樹。無論分配給任務的資源如何,此任務的掛起時間都將與決策樹的數量成線性比例。

對於網格搜索,Spark ML 確實實現了並行性參數,將並行訓練單個模型。但是,每個單獨的模型仍在對分布在執行器中的數據進行訓練。如果按照模型的維度而非數據進行分布,那麼任務的總並行度可能是它的一小部分。

最終,我們希望將我們的訓練分布在與 Spark ML 不同的維度上。使用小型或中型數據時,將數據擬合到內存中不是問題。對於隨機森林的例子,我們希望將訓練數據完整地廣播給每個執行器,在每個執行器上擬合一個獨立的決策樹,並將那些擬合的決策樹返回驅動程序以構建隨機森林。沿著這個維度分布比串行分布數據和訓練決策樹快幾個數量級。這種行為與網格搜索和多類等其他元估計器技術類似。

特徵

鑑於這些現有解決方案在我們的問題空間中的局限性,我們決定在內部開發 sk-dist。最重要的是我們要「分配模型,而非數據」。

sk-dist 的重點是關注元估計器的分布式訓練,還包括使用 Spark 進行 scikit-learn 模型分布式預測的模塊、用於無 Spark 的幾個預處理/後處理的 scikit-learn 轉換器以及用於有/無 Spark 的靈活特徵編碼器。

分布式訓練:使用 Spark 分配元估計器訓練。支持以下算法:超參數調優(網格搜索和隨機搜索)、決策樹集合(隨機森林、額外隨機樹和隨機樹嵌入)以及多類技術(一對多和一對一)。

分布式預測:使用 Spark DataFrames 分布擬合 scikit-learn 估算器的預測方法。可以通過可攜式 scikit-learn 估計器實現大規模分布式預測,這些估計器可以使用或不使用 Spark。

特徵編碼:使用名為 Encoderizer 的靈活特徵轉換器分布特徵編碼。它可以使用或不使用 Spark 並行化。它將推斷數據類型和形狀,自動應用默認的特徵轉換器作為標準特徵編碼技術的最佳預測實現。它還可以作為完全可定製的特徵聯合編碼器使用,同時具有與 Spark 分布式轉換器配合的附加優勢。

用例

以下是判斷 sk-dist 是否適合你的機器學習問題空間的一些指導原則:

傳統機器學習 :廣義線性模型、隨機梯度下降、最近鄰算法、決策樹和樸素貝葉斯適用於 sk-dist。這些都可在 scikit-learn 中實現,可以使用 sk-dist 元估計器直接實現。中小型數據 :大數據不適用於 sk-dist。請記住,訓練分布的維度是沿著模型變化,而不是數據。數據不僅需要適合每個執行器的內存,還要小到可以廣播。根據 Spark 配置,最大廣播大小可能會受到限制。Spark 定位與訪問:sk-dist 的核心功能需要運行 Spark。對於個人或小型數據科學團隊而言,這並不總是可行的。此外,為了利用 sk-dist 獲得最大成本效益,需要進行一些 Spark 調整和配置,這需要對 Spark 基礎知識進行一些訓練。

這裡一個重要的注意事項是,雖然神經網絡和深度學習在技術上可以與 sk-dist 一起使用,但這些技術需要大量的訓練數據,有時需要專門的基礎設施才能有效。深度學習不是 sk-dist 的預期用例,因為它違反了上面的 (1) 和 (2)。在 Ibotta,我們一直在使用 Amazon SageMaker 這些技術,我們發現這些技術對這些工作負載的計算比使用 Spark 更有效。

原文地址:https://medium.com/building-ibotta/train-sklearn-100x-faster-bec530fc1f45

相關焦點

  • 利用Spark 和 scikit-learn 將你的模型訓練加快 100 倍
    當我們使用 Spark 進行數據處理時,我們首選的機器學習框架是 scikit-learn。隨著計算機變得越來越便宜,機器學習解決方案的上市時間變得越來越關鍵,我們探索了加快模型訓練的各種方法。其中一個解決方案是將 Spark 和 scikit-learn 中的元素組合到我們自己的混合解決方案中。
  • 清華自研深度學習框架「計圖」開源!多項任務性能超過PyTorch
    但如果需要讓Jittor支持新的硬體,只需要重載編譯接口即可,讓Jittor移植到新的硬體的難度將大大降低。Jittor開發團隊說,他們將在未來支持更多的計算設備。如此架構,用起來怎樣?官方文檔介紹稱,從頭只需要若干行代碼,就能訓練一個兩層神經網絡。上面的代碼,定義了激活函數和全連接層。
  • 華為深度學習框架MindSpore正式開源:自動微分不止計算圖
    作為一款「全場景 AI 框架」,MindSpore 是華為人工智慧解決方案的重要組成部分,與 TensorFlow、PyTorch、PaddlePaddle 等流行深度學習框架對標,旨在大幅度降低 AI 應用開發門檻,讓人工智慧無處不在。MindSpore 是一款支持端、邊、雲獨立/協同的統一訓練和推理框架。
  • 超越PyTorch 和 TensorFlow,這個國產框架有點東西
    它以處理大規模模型見長,甚至今年將全部源碼和實驗對比數據,在 GitHub進行了開源。質疑不可避免的出現了:OneFlow這種擅長解決大模型訓練的新架構有必要嗎?深度學習框架的效率有那麼重要嗎?創業公司有可能在競爭中脫穎而出麼?我們採訪了一流科技 CEO袁進輝,了解到了他和一流科技的工程師們,1300多個日日夜夜、數十萬行代碼背後的故事。
  • 一個照片「隱身衣」,讓微軟曠視人臉識別系統100%失靈|開源
    這就是來自芝加哥大學的最新研究:給照片加上一點肉眼看不出來的修改,就能讓你的臉成功「隱形」。如此一來,即使你在網絡上的照片被非法抓取,用這些數據訓練出來的人臉模型,也無法真正成功識別你的臉。在Microsoft Azure Face API、Amazon Rekognition和曠視Face Search API這幾個最先進的人臉識別服務面前,Fawkes的「隱身」效果則達到了100%。目前,Fawkes已開源,Mac、Windows和Linux都可以使用。
  • 推斷速度達seq2seq模型的100倍,谷歌開源文本生成新方法LaserTagger
    模型架構改進(如 Transformer)以及通過無監督訓練方法利用大型無標註文本資料庫的能力,使得近年來神經網絡方法獲得了質量上的提升。但是,使用 seq2seq 模型解決文本生成任務伴隨著一些重大缺陷,如生成的輸出不受輸入文本支持(即「幻覺」,hallucination)、需要大量訓練數據才能實現優秀性能。此外,由於 seq2seq 模型通常逐詞生成輸出,因此其推斷速度較慢。
  • TensorFlow 2.0開源工具書,30天「無痛」上手
    機器之心報導項目作者:lyhue1991「官方文檔排布凌亂、搜索難用、API 醜陋不堪……」這是很多人對 TensorFlow 官方文檔的吐槽。但吐槽歸吐槽,到了工業界,你是無論如何也繞不開這個框架的。既然非學不可,那怎麼讓這個學習過程變得更加平滑呢?
  • 機器之心年度盤點:2018年重大研究與開源項目
    與 ULMFiT 類似,ELMo 極大提升了在大量 NLP 任務上的性能,如情感分析和問答任務。如下展示了 ELMo 在不同 NLP 任務中的效果,將 ELMo 加入到已有的自然語言系統將顯著提升模型效果。
  • 華為開源自研AI框架MindSpore!自動微分、並行加持,一次訓練,可多...
    乾明 發自 凹非寺  量子位 報導 | 公眾號 QbitAI  華為的開源AI框架,來了!  剛剛,華為宣布正式開源自研深度學習框架MindSpore,代碼已經上線。  可視化工具提供單次訓練過程可視化,以及多次訓練的模型溯源對比功能,讓開發者煉丹更加便利。  模型評估工具支持多種對抗樣本生成算法,包括13種白盒、7種黑盒攻擊算法,幫助開發者評估對抗 樣本攻防能力。  在這些功能的加持下,MindSpore實現模型開發能力提升的同時,使用起來也頗為方便。
  • 計算機圖形也能自動可微:MIT學神的微分太極框架開源
    這一框架可以基於太極實現自動微分,在物理模擬優化方面有很高的性能和靈活性。這意味著太極從計算機圖形學進入了機器學習的領域。目前,一作胡淵鳴已在 GitHub 上開源了基於這一框架完成的 10個 物理模擬器,項目登上了 GitHub 熱榜。而微分太極論文也已被 ICLR2020 接收。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    選自PyTorch.org機器之心編譯參與:吳攀、李澤南、李亞洲Torch7 團隊開源了 PyTorch。據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。
  • 清華「計圖」迎來重大更新:支持可微渲染,多項任務速度超PyTorch|...
    除此之外,這一可微分渲染庫內置2種主流可微渲染器,支持多種材質渲染,相比於PyTorch,速度提升了1.49~13.04倍。當然,這次「計圖」的更新,帶來的驚喜不止這些。同時,這次更新還帶上了YOLOv3的加速和復現,訓練速度相較於PyTorch提升11%。原來在Jittor上可以運行的MobileNet,這次的訓練和推理速度也得到了全面提升,在不同的圖像及batchsize大小上,速度提升從10%~50%不等。簡直是視覺分類玩家的福音。搞圖形學,選哪個深度學習框架?
  • 迎來PyTorch,告別 Theano,2017 深度學習框架發展大盤點
    這使得開發者的深度學習模型能夠有「最大限度的內存效能」,訓練比從前更大的深度神經網絡。對於 Theano 的退出,有開發者這樣評價,「它開啟了基於符號運算的機器學習框架的先河,然後隨著 TensorFlow 和 PyTorch 的崛起,完成自己的歷史任務。」
  • 機器學習之sklearn基礎教程!
    ("Class labels:",np.unique(y)) #列印分類類別的種類切分訓練數據和測試數據# 切分訓練數據和測試數據from sklearn.model_selection import train_test_split## 30%測試數據,70%訓練數據,stratify
  • 雲+社區技術沙龍丨解析騰訊最新開源項目背後的技術棧
    本期活動的主題為「騰訊開源技術」,多位來自騰訊的開源技術專家及工程師圍繞 Kona JDK、TencentOS tiny、TubeMQ 等開源項目的開發過程,分享了騰訊在開源之路上取得的最新成果以及過程中所積累的實踐經驗,並深入探討了開源技術在大數據、物聯網、醫療等不同場景下的發展趨勢。
  • 35 萬行代碼,曠視重磅開源天元深度學習框架 ,四大特性實現簡單開發
    2017年,Facebook開源了用於神經網絡訓練的Python包PyTorch,它改編自基於Lua的深度學習庫Torch,類似於Numpy,非常Python化,很容易就能和Python生態系統的其他部分集成。由於對動態圖的支持,PyTorch的靈活性相比TensorFlow大大提升,特別是用於快速驗證和算法復現,因此備受學術界的青睞。
  • 計算機圖形自動可微:MIT學神微分太極框架開源,論文被ICLR接收
    目前,一作胡淵鳴已在 GitHub 上開源了基於這一框架完成的 10個 物理模擬器,項目登上了 GitHub 熱榜。而微分太極論文也已被 ICLR2020 接收。項目地址:https://github.com/yuanming-hu/difftaichi論文地址:https://arxiv.org/pdf/1910.00935.pdf10 個不同的物理模擬器微分太極框架極大了提升了可微物理模擬器的性能和生產力。
  • 深度學習框架哪家強?國產框架OneFlow做了一份測評報告
    OneFlow 是一流科技自主研發、擁有完全自主智慧財產權的深度學習框架軟體,是國內首個由初創團隊研發並開源的 AI 框架,今年 7 月 31 日正式開源。OneFlow 獨創的自動數據模型混合併行、靜態調度、去中心化和全鏈路異步流式執行四大核心技術,使用軟體技術解決大數據、大模型、大計算所帶來的異構集群分布式橫向擴展挑戰,獲得了廣泛的業內關注。
  • 開源項目在GitHub上貢獻33.5W個Star!騰訊的十年「雲」答卷,請收好!
    這一路來,騰訊也貢獻了一份重要的力量,110+個開源項目,Github總Star數超過33.5W,「雲原生」產品API每日調用量更是超100億次,騰訊在2020 Techo開發者大會上交出開源十年的答卷! 2020年,雲原生(Cloud Native)的概念,火得一塌糊塗。