詳解CPU漏洞對機器學習的影響:幾乎所有卷積層都受影響,QR分解降速37%

2018新年伊始,互聯網公司發現了兩個非常嚴重的新漏洞。這兩個漏洞分別是熔燬(Meltdown)幽靈(Spectre),它們主要會影響幾大處理器供應商。


這些漏洞會使攻擊者利用處理器在推測性執行時產生的錯誤,讀取(並潛在地執行)其各自進程之外的存儲器位置。這意味着,攻擊者可以讀取其他軟件存儲器中的敏感數據。


如果在Linux內核中打一個叫做KAISER(也稱爲KPTI)或PTI(頁表隔離)的補丁,可以有效地解決了利用了Meltdown的攻擊。但是,這個補丁會對Linux的性能造成很大的影響。據報告顯示,CPU性能下降的範圍是5%到35%,另有一些綜合的評測標準顯示,CPU的性能下降幅度甚至超過了50%。


(報告地址:https://www.phoronix.com/scan.php?page=article&item=linux-415-x86pti&num=2)


然而,PTI的性能問題在很大程度上取決於每個人手頭需要執行的任務。換句話說,這種性能的大幅度下降可能僅僅出現在FSMark等綜合的基準測試中。


所以問題來了:在機器學習的應用程序中,我們會看到什麼樣的性能?



環境部署


爲了比較在使用和不使用PTI時,機器學習應用程序的性能變化,我部署了一個新的帶intel微碼(也稱爲微指令)的機器。該機器裝有Ubuntu 16.04版本的操作系統。


我還比較了Ubuntu 16.04(4.10.0-42-generic版本)上自動安裝的最新內核與最新的主線內核版本(4.15.0-041500rc6-generic版本),這個版本的Linux帶有PTI補丁。


我採用的工具是基於Python 3.6(帶有用pip下載的額外軟件包)的Anaconda,由它來執行整個測試。


我用於測試的機子配置包括英特爾酷睿i7-5820K(Haswell-E,stock clocks)和64GB DDR4 @ 2400MHz。


值得注意的是,AMD的處理器沒有啓用PTI補丁,因爲它們不受Meltdown攻擊的影響——所以如果你使用的是AMD處理器,性能將不會受到任何影響。



測試結果

0?wx_fmt=png請注意,圖表上的比例是從60%開始的


首先,我們可以看到幾乎所有的程序性能都有輕微的下降,不過在卷積層模型的推理過程中下降的速度非常快。尤其是AlexNet,它的推理速度比正常的慢了大約5%,但反向傳播速度幾乎是相同的——這就是爲什麼對訓練造成的影響大約只是推理的一半。


就Keras的原始操作而言,全連接和LSTM層幾乎沒有受到任何的性能影響,但卷積層卻減少了10%左右。


對於AlexNet和MNIST的基準測試,我使用了TensorFlow教程的模型。而對於Keras,我則使用了一個只有幾層卷積並可以隨機初始化的模型。我還計算了其在隨機數據上的推理速度。


值得注意的是,這些基準測試都僅使用了CPU來運行。


0?wx_fmt=png我在這裏使用了Scikit-learn工具包來衡量「傳統」機器學習和數據科學算法的性能。


我們看到,與神經網絡相比,操作系統帶來的性能下降更大,且PCA和線性/邏輯迴歸受到的影響最嚴重。造成這種下降的原因可能是由於某些數學受到了非常嚴重的影響——正如下面針對NumPy的基準結果所討論的那樣。


有趣的是,K最近鄰算法完全沒有受到PTI的影響,而且目測在新的內核上表現的還稍好一些。這有可能只是在性能測試錯誤的範圍之內,但也有可能是其他一些內核的改進,稍微幫助提高了該算法的速度。


我還從內存裏緩存的文件中提取了一個pandas.read_csv()函數的基準,用於查看帶PTI的系統對CSV解析的速度降低了多少——輸入博世(Bosch)Kaggle競賽數據集(大小2GB,1M行,1K列,類型是浮點數, 80%缺失),帶來了6%左右的讀取性能下降。


所有的Scikit-learn工具包基準也是在博世數據集上進行計算的。我發現,普遍來講,它對於進行機器學習算法基準測試,效果是很好的,因爲這是一個龐大的,標準化的且格式良好的數據集(儘管因爲採用完整的數據會花費太久的時間,kNN和K-means算法是在一個子集上進行計算的)。


0?wx_fmt=png

這些基準在這裏可能是最綜合的了,因爲僅測試了單一的scipy操作的速度。然而,這些結果告訴我們,PTI帶來的性能損失是與任務依賴有極大聯繫的。在這裏我們可以看到,大多數的操作受到的影響都很小,包括點積和FFT(快速傅里葉變換)操作,其對性能的影響也很小。


當PTI啓用時,SVD(奇異值分解),LU分解和QR(正交三角)分解性能都會受到大幅度的影響。QR分解從190GFLOPS降低到110GFLOPS,降低了37%的性能。這可能有助於解釋爲什麼PCA(主要依賴於SVD)和線性迴歸(主要依賴於QR分解)的性能會下降。


這些基準測試是使用英特爾自己的ibench軟件包完成的,只是使用了Anaconda而不是英特爾的python發行版。

0?wx_fmt=png

對XGBoost算法進行測試時,我得到了一些有趣的結果。


在大多數情況下,使用較少的線程數時,無論使用慢速精確的方法還是快速直方圖方法,PTI帶給XGBoost的性能影響都可以忽略不計。


但是,當使用非常多的線程時,也就是CPU同時處理更多的任務時,使用PTI系統會帶來速度的下降。


這並不是XGBoost在大量線程內核上執行的完美表示(因爲它是在12個邏輯內核上運行了40個線程)。不過,它也能表明,帶PTI的系統在CPU同時處理很多事情時,會帶來更大的性能影響。不幸的是,我不能訪問任何的可以修改內核的高內核數量的服務器,所以我不能得到一個更深入的結果。


與測試scikit-learn一樣,這些基準測試是在博世(Bosch)數據集上進行的。



結論


最重要的結論是,PTI帶來的性能影響其實是非常依賴於任務的——一些任務不受影響,而有些任務的性能卻下降了40%。不過就總體而言,我認爲這種影響比我預期的要小,因爲只是一些應用程序受到了嚴重的影響。