來(lái)源:數(shù)據(jù)觀 時(shí)間:2017-01-24 09:53:47 作者:騰訊云
?由騰訊云基礎(chǔ)產(chǎn)品中心、騰訊架構(gòu)平臺(tái)部組成的騰訊云FPGA聯(lián)合團(tuán)隊(duì),在這里介紹國(guó)內(nèi)首款FPGA云服務(wù)器的工程實(shí)現(xiàn)深度學(xué)習(xí)算法(AlexNet),討論深度學(xué)習(xí)算法FPGA硬件加速平臺(tái)的架構(gòu)。
?背景是這樣的:在1 月 20 日,騰訊云推出國(guó)內(nèi)首款高性能異構(gòu)計(jì)算基礎(chǔ)設(shè)施——FPGA 云服務(wù)器,將以云服務(wù)方式將大型公司才能長(zhǎng)期支付使用的 FPGA 普及到更多企業(yè),企業(yè)只需支付相當(dāng)于通用CPU約40%的費(fèi)用,性能可提升至通用CPU服務(wù)器的30倍以上。具體分享內(nèi)容如下:
?1.綜述
?2016年3月份AI圍棋程序AlphaGo戰(zhàn)勝人類棋手李世石,點(diǎn)燃了業(yè)界對(duì)人工智能發(fā)展的熱情,人工智能成為未來(lái)的趨勢(shì)越來(lái)越接近。
?人工智能包括三個(gè)要素:算法,計(jì)算和數(shù)據(jù)。人工智能算法目前最主流的是深度學(xué)習(xí)。計(jì)算所對(duì)應(yīng)的硬件平臺(tái)有:CPU、GPU、FPGA、ASIC。由于移動(dòng)互聯(lián)網(wǎng)的到來(lái),用戶每天產(chǎn)生大量的數(shù)據(jù)被入口應(yīng)用收集:搜索、通訊。我們的QQ、微信業(yè)務(wù),用戶每天產(chǎn)生的圖片數(shù)量都是數(shù)億級(jí)別,如果我們把這些用戶產(chǎn)生的數(shù)據(jù)看成礦藏的話,計(jì)算所對(duì)應(yīng)的硬件平臺(tái)看成挖掘機(jī),挖掘機(jī)的挖掘效率就是各個(gè)計(jì)算硬件平臺(tái)對(duì)比的標(biāo)準(zhǔn)。
?最初深度學(xué)習(xí)算法的主要計(jì)算平臺(tái)是 CPU,因?yàn)?CPU 通用性好,硬件框架已經(jīng)很成熟,對(duì)于程序員來(lái)說(shuō)非常友好。然而,當(dāng)深度學(xué)習(xí)算法對(duì)運(yùn)算能力需求越來(lái)越大時(shí),人們發(fā)現(xiàn) CPU 執(zhí)行深度學(xué)習(xí)的效率并不高。CPU 為了滿足通用性,芯片面積有很大一部分都用于復(fù)雜的控制流和Cache緩存,留給運(yùn)算單元的面積并不多。這時(shí)候,GPU 進(jìn)入了深度學(xué)習(xí)研究者的視野。GPU原本的目的是圖像渲染,圖像渲染算法又因?yàn)橄袼嘏c像素之間相對(duì)獨(dú)立,GPU提供大量并行運(yùn)算單元,可以同時(shí)對(duì)很多像素進(jìn)行并行處理,而這個(gè)架構(gòu)正好能用在深度學(xué)習(xí)算法上。
?GPU 運(yùn)行深度學(xué)習(xí)算法比 CPU 快很多,但是由于高昂的價(jià)格以及超大的功耗對(duì)于給其在IDC大規(guī)模部署帶來(lái)了諸多問(wèn)題。有人就要問(wèn),如果做一個(gè)完全為深度學(xué)習(xí)設(shè)計(jì)的專用芯片(ASIC),會(huì)不會(huì)比 GPU 更有效率?事實(shí)上,要真的做一塊深度學(xué)習(xí)專用芯片面臨極大不確定性,首先為了性能必須使用最好的半導(dǎo)體制造工藝,而現(xiàn)在用最新的工藝制造芯片一次性成本就要幾百萬(wàn)美元。去除資金問(wèn)題,組織研發(fā)隊(duì)伍從頭開(kāi)始設(shè)計(jì),完整的設(shè)計(jì)周期時(shí)間往往要到一年以上,但當(dāng)前深度學(xué)習(xí)算法又在不斷的更新,設(shè)計(jì)的專用芯片架構(gòu)是否適合最新的深度學(xué)習(xí)算法,風(fēng)險(xiǎn)很大??赡苡腥藭?huì)問(wèn)Google不是做了深度學(xué)習(xí)設(shè)計(jì)的專用芯片TPU?從Google目前公布的性能功耗比提升量級(jí)(十倍以上的提升)上看,還遠(yuǎn)未達(dá)到專用處理器的提升上限,因此很可能本質(zhì)上采用是數(shù)據(jù)位寬更低的類GPU架構(gòu),可能還是具有較強(qiáng)的通用性。這幾年,F(xiàn)PGA 就吸引了大家的注意力,亞馬遜、facebook等互聯(lián)網(wǎng)公司在數(shù)據(jù)中心批量部署了FPGA來(lái)對(duì)自身的深度學(xué)習(xí)以云服務(wù)提供硬件平臺(tái)。
?FPGA 全稱「可編輯門(mén)陣列」(Field Programmable Gate Array),其基本原理是在 FPGA 芯片內(nèi)集成大量的數(shù)字電路基本門(mén)電路以及存儲(chǔ)器,而用戶可以通過(guò)燒寫(xiě) FPGA 配置文件來(lái)來(lái)定義這些門(mén)電路以及存儲(chǔ)器之間的連線。這種燒入不是一次性的,即用戶今天可以把 FPGA 配置成一個(gè)圖像編解碼器,明天可以編輯配置文件把同一個(gè) FPGA 配置成一個(gè)音頻編解碼器,這個(gè)特性可以極大地提高數(shù)據(jù)中心彈性服務(wù)能力。所以說(shuō)在 FPGA 可以快速實(shí)現(xiàn)為深度學(xué)習(xí)算法開(kāi)發(fā)的芯片架構(gòu),而且成本比設(shè)計(jì)的專用芯片(ASIC)要便宜,當(dāng)然性能也沒(méi)有專用芯片(ASIC)強(qiáng)。ASIC是一錘子買(mǎi)賣,設(shè)計(jì)出來(lái)要是發(fā)現(xiàn)哪里不對(duì)基本就沒(méi)機(jī)會(huì)改了,但是 FPGA 可以通過(guò)重新配置來(lái)不停地試錯(cuò)知道獲得最佳方案,所以用 FPGA 開(kāi)發(fā)的風(fēng)險(xiǎn)也遠(yuǎn)遠(yuǎn)小于 ASIC。
?2.Alexnet 算法分析
?2.1Alexnet模型結(jié)構(gòu)
?Alexnet模型結(jié)構(gòu)如下圖2.1所示。
圖2.1 Alexnet模型
?模型的輸入是3x224x224大小圖片,采用5(卷積層)+3(全連接層)層模型結(jié)構(gòu),部分層卷積后加入Relu,Pooling 和Normalization層,最后一層全連接層是輸出1000分類的softmax層。如表1所示,全部8層需要進(jìn)行1.45GFLOP次乘加計(jì)算,計(jì)算方法參考下文。
表2.1 Alexnet浮點(diǎn)計(jì)算量
?2.2Alexnet 卷積運(yùn)算特點(diǎn)
?Alexnet的卷積運(yùn)算是三維的,在神經(jīng)網(wǎng)絡(luò)計(jì)算公式: y=f(wx+b) 中,對(duì)于每個(gè)輸出點(diǎn)都是三維矩陣w(kernel)和x乘加后加上bias(b)得到的。如下圖2.2所示,kernel的大小M=Dxkxk,矩陣乘加運(yùn)算展開(kāi)后 y = x[0]*w[0]+ x[1]*w[1]+…+x[M-1]*w[M-1],所以三維矩陣運(yùn)算可以看成是一個(gè)1x[M-1]矩陣乘以[M-1]x1矩陣。
圖2.2 Alexnet三維卷積運(yùn)算
?每個(gè)三維矩陣kernel和NxN的平面上滑動(dòng)得到的所有矩陣X進(jìn)行y=f(wx+b)運(yùn)算后就會(huì)得到一個(gè)二維平面(feature map)如圖2.3 所示。水平和垂直方向上滑動(dòng)的次數(shù)可以由 (N+2xp-k)/s+1 得到(p為padding的大小),每次滑動(dòng)運(yùn)算后都會(huì)得到一個(gè)點(diǎn)。
?a)N是NxN平面水平或者垂直方向上的大??;
?b)K是kernel在NxN平面方向上的大小kernel_size;
?c)S是滑塊每次滑動(dòng)的步長(zhǎng)stride;
圖2.3 kernel進(jìn)行滑窗計(jì)算
?Kernel_num 個(gè) kernel 經(jīng)過(guò)運(yùn)算后就會(huì)得到一組特征圖,重新組成一個(gè)立方體,參數(shù)H = Kernel_num,如圖2.4所示。這個(gè)卷積立方體就是卷積所得到的的最終輸出結(jié)果。
圖2.4 多個(gè)kernel進(jìn)行滑窗計(jì)算得到一組特征圖
?3.AlexNet模型的FPGA實(shí)現(xiàn)
3.1 FPGA異構(gòu)平臺(tái)
?圖3.1為異構(gòu)計(jì)算平臺(tái)的原理框圖,CPU通過(guò)PCIe接口對(duì)FPGA傳送數(shù)據(jù)和指令,F(xiàn)PGA根據(jù)CPU下達(dá)的數(shù)據(jù)和指令進(jìn)行計(jì)算。在FPGA加速卡上還有DDR DRAM存儲(chǔ)資源,用于緩沖數(shù)據(jù)。
?圖3.1 FPGA異構(gòu)系統(tǒng)框圖
?3.2 CNN在FPGA的實(shí)現(xiàn)
?3.2.1 將哪些東西offload到FPGA計(jì)算?
?在實(shí)踐中并不是把所有的計(jì)算都o(jì)ffload到FPGA,而是只在FPGA中實(shí)現(xiàn)前5層卷積層,將全連接層和Softmax層交由CPU來(lái)完成,主要考慮原因:
?(1)全連接層的參數(shù)比較多,計(jì)算不夠密集,要是FPGA的計(jì)算單元發(fā)揮出最大的計(jì)算性能需要很大的DDR帶寬;
?(2)實(shí)際運(yùn)用中分類的數(shù)目是不一定的,需要對(duì)全連階層和Softmax層進(jìn)行修改,將這兩部分用軟件實(shí)現(xiàn)有利于修改。
?3.2.2 實(shí)現(xiàn)模式
?Alexnet的5個(gè)卷積層,如何分配資源去實(shí)現(xiàn)它們,主要layer并行模式和layer串行模式:
?(1)Layer并行模式:如圖3.2所示,按照每個(gè)layer的計(jì)算量分配不同的硬件資源,在FPGA內(nèi)同時(shí)完成所有l(wèi)ayer的計(jì)算,計(jì)算完成之后將計(jì)算結(jié)果返回CPU。優(yōu)點(diǎn)是所有的計(jì)算在FPGA中一次完成,不需要再FPGA和DDR DRAM直接來(lái)回讀寫(xiě)中間結(jié)果,節(jié)省了的DDR帶寬。缺點(diǎn)就是不同layer使用的資源比較難平衡,且layer之間的數(shù)據(jù)在FPGA內(nèi)部進(jìn)行緩沖和格式調(diào)整也比較難。另外,這種模式當(dāng)模型參數(shù)稍微調(diào)整一下(比如說(shuō)層數(shù)增加)就能重新設(shè)計(jì),靈活性較差。
圖3.2 layer并行模式下資源和時(shí)間分配示意圖
?(2)Layer串行模式:如圖3.3所示,在FPGA中只實(shí)現(xiàn)完成單個(gè)layer的實(shí)現(xiàn),不同layer通過(guò)時(shí)間上的復(fù)用來(lái)完成。優(yōu)點(diǎn)是在實(shí)現(xiàn)時(shí)只要考慮一層的實(shí)現(xiàn),數(shù)據(jù)都是從DDR讀出,計(jì)算結(jié)果都寫(xiě)回DDR,數(shù)據(jù)控制比較簡(jiǎn)單。缺點(diǎn)就是因?yàn)橹虚g結(jié)果需要存儲(chǔ)在DDR中,提高了對(duì)DDR帶寬的要求。
圖3.3 layer并行模式下資源和時(shí)間分配示意圖
?我們的設(shè)計(jì)采用了是Layer串行的模式,數(shù)據(jù)在CPU、FPGA和DDR直接的交互過(guò)程如圖3.4所示。
圖3.4 計(jì)算流程圖
?3.2.3 計(jì)算單個(gè)Layer的PM(Processing Module)設(shè)計(jì)
?如圖3.5所示,數(shù)據(jù)處理過(guò)程如下,所有過(guò)程都流水線進(jìn)行:
?(1)Kernel和Data通過(guò)兩個(gè)獨(dú)立通道加載到CONV模塊中;
?(2)CONV完成計(jì)算,并將結(jié)果存在Reduce RAM中;
?(3)(可選)如果當(dāng)前l(fā)ayer需要做ReLU/Norm,將ReLU/Norm做完之后寫(xiě)回Reduce RAM中;
?(4)(可選)如果當(dāng)前l(fā)ayer需要做Max Pooling,將Max做完之后寫(xiě)回Reduce RAM中;
?(5)將計(jì)算結(jié)果進(jìn)行格式重排之后寫(xiě)回DDR中。
圖3.5 Processing Module的結(jié)構(gòu)框圖
?3.2.4 CONV模塊的設(shè)計(jì)
?在整個(gè)PM模塊中,最主要的模塊是CONV模塊,CONV模塊完成數(shù)據(jù)的卷積。
?由圖3.6所示,卷積計(jì)算可以分解成兩個(gè)過(guò)程:kernel及Data的展開(kāi)和矩陣乘法。
?Kernel可以預(yù)先將展開(kāi)好的數(shù)據(jù)存在DDR中,因此不需要在FPGA內(nèi)再對(duì)Kernel進(jìn)行展開(kāi)。Data展開(kāi)模塊,主要是將輸入的feature map按照kernel的大小展開(kāi)成可以同kernel進(jìn)行求內(nèi)積計(jì)算的矩陣。數(shù)據(jù)展開(kāi)模塊的設(shè)計(jì)非常重要,不僅要減小從DDR讀取數(shù)據(jù)的數(shù)據(jù)量以減小DDR帶寬的要求,還要保證每次從DDR讀取數(shù)據(jù)時(shí)讀取的數(shù)據(jù)為地址連續(xù)的大段數(shù)據(jù),以提高DDR帶寬的讀取效率。
圖3.6 卷積過(guò)程示意圖
?圖3.7為矩陣乘法的實(shí)現(xiàn)結(jié)構(gòu),通過(guò)串聯(lián)乘加器來(lái)實(shí)現(xiàn),一個(gè)周期可以完成一次兩個(gè)向量的內(nèi)積,通過(guò)更新端口上的數(shù)據(jù),可以實(shí)現(xiàn)矩陣乘法。
圖3.7 矩陣乘法實(shí)現(xiàn)結(jié)構(gòu)
?展開(kāi)后的矩陣比較大,F(xiàn)PGA因?yàn)橘Y源結(jié)構(gòu)的限制,無(wú)法一次完成那么的向量?jī)?nèi)積,因此要將大矩陣的乘法劃分成幾個(gè)小矩陣的乘加運(yùn)算。拆分過(guò)程如圖3.8所示。
?假設(shè)大矩陣乘法為O= X*W,其中,輸入矩陣X為M*K個(gè)元素的矩陣;權(quán)重矩陣W為K*P個(gè)元素的矩陣;偏置矩陣O為M*P個(gè)元素的矩陣;
圖3.8 大矩陣乘法的拆分過(guò)程
?R = K/L,如果不能整除輸入矩陣,權(quán)重矩陣和偏置通過(guò)補(bǔ)零的方式將矩陣處理成可以整除;
?S = P/Q,如果不能整除將權(quán)重矩陣和偏置矩陣通過(guò)補(bǔ)零的方式將矩陣處理成可以整除;
?3.2.5實(shí)現(xiàn)過(guò)程的關(guān)鍵點(diǎn)
?(1)決定系統(tǒng)性能的主要因素有:DSP計(jì)算能力,帶寬和片內(nèi)存儲(chǔ)資源。好的設(shè)計(jì)是將這三者達(dá)到一個(gè)比較好的平衡。參考文獻(xiàn)[2]開(kāi)發(fā)了roofline性能模型來(lái)將系統(tǒng)性能同片外存儲(chǔ)帶寬、峰值計(jì)算性能相關(guān)聯(lián)。
?(2)為了達(dá)到最好的計(jì)算性能就是要盡可能地讓FPGA內(nèi)的在每一個(gè)時(shí)鐘周期都進(jìn)行有效地工作。為了達(dá)到這個(gè)目標(biāo),CONV模塊和后面的ReLU/Norm/Pooling必須能異步流水線進(jìn)行。Kernel的存儲(chǔ)也要有兩個(gè)存儲(chǔ)空間,能對(duì)系數(shù)進(jìn)行乒乓加載。另外,由于計(jì)算是下一層的輸入依賴于上一層的輸出,而數(shù)據(jù)計(jì)算完成寫(xiě)回DDR時(shí)需要一定時(shí)間,依次應(yīng)該通過(guò)交疊計(jì)算兩張圖片的方式(Batch=2)將這段時(shí)間通過(guò)流水迭掉。
?(3)要選擇合適的架構(gòu),是計(jì)算過(guò)程中Data和Kernel只要從DDR讀取一次,否則對(duì)DDR帶寬的要求會(huì)提高。
?3.3 性能及效益
?如圖3.9所示采用FPGA異構(gòu)計(jì)算之后,F(xiàn)PGA異構(gòu)平臺(tái)處理性能是純CPU計(jì)算的性能4倍,而TCO成本只是純CPU計(jì)算的三分之一。本方案對(duì)比中CPU為2顆E5-2620,F(xiàn)PGA為Virtex-7 VX690T,這是一個(gè)28nm器件,如果采用20nm或16nm的器件會(huì)得到更好的性能。
圖 3.9 計(jì)算性能對(duì)比
圖 3.10 歸一化單位成本對(duì)比
?圖3.11為實(shí)際業(yè)務(wù)中利用FPGA進(jìn)行加速的情況,由圖中數(shù)據(jù)可知FPGA加速可以有效降低成本。
圖3.11 某實(shí)際業(yè)務(wù)中的性能和成本對(duì)比
?參考文獻(xiàn)
?[1] Alex Krizhevsky. ImageNet Classification with Deep Convolutional Neural Networks
?[2] C. Zhang, et al. Optimizing FPGA-based accelerator design for deep convolutional neural networks. In ACM ISFPGA 2015.
?[3] P Gysel, M Motamedi, S Ghiasi. Hardware-oriented Approximation of Convolutional Neural Networks. 2016.
?[4] Song Han,Huizi Mao,William J. Dally.DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING. Conference paper at ICLR,2016
?點(diǎn)擊進(jìn)入 騰訊云 在數(shù)據(jù)觀的企業(yè)欄目>>>
?
責(zé)任編輯:陳近梅