gpu填充速率 计算_【经典回顾】Nvidia GPU 上的 CNN 计算速度变迁
筆者從 2012 年初開始接觸 GPU 編程,2014 年上半年開始接觸 Caffe,可以毫不謙虛地說是“一天天看著 Nvidia GPU 和 Caffe 長大的”。
Nvidia GPU 架構經歷了 Fermi、Kepler、Maxwell、Pascal(都是著名物理學家:特斯拉、費米、開普勒、麥克斯韋、帕斯卡、還未發布的 Volta 伏打……),硬件版本號從 1.x 到現在的 6.x,CUDA Toolkit 從 3.x 到現在 8.x,cuDNN 也從 v1 升級到 v5.1。
Caffe 也伴隨著 Nvidia GPU 硬件和軟件升級不斷調整,與時俱進,經典的 CNN 網絡 AlexNet (Caffe 重新實現的版本稱為 CaffeNet)計算速度也不斷刷新。另外,Caffe 也在努力支持新模型(VGG,GoogLeNet,ResNet……)。
本文是一篇歷史回顧文章,可能很多試驗已經不再適合讀者的環境(如果你買了 GTX 1080 、1080 Ti 或 Titan X Pascal,就不要想著安裝低于 8.0 版本的 CUDA 了,會坑)。我會做兩個試驗,分別考察軟件、硬件變遷給 CNN 計算速度帶來的影響。
兩個試驗中的 CNN 模型均使用 CaffeNet,輸入 batch size 固定為 128。模型 prototxt 文件內容如下(從 $CAFFE_ROOT/models/bvlc_reference_caffenet/deploy.prototxt 修改得到):
name: "CaffeNet"
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 128 dim: 3 dim: 227 dim: 227 } }
}
……后面內容保持不變
將上述 prototxt 文件保存為?caffenet-for-benchmark.prototxt。
運行如下命令進行 CNN 計時,可以得到 forward/backward 時間:
$ cd $CAFFE_ROOT
$ ./build/tools/caffe.bin time -model caffenet-for-benchmark.prototxt -gpu 0
本文將上述計算時間折算為每秒處理多少張圖片(images/s)。算法為:
Benchmark #1 = BatchSize * iterations / ForwardTime
Benchmark #2 = BatchSize * iterations / (ForwardTime + BackwardTime)
其中 ForwardTime、BackwardTime 單位均為秒,Caffe time 程序中 iterations 默認值為 50,因此上面公式簡化為:
Benchmark #1 = 128 * 50 / ForwardTime = 6400 /?ForwardTime
Benchmark #2 = 128 * 50 / (ForwardTime + BackwardTime) = 6400 /?(ForwardTime + BackwardTime)
【試驗 1】
第一個試驗固定使用 Tesla K40m 硬件,通過切換不同版本 CUDA 和 cuDNN 來測試 CaffeNet Forward/Backward 速度。另外提供了 Caffe Native 方法( im2col + gemm,CPU/GPU )作為 BaseLine 實現。其中 CPU 版本 Caffe 使用了 OpenBLAS-0.2.14,CPU 型號為?Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz,16 個物理核。
試驗結果如下圖所示:
具體數值如下:
【試驗 1 結論】
(1)K40m 上不使用 cuDNN 加速庫時,跑 AlexNet 前向計算可達 521 images/s,前向+反向計算約 266 images/s。(2)K40m 上使用 cuDNN 加速庫,跑 AlexNet 前向計算最高可達 > 1200 images/s,前向+反向計算最高可達 >550 images/s。
(3)K40m 上使用 cuDNN v3, v4, v5 跑 AlexNet 性能差別不大。
(4)K40m GPU 跑 AlexNet 前向計算相比 CPU E5-2650v2 速度提升了 19 ~ 45 倍,前向+反向計算速度提高了 17~36 倍。
(5)cuDNN 相比 Caffe Native GPU 實現有 1.7 ~ 2.3 倍速度提升。
(6)從 cuDNN v1 到 v5,通過純軟件優化,速度僅有 1.3 倍提升。
【注】
(1) ?K40m 時鐘默認為 745 MHz,測試出來的計算速度會比上述結果低一些,可以通過下面兩個命令(需要 root 權限執行)開啟最高運行時鐘:
$ nvidia-smi -pm 1
$ nvidia-smi -ac 3004,875
第二條命令不能隨便設置數值。不同型號 GPU 支持的運行時鐘頻率不同,讀者應查閱官方硬件管理手冊。
(2) 完成上述測試的 CUDA 版本有差異。
cuDNN v1, v2 需要 CUDA 6.5;
cuDNN v3 需要 CUDA 7.0 ;
cuDNN v4 需要 CUDA 7.5;
cuDNN v5 需要 CUDA 8.0;
GPU 驅動版本固定為 375.20,實踐證明高版本的 GPU 驅動可以支持低版本 CUDA,但反過來不一定成立。
(3) 完成上述測試的 Caffe 版本有些許不同。
cuDNN v5
https://github.com/bvlc/caffe,branch master,commit e687a71fac81718d40d4e0e98d29eab34f784b5b(20170307 版本)
cuDNN v3 & v4:
https://github.com/bvlc/caffe,branch master,commit 559758d0c5c5906633174d392b89c0a7a88dc9f9(20160302 版本)
cuDNN v2:
https://github.com/bvlc/caffe,branch master,commit de7b0bf7db0d5fb8f840e03f40e099d9eefaaacc(20150814 版本)
cuDNN v1:
https://github.com/bvlc/caffe,branch tutorial,20140909 版本。
在 Caffe 根目錄下,執行 git show 可以顯示代碼 commit 、merge、貢獻者、日期等信息。
$ git show
commit 559758d0c5c5906633174d392b89c0a7a88dc9f9
Merge: 37d1f91 666da79
Author: Jon Long
Date: Wed Mar 2 16:23:14 2016 -0800
Merge pull request #3716 from ttdt/master
Use six library to ensure pycaffe.py python3 compliance
【試驗 2 】
第二個試驗固定使用 CUDA 8.0 + cuDNN 5.1,通過切換不同硬件來測試 CaffeNet Forward/Backward 速度。測試方法與試驗 1 完全相同。
首先看下不同硬件的絕對處理能力。為了方便,我們只做 CaffeNet Forward 計算。
看到這張圖,一部分讀者估計會淚奔,辛辛苦苦在 K40m 上優化程序,速度提升了 1.x 倍,結果黃教主一發布新卡,速度提升 X 倍……
絕對性能中,P100 和 P40 遙遙領先,其架構細節可以見上一篇文章《Pascal 架構詳解》。
另外我們還要關注另一個性能指標,即每瓦的處理能力,這在一些功耗敏感的應用中頗為重要。
這張圖估計要另一部分讀者淚奔。。。一向以性能-功耗比著稱的 FPGA 廠商,要硬著頭皮研發新一代產品(Stratix 10,UltraScale+)才能趕上了。
Tesla P4 功耗僅 75 W,單精度處理能力標稱 5.5 TFLOPS, int8 計算能力更是高達 22 TFLOPS,目前可以秒殺市面上任何一款 FPGA。注意我們試驗中均使用 32 bit 浮點,筆者曾試過 int8 版本相對 32 bit 浮點版本要有至少 3.5X 加速。限于篇幅,不再展開。
【試驗 2 結論】
(1) K40m 的絕對性能,每瓦性能在本文提到的所有 Nvidia GPU 中都是墊底的。而一些論文常常先拿軟柿子捏。
(2)Maxwell 架構(M40、Titan X Maxwell)相比 Kepler 架構(K40m)絕對性能提升 2.4 倍,每瓦性能提升 2.27 倍。
(3)Pascal 架構(P40, P100)相比 Maxwell 架構(M40、Titan X Maxwell)絕對性能提升 1.5 ~ 1.6 倍,每瓦性能提升 1.6 倍。
(4)Pascal 架構的 Tesla P4 每瓦性能比同系列的 P40, P100, GTX 1080 提升 1.6 倍,是目前每瓦性能最高的處理器。如果使用 int8 數值類型進行計算,每瓦性能還有 3 倍以上提升。
下表為本文提到的所有 Nvidia GPU 硬件詳情。
值得注意的是 Tesla P100 的雙精度處理能力最強,標稱 4.7 TFLOPS,實測達到 4.6 TFLOPS 。另外支持半精度(FP16)計算,實測 FP16 計算能力為 FP32 的 1.8 倍。K40m 雙精度計算能力為 1.4 TFLOPS,僅次于 Tesla P100。其他型號 GPU 的雙精度計算能力都很弱(< 0.5 TFLOPS)。因此,K40m 也并非“一無是處”。
【寫在最后】
問題1:為什么不用 GoogLeNet 這類較新的模型?
答:因為第一個試驗中用到早期 Caffe 和 cuDNN,不支持 GoogLeNet,無法給出結果。
問題2:為什么 cuDNN 后面幾個版本在 K40m 上速度沒有改進?
答:后面幾個版本的 cuDNN 主要特性放在對新硬件架構的支持,針對舊的架構的優化可能已經停止。
問題3:為什么沒有 Titan X Pascal、GTX 1080 Ti……等 GPU 上的測試結果?
答:手頭沒有。如果有壕贊助,筆者愿意在本文中更新。也歡迎具備條件的讀者將評測結果反饋給筆者。
總結
以上是生活随笔為你收集整理的gpu填充速率 计算_【经典回顾】Nvidia GPU 上的 CNN 计算速度变迁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jekins搭建
- 下一篇: 程序员的思维修炼》读书笔记