天天看點

【最大降40%】CPU漏洞更新檔對機器學習和深度學習性能影響實測

就在上周,網際網路爆出兩個新的嚴重漏洞,分别是 Meltdown和Spectre,這兩組漏洞幾乎影響所有的主流CPU。這些漏洞都源于處理器的“推演執行”(speculative execution)的bug,它允許攻擊者讀取(并潛在地執行)其各自程序之外的記憶體位置,這意味着程式可以讀取其他軟體記憶體中的敏感資料。

為了解決這個問題,Linux核心合并了一個名為KAISER或PTI(頁表隔離)的更新檔,這個更新檔有效地解決了Meltdown攻擊。但是,這個更新檔對性能造成了很大的影響,據報告CPU性能下降達到5%至35%(甚至一些綜合benchmark性能下降超過50%)。

但是,PTI的性能問題在很大程度上取決于目前的任務,大幅度下降可能僅會出現在FSMark等綜合benchmark中。是以,我們提出一個問題:在機器學習應用程式中,性能受到怎樣的影響?

安裝

為了比較使用和不使用PTI更新檔的性能,我安裝了一台新的安裝了Intel microcode的Ubuntu 16.04機器,并将Ubuntu 16.04(4.10.0-42-generic)上自動安裝的最新核心與最新的有PTI更新檔的主線核心版本(4.15.0–041500rc6-generic)進行比較。我使用了Python 3.6(以及來自pip的額外軟體包)的Anaconda來執行測試。

我用于測試的機組包括英特爾酷睿i7-5820K(Haswell-E,stock clocks)和64GB DDR4 @ 2400MHz。值得注意的是,AMD處理器沒有啟用PTI更新檔,因為它們不受Meltdown攻擊的影響——是以如果你使用AMD的話,性能不會受到任何影響。

結果

【最大降40%】CPU漏洞更新檔對機器學習和深度學習性能影響實測

首先,所有的性能都出現了輕微的下降,但是卷積層模型的推斷性能下降很大。特别是AlexNet,前向傳播速度慢了大約5%,但反向傳播速度幾乎沒變——訓練性能受到的影響大約是推理的一半。

就Keras的raw操作而言,全連接配接層和LSTM層的性能幾乎沒有受到影響,但卷積層的性能降了10%。

對于Alexnet和MNIST基準測試,我使用了TensorFlow教程模型,對于Keras,我使用了随機初始化模型和幾個有問題的層,并測試了随機資料的推理速度。值得注意的是,這些基準測試完全在CPU上運作。

【最大降40%】CPU漏洞更新檔對機器學習和深度學習性能影響實測

我在這裡使用了Scikit-learn來衡量“經典”ML和資料科學算法的性能。從上圖中可以看到,與神經網絡相比,經典ML算法的性能下降更大,PCA和線性回歸/邏輯回歸受到的影響最嚴重。造成這麼大的性能下降的原因可能是某些數學運算受到嚴重影響,我将在下文的NumPy benchmarks讨論這一點。

有意思的是,kNearestNeighbour完全不受PTI的影響,而且看起來在新核心上甚至表現更好。這可能隻是在error的範圍之内,但也有可能是其他一些核心的改進有助于提高速度。

我還從記憶體緩存的檔案中提取了一個pandas.read_csv()的benchmark,目的是看看PTI對CSV的解析速度有多大的影響——在讀取 Bosch Kaggle競賽資料集的速度下降是6%。

所有scikit-learn benchmark也都在Bosch資料集上計算了——我發現通常對于ML benchmark表現較好,因為這個資料集具有規模大,标準化和格式良好的資料(雖然kNN和Kmeans是在一個子集上計算的,因為使用完整的資料需要的時間太長)。

【最大降40%】CPU漏洞更新檔對機器學習和深度學習性能影響實測

這些benchmark可能是這裡最綜合的,測試的是一個單一的scipy操作的速度。但是,上圖的結果顯示,PTI的性能受到的影響是極端任務依賴性( task-dependent)的。我們可以看到,大多數操作隻受到很小的影響,點積(dot product)和FFT對性能影響很小。

當PTI啟用時,SVD,LU分解和QR分解都會大幅度影響性能,QR分解從190GFLOPS降低到110GFLOPS,降低了37%。這可能有助于解釋PCA(主要依賴于SVD)和線性回歸(主要依賴于QR分解)的性能下降。

這些 benchmark是使用英特爾自己的ibench軟體包完成的,隻使用了Anaconda而不是英特爾的python發行版。

【最大降40%】CPU漏洞更新檔對機器學習和深度學習性能影響實測

XGBoost的結果有點意思。大多數情況下,使用較少的線程數時,無論使用慢的Exact方法還是快的直方圖方法,PTI對XGBoost的性能影響都可以忽略不計。

但是,當使用的線程非常多時,CPU同時處理更多的column,使用PTI的處理速度就下降了。

這并不是XGBoost如何在大量核心上執行的一個完美展示(因為這是在12個邏輯核心上運作了40個線程),但是它表明PTI對CPU同時處理很多線程時的影響更大。不過,我沒法通路任何可以修改核心的多核心數量的伺服器,是以沒法得到更深入的結果。

與scikit-learn一樣,這些基準是在Bosch資料集上進行的。

原文釋出時間為:2018-01-07

本文作者:Mikel Bober-Irizar  

本文來自雲栖社群合作夥伴新智元,了解相關資訊可以關注“AI_era”微信公衆号