擴展世鵬科技電子計算PySpark和熊貓UDF
2022年2月2日 在數據科學和毫升
動機
隨著機器學習(ML)的應用,特別是深度學習(DL)模型在決策,是越來越重要的通過黑盒和證明等關鍵業務決策基於的模型的輸出。舉個例子,如果一個毫升模型拒絕客戶的貸款請求或對等貸款信用風險賦值給一個特定的客戶,給業務涉眾一個解釋關於為什麼這個決定可能是一個強大的工具在鼓勵模型的適應性。在許多情況下,可判斷的ML不僅僅是一個業務需求但監管要求理解為什麼某個決定或選擇給客戶。沙普利加解釋(世鵬科技電子)是一個重要的工具可以利用可辯解的AI和幫助建立信任的結果毫升模型和神經網絡在解決業務問題。
世鵬科技電子是一種先進的基於框架模型解釋博弈理論。涉及的方法找到一個特性之間的線性關係模型和模型輸出為每個數據點在你的數據集。使用這個框架,您可以解釋你的模型的輸出全球或本地。全球可解釋性有助於你理解多少每個特性導致結果積極的還是消極的。另一方麵,當地可解釋性有助於你理解每個特性的影響對於任何給定的觀察。
最常見的世鵬科技電子實現數據科學界普遍采用的是單一節點上運行的機器,這意味著他們在單核運行所有的計算,不管有多少核心是可用的。因此,他們不利用分布式計算能力和有界的一個核心的局限性。
在這篇文章中,我們將演示一個簡單的方法在多台計算機上並行化世鵬科技電子價值計算,專門為當地的可解釋性。我們將解釋如何解決尺度與越來越多的行和列的數據集。最後,我們將介紹一些我們的發現對什麼可行、什麼時避免並行世鵬科技電子計算與火花。
單節點世鵬科技電子
實現explainability,世鵬科技電子模型轉化為一個講解員;單個模型的預測被解釋為應用講解員。有幾種實現世鵬科技電子在不同的編程語言包括價值計算在Python中受歡迎的一個。在這個實現中,解釋為每個觀察,你可以申請一個講解員適合您的模型。下麵的代碼片段說明了如何應用TreeExplainer隨機森林分類器。
進口世鵬科技電子講解員= shap.TreeExplainer (clf)shap_values = explainer.shap_values (df)
這種方法適用於數據量小,但在解釋一個毫升模型輸出的數百萬條記錄,但是沒有很好的伸縮性由於單節點的性質實現。舉個例子,下麵的圖1中的可視化顯示世鵬科技電子值計算的執行時間的增長在單個節點機(4核和30.5 GB內存)越來越多的記錄。內存數據的機器跑出形狀大於1 m 50行和列,因此,這些值是失蹤的圖中。正如你所看到的,執行時間的增長幾乎線性的記錄,這在真實場景中是不可持續的。例如,等待10個小時來理解為什麼一個機器學習模型做出了模型預測既不有效也不接受在許多業務設置。
你可以看看來解決這個問題的一個方法是使用近似計算。你可以設置近似參數為Trueshap_values方法。這樣,低分割在樹上會有更高的權重和沒有保證世鵬科技電子值與精確計算一致。這將加速計算,但你可能得到一個準確的解釋模型輸出。此外,近似參數隻是TreeExplainers中可用。
另一種方法是利用分布式處理框架(如Apache火花™應用程序並行化的講解員在多個內核。
擴展與PySpark世鵬科技電子計算
分發世鵬科技電子計算,我們正在處理這Python實現,熊貓udf在PySpark。我們使用的是kddcup99數據集構建一個網絡入侵探測器,能夠區分壞的預測模型連接,稱為入侵或攻擊,和良好的正常連接。這個數據集已知的缺陷入侵檢測的目的。然而,在這篇文章中,我們純粹是專注於世鵬科技電子值計算,而不是底層毫升的語義模型。
我們為我們構建的兩個模型實驗是簡單隨機森林分類器訓練數據集上10到50特性顯示解決方案的可伸縮性在不同列的大小。請注意,原始數據集有少於50列,和我們有複製其中的一些列達到所需的數據量。我們所擁有的數據量試驗從4 mb到1.85 gb。
在我們深入代碼之前,讓我們提供一個快速概述火花Dataframes和udf是如何工作的。火花Dataframes分布(行)在一個集群中,每個分組稱為一個分區,每個分區的行(默認情況下)可以在1核心操作。這就是火花從根本上實現並行處理。熊貓熊貓udf是一個自然的選擇,因為可以很容易地給世鵬科技電子性能。熊貓UDF,有時稱為矢量化UDF,給我們更好的性能在Python UDF使用Apache箭頭優化數據的傳輸。
下麵的代碼片段演示了如何並行化應用的講解員PySpark熊貓UDF。我們定義了一個熊貓UDF調用calculate_shap然後通過這個函數mapInPandas。該方法用於並行化方法應用於PySpark dataframe。我們將使用這個UDF來運行我們的世鵬科技電子性能測試。
def calculate_shap (迭代器:迭代器[pd.DataFrame]) - >迭代器[pd.DataFrame]:為X迭代器:收益率pd.DataFrame (explainer.shap_values (np。數組(X), check_additivity =假)[0),列= columns_for_shap_calculation,)
return_schema = StructType ()為在columns_for_shap_calculation特性:return_schema = return_schema。添加(StructField(特性,FloatType ()))
shap_values = df。mapInPandas(calculate_shap, schema=return_schema)
圖2比較的執行時間1 m行十列單節點機器上對集群的大小2、4、8、16、32、64。底層機器所有集群是相似的(4芯和30.5 GB的內存)。一個有趣的觀察是,利用並行代碼的核心在集群中的節點。因此,即使使用集群的大小2提高了性能幾乎5倍。
擴展和不斷增長的數據大小
由於世鵬科技電子是如何實現的,附加功能對性能的影響遠遠大於其他行。現在我們知道,世鵬科技電子值可以計算速度使用火花和熊貓UDF。接下來,我們將看看世鵬科技電子執行附加功能/列。
直觀的數據大小增長意味著更多的計算通過的緊縮世鵬科技電子算法。圖3說明了世鵬科技電子值16-node集群上執行時間不同數量的行和列。你可以看到擴展行增加了執行時間幾乎成正比,即增加一倍的行數幾乎翻執行時間。擴展的列數與執行時間的比例關係;添加一列增加近80%的執行時間。
這些觀察結果(圖2和圖3)讓我們得出這樣的結論:數據越多,你越能擴展計算水平(添加更多的工作節點)來保持合理的執行時間。
當考慮並行?
我們想要回答的問題是:當並行值得嗎?當一開始使用PySpark並行化世鵬科技電子計算——甚至可能會增加計算的知識?我們建立了一個實驗測量的影響集群規模翻倍提高世鵬科技電子計算執行時間。這個實驗的目的是找出大小的數據證明扔更多的水平(即資源。,增加工作節點)的問題。
我們跑十世鵬科技電子計算列的數據行數為10,100年,1000年,等等10米。對於每個行數,我們測量了世鵬科技電子計算執行時間4次集群大小的2,4,32,64。執行時間比世鵬科技電子價值計算的執行時間比在更大的集群大小(4 - 64)在集群上運行相同的計算規模的一半的節點數(分別為2和32)。
圖4說明了這個實驗的結果。這裏有外賣的關鍵:
-
- 對於小行數,加倍集群大小不改善執行時間和,在某些情況下,惡化由於火花所增加的開銷任務管理(因此執行時間比> 1)。
- 當我們增加的行數,增加集群大小變得更有效。10 m行數據,集群規模幾乎增長一倍半的執行時間。
- 行數,增加集群大小從2到4比翻倍更有效從32到64年(注意藍色和橙色線)之間的差距。隨著集群規模的增長,增加節點的開銷也在增長。這是由於在每個分區分區大小的數據大小太小,它增加了更多的開銷來創建一個單獨的任務處理少量的數據比使用一個更優的數據/分區大小。
陷阱
重新分區
如前所述,火花通過分區的概念實現了並行性;數據分割成塊的行和每個分區處理由一個默認的核心。當數據最初由Apache火花讀它未必創造最佳的分區計算您想要在您的集群上運行。特別是,世鵬科技電子計算值,我們可以獲得更好的性能,實現我們的數據集。
罷工之間的平衡是很重要的創造足夠小的分區,而不是很小,創建它們的開銷超過並行計算的好處。
我們的性能測試,我們決定利用集群中的所有核心使用下麵的代碼:
df = df.repartition (sc.defaultParallelism)
更大容量的數據你可能想要分區的數量設置為2或3倍的核心。關鍵是實驗,找出最好的為您的數據劃分策略。
使用顯示()
如果你工作在一個磚筆記本,你可能想要避免使用顯示()當基準測試執行時間的函數。顯示()的使用不一定給你完整的轉換需要多長時間;它有一個隱含的行限製,注入查詢,根據操作你想測量,例如,寫入一個文件,有額外的開銷收集結果返回給司機。我們的執行時間是衡量使用火花的寫方法使用“等待”格式。
結論
在這篇文章中,我們介紹了一個解決方案來加速世鵬科技電子計算的並行PySpark和熊貓udf。然後我們評估解決方案的性能增加卷上的數據,不同的機器類型和改變配置。這裏有外賣的關鍵:
-
-
- 單節點世鵬科技電子計算線性增長的行和列的數量。
- 並行計算與PySpark穿刺法提高了性能計算集群中所有的cpu上運行。
- 增加集群大小是更有效的,當你有更大的數據量。對於小數據,這種方法並不是有效的。
-
未來的工作
垂直擴展——博文的目的是展示如何縮放水平與大型數據集可以提高世鵬科技電子計算的性能值。我們開始在集群中每個節點的前提下有4個核心,30.5 GB。在未來,這將是有趣的測試的性能擴展垂直和水平;例如,比較4個節點的集群之間的性能(4芯,每30.5 gb) 2節點的集群(8核,61 gb)。
序列化/反序列化——如前所述,核心原因之一使用熊貓udf在Python udf是熊貓udf使用Apache箭頭提高JVM和Python之間的數據序列化/反序列化過程。時可能會有一些潛在的優化將引發數據分區轉換成箭頭批次記錄,試驗箭頭批大小可能導致進一步的性能收益。
比較與分布式世鵬科技電子實現——它將會是很有趣的比較的結果我們的解決方案的分布式實現世鵬科技電子,等Shparkley。在進行這樣的比較研究,這將是重要的,以確保輸出兩種解決方案都是類似的。