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