2020年4月22日 星期三

究竟 nVidia Gefore GTX 1060 在 TensorFlow-gpu 的表現如何? (Part 2)

[最新更新:05/14/2020]

真的好久好久沒有更新科普的文章了,而且看了一下 Part 1 的完成時間,居然是在 2019 年的 2 月,時間已經整整流失了一年多。其中有一項重要的發展,Tensorflow 已經從 1.x 版大改版的升級到 2.x 版,因此這次測試的文章是以 2.x 進行的。

這次測試的也不再使用 baby 級的程式,而是自然語言處理(Natural Language Processing)中情緒分析(Sentiment Analysis)的程式。基本上,我是參考 Perform sentiment analysis with LSTMs, using TensorFlow 這篇文章內 Tensorflow 1.x 版的程式並將其改寫成 2.x 的程式。 順便提一下,這篇文章寫得相當好;如果你對於情緒分析的主題有興趣的話,非常值得一讀。

我實驗的環境跟 Part 1 一樣,因此這裡不再贅述。軟體環境是 Anaconda;一定要提的是:自從 Tensorflow 2.x 釋出之後,目前利用 Anaconda 安裝 2.x 非常簡單,簡單到完全不必另外手動安裝 cuda 之類的套件。深度學習的架構是隱藏層是 LSTM,輸出層就是一般常用的 Dense,總共使用 50000 筆資料中的 25000 筆進行訓練,批次訓練的數量是 64 筆。


從圖中,我們可以看出,每次跑完一個 epoch 的時間大約不到 7.5 秒,這樣的表現究竟是好?還是不好呢?我上班用的是一部 2017 年出的 iMac,CPU 也是 Core i5,只是它是 i5-7500,我查了一下這顆 7500 比我家裡的 PC(i5-4660)新,而且速度大約快了 10% 左右。以下是 iMac 的系統畫面:


我把同樣的程式,同樣的參數設定移到 iMac 執行的效能如何呢?請看下個畫面,居然每個 epoch 需要 130~145 秒左右,GPU 可是只需要 7 秒多啊。由此可知,就算是低檔的 GPU 在實務上都有機會跑出非常驚人的成效。


那麼 GPU 保證可以跑出好的成效嗎?我再次把程式碼做了修正。在第一版的程式中,我們利用現有的 word embeddings(也就是 Glove)來代表每一個字。在修正版中,我不再使用 Glove 已經訓練好的 embeddings,而是利用 Tensorflow 2.x 的 Embedding layer 來產生這些 embeddings。這項改變自然使得訓練時間增加,但是究竟增加多少呢?



從上圖我們可以看到,在我們的 PC 上每一個 epoch 的訓練時間增加到 119~128 秒之間,同時我也利用 win10 的效能監測工具看到,CPU 的使用率幾乎都在 100%,而 GPU 幾乎沒有什麼變化。這個修正版的程式在 iMac 的執行成效如何呢?我忘了擷圖,但是在 iMac 上每一個 epoch 的訓練時間增加到 195 秒之間。很明顯的,兩者之間並不像之前相差基近 20 倍的差距,GPU 似乎沒有發揮太大的效用。

究竟是什麼原因造成這樣的結果呢?我沒有再深入了解,但是我推測最有可能的因素是我的 GPU 的記憶體太小,裝不下整個 Embeddng layer 所需的空間;另一個可能是 Embedding layer 的訓練用不到太多的陣列運算。不過,我個人認為第一個原因才是主要原因;等我有機會升級 GPU 再來實驗看看!

2020 年 5 月又再次跑了一個實驗,因為訓練時間有明顯差異,我就把結果放上來當作實務應用的參考。這次實驗的範例是機器翻譯(Machine Translation),我是根據 A ten-minute introduction to sequence-to-sequence learning in Keras 這篇文章的程式碼,並將其改成 Tensorflow 2.x 版。這篇文章是利用訓練資料把英文翻譯成法文,只不過該範例不是以 Word 來翻譯,而是以 char 逐字元翻譯。

實驗結果就不附圖了,簡單的說一下,同樣的訓練資料以及 epoch 100 次,在 iMac 上的訓練時間超過一個小時又十分鐘,而在我的 PC 上卻只需不到 230 秒(四分鐘)的訓練時間,兩者之間再次相差接近 20 倍。

沒有留言:

張貼留言