Keras控們的福音-使用低階GPU來訓練模型

        如果您是個經費拮据的Keras控,嫌CPU訓練速度過慢但又捨不得花錢購買昂貴的高階GPU,那麼,使用PlaidML搭配一些便宜中古的GPU顯卡是一個好選擇,可以讓我們用最少的經費享受到GPU加速的效果。

我在露天拍賣分別購買了下方兩張GPU,分別為4G RAM的NVidia GTX970以及8G RAM的AMD Radeon RX 580,其二手價分別僅約$3000左右,與中古價格約$8,000的1070Ti以及要價仍然接近兩萬的中古1080Ti相比較,價格差異相當大。

規格比較:

NVidia GTX970 Radeon RX 580
最高時脈 1178 MHz 1340 MHz
CUDA數目

串流處理器數目

1664個 2304個
記憶體 DDR5 4GB DDR5 8GB
最高瓦數 500W 500W
上市價格 $12,500(MSI) $8,590(MSI)
目前二手價格 $3,500 $3000

下文以此兩片GPU顯卡分別於Windows 10環境測試PlaidML的加速效能。不過,由於PlaidML尚未支援多GPU,因此如果在主機版上插了兩張GPU卡,執行plaidml-setup之後仍只會偵測出一張,是故下方測試是在windows 10平台,分別插入不同的GPU顯卡後所得到的測試結果。

安裝PlaidML

安裝PlaidML之前,請先安裝好基本的Python及Keras環境。(可參閱先前知識文件中的PlaidML_for_Deep_Learning一文)

Install PlaidML-Keras

pip install plaidml-keras plaidbench

Setup PlaidML

只要在command line直接執行plaidml-setup命令,便可偵測已安裝的GPU卡,並將預設使用的GPU設定於Home directory下的.plaidml。

安裝NVidia GTX970

於NVidia官網下載安裝最新的driver。

https://www.geforce.com.tw/drivers/results/148086

安裝AMD Radeon RX 580

於AMD官網下載安裝最新的driver。

https://www.amd.com/zh-hant/support/graphics/radeon-500-series/radeon-rx-500-series/radeon-rx-580

Performance測試

keras mobilenet

分別執行:plaidbench keras mobilenet

NVidia GTX 970

AMD Radeon RX 580

mobilenet速度比較:

GPU NVidia GTX 970 Radeon RX 580 AMD Radeon Pro 580 AMD Radeon Pro 580
平行計算架構 OpenCL OpenCL Metal OpenCL
OS環境 Windows 10 Windows 10 MAC OS MAC OS
Mobilenet

推論speed

10.38ms 6.12ms 5.74ms 9.18ms

下方為訓練深度學習模型的速度測試,藍底色區為此次訓練的標的物,紅底色區為NVidia 1080Ti的速度,作為對照用。

CIFAR-10 Training by using Keras Sequential model

測試Keras sequential model訓練CIFAR-10的速度。

GPU/CPU NVidia 1080Ti NVidia GTX970 Radeon RX 580 i5 4570 CPU Radeon Pro 580 Radeon Pro 580 i7 7700K CPU
平行計算

架構

CUDA OpenCL OpenCL Metal OpenCL
OS環境 Ubuntu Windows 10 Windows 10 Windows 10 MAC OS MAC OS MAC OS
核心數 3584 1664 2304 4 2304 2304 4
CIFAR-101 秒/epoch 3s 7s 7s 38s 10s 24s 30s

CIFA-10 Training by using Keras Resnet V1 model

測試Keras Resnet V1 model訓練CIFAR-10的速度。

GPU/CPU NVidia 1080Ti NVidia GTX970 Radeon RX 580 i5 4570 CPU Radeon Pro 580 Radeon Pro 580 i7 7700K CPU
平行計算

架構

CUDA OpenCL OpenC Metal OpenCL
OS環境 Ubuntu Windows 10 Windows 10 Windows 10 MAC OS MAC OS MAC OS
核心數 3584 1664 2304 4 2304 2304 4
CIFAR-10秒/epoch 8.2s 40.8s 42.2s 226s 32s 43s 118s

CIFA-10 Training by using Keras Resnet V2 model

測試Keras Resnet V2 model訓練CIFAR-10的速度。

 

GPU/CPU NVidia 1080Ti NVidia GTX970 Radeon RX 580 i5 4570 CPU Radeon Pro 580 Radeon Pro 580 i7 7700K CPU
平行計算

架構

CUDA OpenCL OpenCL Metal OpenCL
OS環境 Ubuntu Windows 10 Windows 10 Windows 10 MAC OS MAC OS MAC OS
核心數 3584 1664 2304 4 2304 2304 4
CIFAR-10秒/epoch 13s 57s 59.2s 595s 51s 65s 262s

YOLOV3 Keras版的速度測試

使用此版的Keras YOLO,程式碼來自於「How to Perform Object Detection With YOLOv3 in Keras」一文(URL:https://machinelearningmastery.com/how-to-perform-object-detection-with-yolov3-in-keras/?fbclid=IwAR1VGy_2as2j0CpMcn7aRQGvzTBH8yjqXcUrDn4U5rlf-zv4mP1o4VEjlyo)。我們使用官方提供的COCO預訓練權重YOLOV3.weights,測試YOLOV3的推論速度,下面兩張圖片為其輸出的預測結果。

H:\dogcat.png

H:\street.png

搭配PlaidML,這兩張平價的GPU卡使用YOLOV3的推論速度分別如下。

GPU/CPU NVidia GTX970 Radeon RX 580 i5 4570 CPU
平行計算架構 OpenCL OpenCL
OS環境 Windows 10 Windows 10 Windows 10
核心數 1664 2304 4
CIFAR-101 秒/epoch 0.34s

0.34s

0.33s

0.34s

2.87s

2.52s

結論

依上面的測試數字發現,PlaidML+低階GPU顯卡的訓練速度較一般CPU快五倍,而夢幻等級的高階顯卡1080Ti的速度又比PlaidML+低階GPU顯卡快了五倍。

如果你的經費拮据,那麼可以考慮購買金額$3,000左右的NVidia GTX970        (4G RAM)或者Radeon RX 580(8G RAM),可加快模型訓練的速度到五倍以上,若使用YOLOV3則推論速度可加快至接近十倍,這樣的performace在個人使用及練習上,應該是足夠了。

不過,要注意一點,使用PlaidML GPU加速的環境還是相當受限的,首先,它目前主要支援Keras framework,並且backend為plaidml所支援的opencl,因此僅能使用Keras內建的模型功能,例如Sequential及Functional API等,實際上,有很多Keras的開源工具及專案使用Tensorflow作為Keras backend,若是此種狀況就會發生錯誤無法透過plaidml執行GPU加速了。例如下方的error message,就是僅支援Tensorflow而無法使用PlaidML backend的例子:

Using plaidml.keras.backend backend.

Traceback (most recent call last):

File "yolo_video.py", line 75, in

detect_video(YOLO(**vars(FLAGS)), FLAGS.input, FLAGS.output)

File "D:\Practices\keras-yolo3\yolo.py", line 44, in __init__

self.sess = K.get_session()

AttributeError: module 'keras.backend' has no attribute 'get_session'