想知道深度学习卷积在GPU上如何优化吗?“大神”赵开勇带你深入浅出
想知道深度學習卷積在GPU上如何優化嗎?“大神”趙開勇帶你深入淺出
2016-08-19 11:54 轉載 陳楊英杰 0條評論雷鋒網(搜索“雷鋒網”公眾號關注)按:?本文轉載自英偉達NVIDIA企業解決方案公眾號。趙開勇,香港浸會大學計算機系異構計算實驗室PhD Candidate,長期從事高性能計算領域研究,在CPU、GPU異構計算方面有多年的研究經驗。趙開勇先生組織參與多個科研單位和高性能用戶的高性能項目研發,曾擔任浪潮GPU高性能計算顧問,曾多次擔任NVidia中國CUDA比賽評委。他還曾經組織出版《GPU高性能運算之CUDA》,翻譯《大規模并行處理器編程實戰》第二版。國內最早推廣GPU高性能計算的研究者之一。
提到人工智能領域,現在最熱的詞之一就是深度學習Deep Learning(下文簡稱DL)。近年來,深度學習成為了學術界乃至整個工業領域視覺計算方面的絕對主流。除了傳統的計算機幾何處理、專業渲染、醫療、生命科學、能源、金融服務、汽車、制造業以及娛樂業紛紛著力深度學習應用和技術優化,避免在企業競爭中失利。在群雄逐鹿的技術比拼中,GPU扮演著至關重要的角色,與其相關的技術優化也是研發人員關注的焦點之一。
“深度學習技術已經可以用于解決實際的問題,而不是停留在Demo演示階段”
如微軟的語音翻譯、Google的貓識別,再到最近很火的人臉識別,還有自動駕駛等等,這些都是深度學習的典型應用。Alibaba、Baidu、Facebook、Google、IBM等大公司都在DL方面有很大的投入。這里必須強調一句,目前很多主流的DL框架和算法基本上都是華人主導開發的,DL的復興,離不開華人研究者。
“在進行深度學習訓練之前,你需要考慮的兩件事”
一個是軟件框架,例如Caffe,Tensorflow,Mxnet等等。
另一個就是硬件。硬件方面,目前有多種異構形式,cpu,fpga,dsp等等,但是最主流的還是GPU,真正能在DL當中快速形成戰斗力的也是CUDA硬件(NVIDIA GPU)+CUDA的DL學習軟件(cuDNN),這也是NVIDIA多年研發與培育的結果。
工欲善其事,必先利其器
現在主流的DL開發訓練平臺一般都用NVIDIA的顯卡,比如NVIDIA TITAN系列就是非常好的工具。為了加快訓練速度,一般選擇在配備多個GPU的高性能計算機或集群上面進行訓練,訓練好的網絡也很容易移植到采用NVIDIA Tegra處理器的嵌入式平臺上面,如NVIDIA Jetson TX1,它們擁有相同的架構,所以移植起來會非常方便。?
Jetson TX1基于NVIDIA Tegra X1處理器打造,它采用和超級計算機完全相同的Maxwell架構256核心GPU,可提供高達1T-Flops的計算性能并完整支持CUDA(Compute Unified Device Architecture)技術,配合預裝的開發工具,非常適合基于深度學習的智慧型嵌入式設備的打造。前不久就有用戶通過配備Tegra處理器的Jetson平臺,檢測自家花園是否有小貓闖入。
重頭戲:卷積神經網絡CNN算法優化
檢測小貓闖入花園的視頻紅遍網絡,這一應用就用到了卷積神經網絡(Convolutional Neural Network,簡稱CNN)的分類,在臺式機或者集群上學習,然后porting(移植)到Tegra上,CNN算法起了關鍵作用。而CNN最關鍵的部分就是卷積層。在圖像識別,圖像分類領域來講大多數問題之所以CNN能起作用,關鍵就是卷積。它從兩個方面演變而來,一個是聲音處理的延時網絡,一個是圖像處理的特征點提取算法。對后者而言,卷積就是對圖像做濾波,簡單說,就是做一些特征值提取。常見的有sobel做邊緣提取,還有hog,高斯濾波等等,這些都是二維卷積。
卷積形狀優化
雖然現在大家做卷積都是方塊的,但其實這只是定義,你完全可以不遵循這個標準,可以用其他的形狀來代替卷積,去更好的適應你的運算方式,尤其是卷積核心比較大的時候,這也是對卷積做出優化的一種方式。?一般來說,目前比較流行的CNN網絡,卷積部分會占用70%以上的計算時間,優化卷積部分就是很有必要的。你需要從算法角度、并行化角度,以及GPU硬件特性等諸多方面做出考量。?GPU本身是一種可編程的并行計算架構,它有很多很好的算法,同時NVIDIA也提供了相應的工具,幫你去進行優化。
卷積優化的基本思路
1. ? 計算并行
2.?? 數據并行
3.?? 并行的粒度
4.?? 空間換時間
5.?? IO和計算疊加
6.?? 更多的利用高效的緩存空間
7.?? 針對硬件的并行特性,更高效率的利用網絡并發型
用內存來換時間
如果深度學習DL中每一層的卷積都是針對同一張圖片,那么所有的卷積核可以一起對這張圖片進行卷積運算,然后再分別存儲到不同的位置,這就可以增加內存的使用率,一次加載圖片,產生多次的數據,而不需要多次訪問圖片,這就是用內存來換時間。
乘法優化
卷積是對一個小區域做的乘法,然后再做加法,這在并行計算領域是非常成熟的。
以上圖為例,左邊是一張圖片,右邊是卷積核。我們可以把卷積核心展開成一條行,然后多個卷積核就可以排列成多行,再把圖像也用類似的方法展開,就可以把一個卷積問題轉換成乘法問題。這樣就是一行乘以一列,就是一個結果了。這樣雖然多做了一些展開的操作,但是對于計算來講,速度會提升很多。
GPU優化的幾個思路
了解IO訪問的情況以及IO的性能;
多線程的并行計算特性;
IO和并行計算間的計算時間重疊
對于NVIDIA的GPU來講,內存訪問是有一些特性的,連續合并訪問可以很好地利用硬件的帶寬。你可以看到,NVIDIA最新架構的GPU,其核心數目可能并沒有明顯增加,架構似乎也沒有太大變化,但在幾個計算流處理器中間增加緩存,就提高了很大的性能,為IO訪問這塊兒帶來了很大優化。
上面是一張比較經典的內存和線程模型,shared memory和registers是訪問速度最快的內存,內存的訪問跟計算比起來,太慢了,所以盡量把多的數據都放到高速的緩存里面。
矩陣優化的幾個思路
從計算角度出發
從結果出發
以上面這張圖為例,當我們從C矩陣的結果出發,每一個C需要A的一行和B的一列來進行計算,利用GPU的特性,我們可以把零時的結果存儲在registers面,那我們就可以劃分64x2個線程,來作為計算線程。
在C的影印部分,可以有64×2這么多個線程在一次訪問,就可以存儲64×2個數據。你可以讓64×2個線程每一個線程都存儲16個或者32個數據,那么,我們就可以用64×2個線程存儲64×2×16(32)個數據。?這么多個數據都可以一次存儲在最快的內存里面,多次讀寫的時候,速度就可以很快。同時,我們在考慮對A和B矩陣的訪問,可以把B矩陣的相應的數據,大量的放到shared memory里面,這樣就提高了shared memory的公用性。這樣,整個A×B再根據這些線程可以在讀取globalmemory( A矩陣)的時候,可以合并訪問,可以按照每一排32、32的讀取,可以加快合并訪問=C。這樣就把整個矩陣優化的思路整理出來了。
以上就是針對深度學習卷積在GPU、乃至Jetson TX1平臺上的一些優化思路。
總結
以上是生活随笔為你收集整理的想知道深度学习卷积在GPU上如何优化吗?“大神”赵开勇带你深入浅出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VR是一场“大骗局”, 另一种声音
- 下一篇: 卷积神经网络(CNN)新手指南 1