優化你的CPU來做深度學習

2019-10-15   AI公園
作者:Param Popat
編譯:ronghuaiyang

導讀

對於想學習深度學習的同學們來說,學習資源網上有很多,但是計算資源確很少,而GPU又太貴,怎麼辦呢?通過簡單的設置,將CPU做深度學習的速度提升到3倍以上,大家又可以愉快的學習深度學習了!

在過去的幾年裡,無論是在學術界還是產業界,深度學習的速度都在加快。現在每家公司都在尋找基於人工智慧的問題解決方案。這種繁榮有它自己的優點和缺點,但這是另一篇文章,改天再說。機器學習實踐者的激增已經滲透到學術界的根源,幾乎每個領域的學生都可以通過課程、mooc、書籍、文章,當然還有課程論文,接觸到人工智慧和ML知識。

然而,硬體資源的可用性阻礙了這種增長。GPU是你能夠以一定的速度執行ML任務的最佳設備之一。然而高性能GPU的價格甚至可以到20449美元(NVIDIA Tesla GPU V100 32 gb) 。此外,使用高級GPU的消費級筆記本電腦,使用1050Ti或1080Ti之類的GPU,售價約為2000美元。為了減輕這種痛苦,谷歌、Kaggle、Intel和Nvidia免費提供了基於雲的高計算系統,但對空間、計算能力、內存或時間都有限制。但是這些在線服務也有其缺點,包括管理數據(上傳/下載)、數據隱私等。這些問題導致了我的文章的主要觀點,「為什麼不優化我們的cpu來實現深度學習任務的加速?」

性能的提升

對於下面提到的各種實驗,我會展示我觀察到的時間和利用率的提高。

  1. 10層深度CNN用於CIFAR-100圖像分類。
  2. 3層深度LSTM進行IMDB情緒分析。
  3. 6層深度密集神經網絡用於MNIST圖像分類。
  4. 9層全卷積MNIST自動編碼器。

這些任務用Keras寫代碼,使用tensorflow後端,數據集和代碼和和可執行庫放在一個盤裡。所使用的是SSD硬碟。

我們將考慮以下六種優化組合。

  1. 英特爾(R) Core (TM) i7。
  2. Intel(R) Xeon(R) CPU E3-1535M v6。
  3. 英特爾(R)核心(TM) i7與英特爾Python(英特爾i7*)。
  4. Intel(R) Xeon(R) CPU E3-1535M v6採用Intel Python (Intel Xeon*)。
  5. Intel(R) Core (TM) i7與Intel Python和處理器線程優化(Intel i7(O))。
  6. Intel(R) Xeon(R) CPU E3-1535M v6採用Intel Python和處理器線程優化(Intel Xeon(O))。

對於每個任務,epochs的數量固定在50。從下圖中我們可以看到,對於一個Intel(R) Core (TM) i7-7700HQ CPU @ 2.80GHz CPU, epoch的平均時間接近4.67秒,經過適當的優化後下降到1.48秒,即提高3.2倍。對於一個Intel(R) Xeon(R) CPU E3-1535M v6 @ 3.10GHz CPU,epoch的平均時間接近2.21秒,經過適當的優化後下降到0.64秒,提高了3.45倍。

每個epoch的平均時間

優化不僅僅是在時間上,優化的分布也優化了CPU的利用率,這最終導致更好的熱量管理,你的筆記本電腦不會像以前訓練深度神經網絡時那麼熱。


使用率

我們可以看到,在不進行任何優化的情況下,訓練時CPU利用率最高達到100%,從而減慢了所有其他進程並使系統升溫。然而,通過適當的優化,i7和Xeon的利用率分別下降到70%和65%,但是在運行時間上卻減少了。

這兩個指標可以用以下相關術語進行總結。

在上面的圖中,越低的值越好,即以Intel Xeon為基準進行所有優化,而一個Intel Core i7處理器在優化後,每個epoch花費的時間幾乎是Xeon的兩倍。上面的圖表清楚地顯示了從訓練神經網絡的時間和CPU的使用情況來看,英特爾Python優化是前途光明的。

設置Intel的Python發行版



Intel Software提供了一個關於如何設置此選項的詳盡的資源列表,但是我們通常可能會遇到一些問題。更多關於發行版的詳細信息看這裡:(https://software.intel.com/en-us/distribution-for-python)。你可以選擇安裝的類型,即本地pip或conda。我更喜歡conda,因為它為我節省了大量的麻煩,而且我可以專注於ML,而不是解決我的庫的兼容性問題。

1) 下載安裝Anaconda

你可以從這裡:(https://www.anaconda.com/distribution/)下載Anaconda。他們的網站列出了在windows、ubuntu和macOS環境中安裝Python的所有步驟,並且很容易做。

2) 在你的Anaconda發布中設置Intel python

這一步通常比較棘手。最好為Intel發行版創建一個虛擬環境,這樣你就可以隨時在一個地方添加/更改優化後的庫。讓我們創建一個名為「intel.」的虛擬環境。

conda create -n intel -c intel intelpython3_full

這裡-c表示通道,因此我們不將Intel添加為通道,而是通過-c調用該通道。在這裡,intel python3_full將自動從Intel發行版獲取必要的庫,並將它們安裝到你的虛擬環境中。

你可以看到,對於每個庫,都以「Intel/…」開頭,這表示正在從Intel的發行渠道下載該庫。一旦你同意安裝這些庫,就會開始下載和安裝它們。

這一步是會出現一個問題。有時,這些庫不會被下載,列表會往下走,或者出現SSL錯誤,然後命令退出。這個問題甚至可能被延遲,也就是說,現在所有東西都將被下載和安裝,但是稍後如果你想添加任何新的庫,提示符將拋出SSL錯誤。有一個方式可以簡單的修復這個問題,為英特爾創建虛擬環境之前需要完成。

在你的shell或命令提示符中,通過下面的命令關閉anaconda的默認SSL驗證

conda config --set ssl_verify false

一旦關閉了SLL驗證,你可以重複步驟2,刪除之前創建的環境並重新啟動。

3) 設置TensorFlow

恭喜你!!現在,你已經在電腦中設置了Intel的python發行版。現在是進入ML pipeline的時候了。

英特爾已經通過所有的發行版為tensorflow提供了優化,設置起來非常順利。(https://software.intel.com/en-us/ai/frameworks/tensorflow)。讓我們看看如何為CPU安裝優化過的tensorflow。英特爾軟體提供了一個優化的數學內核庫(mkl),優化數學操作,並為用戶提供所需的加速。因此,我們將按如下方式安裝tensorflow-mkl。

conda install tensorflow-mkl

或者使用pip,可以將其設置為如下所示。

pip install intel-tensorflow

Tensorflow現在已經啟動並在你的系統中運行,並進行了必要的優化。如果你是Keras的粉絲,你可以用一個簡單的命令來設置它:-

conda install keras -c intel

4) 設置Jupyter

由於我們創建了一個新的虛擬環境,但它不是spyder或jupyter notebooks的默認環境。然而,設置這些是很簡單的。只要一行命令,我們就能做到。

conda install jupyter -c intel

5) 激活環境開始做實驗

既然我們已經設置好了所有的東西,現在是動手的時候了,我們開始在優化的CPU系統上編寫代碼並嘗試各種ML和DL方法。首先,在執行任何代碼之前,確保使用了正確的環境。在使用安裝在虛擬環境中的庫之前,需要激活虛擬環境。這個激活步驟是一個永久的過程,並且是毫不費力的。在anaconda提示符中編寫以下命令,就可以開始了。

conda activate intel

要對環境進行全面檢查,在激活環境後,在命令提示符/shell中鍵入以下命令。

python

輸入python後按enter,命令提示符中應該出現以下文本。確保顯示的是「Intel Corporation」,並顯示「Intel(R) Distribution for Python is brought to you by Intel Corporation.」。這些驗證了英特爾Python發行版的正確安裝。

現在,你可以使用命令行進行試驗,或者在其他地方編寫腳本來運行。

(intel) C:\\Users\\User>python script.py

通過以下步驟1到4,使你的系統具備上面的性能基準圖中提到的Intel xyz級別。這些仍然不是基於多處理器的線程優化。我將在下面討論如何進一步優化你的多核CPU。

多核優化

要為你的多核系統添加進一步的優化,你可以將以下代碼行添加到.py文件中,它將相應地執行腳本。這裡NUMPARALLELEXEC_UNITS表示內核的數量,我有一個四核i7,因此這個數字是4。

如果你不喜歡使用Keras而更喜歡使用tensorflow,那麼腳本幾乎保持不變,只需刪除以下兩行。

from keras import backend as K
K.set_session(session)

在你的代碼中添加了這些行之後,應該可以達到上面性能圖表中的Intel xyz(O)條目相當的性能。

如果你的系統中有GPU,並且它與當前庫集衝突,或者拋出一個cudnn錯誤,那麼你可以在代碼中添加以下行來禁用GPU。

os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

總結

現在你已經有了一個用於測試和開發機器學習項目和思想的優化pipeline。這一渠道為學生提供了大量的機會,讓他們參與到學術研究中,用他們所擁有的資源繼續他們的工作。這條pipeline還將防止從業者的私有數據的隱私泄露問題。

同樣值得注意的是,通過適當的微調,一個人可以在他們的工作流程中獲得3.45倍的加速,這意味著如果你正在試驗你的想法,你現在可以比以前快三倍。

英文原文:https://towardsdatascience.com/optimize-your-cpu-for-deep-learning-424a199d7a87

請長按或掃描二維碼關注本公眾號