如果您是個經費拮据的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的推論速度,下面兩張圖片為其輸出的預測結果。
搭配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'