本發(fā)明總體上涉及人工神經(jīng)網(wǎng)絡,具體地涉及一種用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置和方法。
背景技術(shù):
卷積神經(jīng)網(wǎng)絡是近年來廣泛應用于模式識別、圖像處理等領(lǐng)域的一種高效識別算法,它具有結(jié)構(gòu)簡單、訓練參數(shù)少和適應性強、平移、旋轉(zhuǎn)、縮放等特點。由于cnn/dnn的特征檢測層通過訓練數(shù)據(jù)進行學習,所以在使用cnn/dnn時,避免了顯示的特征抽取,而隱式地從訓練數(shù)據(jù)中進行學習;再者由于同一特征映射面上的神經(jīng)元權(quán)值相同,所以網(wǎng)絡可以并行學習,這也是卷積網(wǎng)絡相對于神經(jīng)元彼此相連網(wǎng)絡的一大優(yōu)勢。
在已有的計算機領(lǐng)域應用中,與卷積運算相關(guān)的應用十分普遍。本發(fā)明專注于卷積神經(jīng)網(wǎng)絡,目前可以執(zhí)行此種運算的主流裝置如下:
在現(xiàn)有技術(shù)中,一種進行卷積神經(jīng)網(wǎng)絡運算的已知方案是使用通用處理器,該方法通過通用寄存器堆和通用功能部件來執(zhí)行通用指令,從而執(zhí)行卷積神經(jīng)網(wǎng)絡運算。然而,該方法的缺點之一是單個通用處理器多用于標量計算,在進行卷積神經(jīng)網(wǎng)絡運算時運算性能較低。而使用多個通用處理器并行執(zhí)行時,通用處理器之間的相互通訊又有可能成為性能瓶頸。
在另一種現(xiàn)有技術(shù)中,使用圖形處理器(gpu)來進行向量計算,其中,通過使用通用寄存器堆和通用流處理單元執(zhí)行通用simd指令來進行卷積神經(jīng)網(wǎng)絡運算。然而,上述方案中,gpu片上緩存太小,在進行大規(guī)模卷積神經(jīng)網(wǎng)絡運算時需要不斷進行片外數(shù)據(jù)搬運,片外帶寬成為了主要性能瓶頸。
技術(shù)實現(xiàn)要素:
(一)要解決的技術(shù)問題
本發(fā)明的目的在于,提供一種支持卷積神經(jīng)網(wǎng)絡的裝置,解決現(xiàn)有技術(shù)中存在的受限于片間通訊、片上緩存不夠等問題。
(二)技術(shù)方案
本發(fā)明的一個方面提供了一種用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置,包括指令存儲單元、控制器單元、數(shù)據(jù)訪問單元、互連模塊、主運算模塊、以及多個從運算模塊,其中:
指令存儲單元通過數(shù)據(jù)訪問單元讀入指令并存儲讀入的指令;
控制器單元從指令存儲單元中讀取指令,將指令譯成控制其他模塊行為的控制信號,所述其他模塊包括數(shù)據(jù)訪問單元、主運算模塊和所述多個從運算模塊;
數(shù)據(jù)訪問單元執(zhí)行外部地址空間與所述裝置之間的數(shù)據(jù)或指令讀寫操作;
從運算模塊用于實現(xiàn)卷積神經(jīng)網(wǎng)絡算法中的輸入數(shù)據(jù)和卷積核的卷積運算;
互連模塊用于所述主運算模塊和所述從運算模塊之間的數(shù)據(jù)傳輸,在神經(jīng)網(wǎng)絡全連接層正向運算開始之前,主運算模塊通過互連模塊將輸入數(shù)據(jù)輸送到每一個從運算模塊,在從運算模塊的計算過程結(jié)束后,互連模塊逐級將各從運算模塊的輸出標量拼成中間向量,輸送回主運算模塊;
主運算模塊將所有輸入數(shù)據(jù)的中間向量拼接成中間結(jié)果,并對所述中間結(jié)果執(zhí)行后續(xù)運算。
本發(fā)明的另一方面提供了一種使用上述裝置執(zhí)行單層人工神經(jīng)網(wǎng)絡卷積層正向運算的方法。
本發(fā)明的另一方面提供了一種使用上述裝置執(zhí)行多層人工神經(jīng)網(wǎng)絡卷積層正向運算的方法。
(三)有益效果
本發(fā)明提供的卷積神經(jīng)網(wǎng)絡運算裝置及配套指令,將參與計算的輸入數(shù)據(jù)和卷積核暫存在高速暫存存儲器上(scratchpadmemory)。在僅發(fā)送同一條指令的情況下,卷積神經(jīng)網(wǎng)絡運算單元中可以更加靈活有效地支持不同寬度的數(shù)據(jù),并可以解決數(shù)據(jù)存儲中的相關(guān)性問題,從而提升了包含大量卷積神經(jīng)網(wǎng)絡計算任務的執(zhí)行性能,本發(fā)明采用的指令具有精簡的格 式,使得指令集使用方便、支持的向量長度靈活。
本發(fā)明可以應用于以下(包括但不限于)場景中:數(shù)據(jù)處理、機器人、電腦、打印機、掃描儀、電話、平板電腦、智能終端、手機、行車記錄儀、導航儀、傳感器、攝像頭、云端服務器、相機、攝像機、投影儀、手表、耳機、移動存儲、可穿戴設(shè)備等各類電子產(chǎn)品;飛機、輪船、車輛等各類交通工具;電視、空調(diào)、微波爐、冰箱、電飯煲、加濕器、洗衣機、電燈、燃氣灶、油煙機等各類家用電器;以及包括核磁共振儀、b超、心電圖儀等各類醫(yī)療設(shè)備。
附圖說明
圖1是卷積神經(jīng)網(wǎng)絡算法的示意流程圖。
圖2是根據(jù)本發(fā)明實施例的支持卷積神經(jīng)網(wǎng)絡正向運算的裝置的指令示意圖。
圖3示出了根據(jù)本發(fā)明實施例的用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置的整體結(jié)構(gòu)的示例框圖。
圖4示意性示出了根據(jù)本發(fā)明實施例的用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置中h樹模塊(互連模塊一種實現(xiàn)方式)的結(jié)構(gòu)。
圖5示出了根據(jù)本發(fā)明實施例的用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置中主運算模塊結(jié)構(gòu)的示例框圖。
圖6示出了根據(jù)本發(fā)明實施例的用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置中從運算模塊結(jié)構(gòu)的示例框圖。
圖7示出了根據(jù)本發(fā)明實施例的單層卷積神經(jīng)網(wǎng)絡正向運算過程的示例框圖。
具體實施方式
本發(fā)明提供一種卷積神經(jīng)網(wǎng)絡計算裝置及配套指令集,包括存儲單元、寄存器單元和卷積神經(jīng)網(wǎng)絡運算單元,存儲單元中存儲有輸入輸出數(shù)據(jù)和卷積核,寄存器單元中存儲有輸入輸出數(shù)據(jù)和卷積核存儲的地址,卷積神經(jīng)網(wǎng)絡運算單元根據(jù)卷積神經(jīng)網(wǎng)絡運算指令在寄存器單元中獲取數(shù)據(jù)地址,然后,根據(jù)該數(shù)據(jù)地址在存儲單元中獲取相應的輸入數(shù)據(jù)和卷積 核,接著,根據(jù)獲取的輸入數(shù)據(jù)和卷積核進行卷積神經(jīng)網(wǎng)絡運算,得到卷積神經(jīng)網(wǎng)絡運算結(jié)果。本發(fā)明將參與計算的輸入數(shù)據(jù)和卷積核暫存在外部存儲空間(例如,高速暫存存儲器)上,使得卷積神經(jīng)網(wǎng)絡運算過程中可以更加靈活有效地支持不同寬度的數(shù)據(jù),提升包含大量卷積神經(jīng)網(wǎng)絡計算任務的執(zhí)行性能。
圖1為卷積神經(jīng)網(wǎng)絡算法示意圖,如圖1所示,卷積神經(jīng)網(wǎng)絡包括輸出數(shù)據(jù)及激活函數(shù),輸入數(shù)據(jù)層,和卷積核。
首先,其每一次的計算過程,首先需要依據(jù)卷積窗口,選取出輸入數(shù)據(jù)層中對應的輸入數(shù)據(jù)xi,然后將輸入數(shù)據(jù)和卷積核進行加和運算。其輸出數(shù)據(jù)的計算過程為s=s(∑wxi+b),即將卷積核w乘以輸入數(shù)據(jù)xi,進行求和,然后加上偏置b后做激活運算s(h),得到最終的輸出數(shù)據(jù)s。其中,卷積核和輸入數(shù)據(jù)的乘法是向量乘法。
卷積窗口依據(jù)卷積核在x軸上的大小kx和在y軸上的大小ky,在x軸尺寸為w和y軸尺寸為h的輸入數(shù)據(jù)上,從最開始選取出和卷積核同樣大小的輸入數(shù)據(jù),然后依據(jù)卷積窗口的平移位矢sx和sy,以此先作水平平移,然后再做垂直平移,將全部輸入數(shù)據(jù)做遍歷。
圖2是根據(jù)本發(fā)明實施例的指令集的格式示意圖,如圖2所示,卷積神經(jīng)網(wǎng)絡運算指令包括至少1個操作碼和至少1個操作域,其中,操作碼用于指示該卷積神經(jīng)網(wǎng)絡運算指令的功能,卷積神經(jīng)網(wǎng)絡運算單元通過識別該操作碼可進行卷積神經(jīng)網(wǎng)絡運算,操作域用于指示該卷積神經(jīng)網(wǎng)絡運算指令的數(shù)據(jù)信息,其中,數(shù)據(jù)信息可以是立即數(shù)或寄存器號,包括輸入數(shù)據(jù)的起始地址和數(shù)據(jù)長度,卷積核的起始地址和數(shù)據(jù)長度,以及激活函數(shù)的類型。
指令集包含有不同功能的卷積神經(jīng)網(wǎng)絡compute指令以及config指令、io指令、nop指令、jump指令和move指令。在一種實施例中,compute指令包括:
卷積神經(jīng)網(wǎng)絡sigmoid指令,根據(jù)該指令,裝置分別從高速暫存存儲器的指定地址取出指定大小的輸入數(shù)據(jù)和卷積核,在卷積運算部件中做卷積操作,然后將輸出結(jié)果做sigmoid激活;
卷積神經(jīng)網(wǎng)絡tanh指令,根據(jù)該指令,裝置分別從高速暫存存儲器 的指定地址取出指定大小的輸入數(shù)據(jù)和卷積核,在卷積運算部件中做卷積操作,然后將輸出結(jié)果做tanh激活;
卷積神經(jīng)網(wǎng)絡relu指令,根據(jù)該指令,裝置分別從高速暫存存儲器的指定地址取出指定大小的輸入數(shù)據(jù)和卷積核,在卷積運算部件中做卷積操作,然后將輸出結(jié)果做relu激活;以及
卷積神經(jīng)網(wǎng)絡group指令,根據(jù)該指令,裝置分別從高速暫存存儲器的指定地址取出指定大小的輸入數(shù)據(jù)和卷積核,劃分group之后,在卷積運算部件中做卷積操作,然后將輸出結(jié)果做激活。
compute指令也可以包括其他的運算指令,進行非線性激活和線性激活操作。
config指令在每層人工神經(jīng)網(wǎng)絡計算開始前配置當前層計算需要的各種常數(shù)。
io指令實現(xiàn)從外部存儲空間讀入計算需要的輸入數(shù)據(jù)以及在計算完成后將數(shù)據(jù)存回至外部空間。
nop指令負責清空當前裝置內(nèi)部所有控制信號緩存隊列中的控制信號,保證nop指令之前的所有指令全部指令完畢。nop指令本身不包含任何操作;
jump指令負責控制將要從指令存儲單元讀取的下一條指令地址的跳轉(zhuǎn),用來實現(xiàn)控制流的跳轉(zhuǎn);
move指令負責將裝置內(nèi)部地址空間某一地址的數(shù)據(jù)搬運至裝置內(nèi)部地址空間的另一地址,該過程獨立于運算單元,在執(zhí)行過程中不占用運算單元的資源。
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚明白,以下結(jié)合具體實施例,并參照附圖,對本發(fā)明進一步詳細說明。
圖3是本發(fā)明實施例提供的卷積神經(jīng)網(wǎng)絡正向運算裝置的結(jié)構(gòu)示意圖。如圖3所示,該裝置包括指令存儲單元1、控制器單元2、數(shù)據(jù)訪問單元3、互連模塊4、主運算模塊5和多個從運算模塊6。指令存儲單元1、控制器單元2、數(shù)據(jù)訪問單元3、互連模塊4、主運算模塊5和從運算模塊6均可以通過硬件電路(例如包括但不限于fpga、cgra、專用集成電路asic、模擬電路和憶阻器等)實現(xiàn)。
指令存儲單元1通過數(shù)據(jù)訪問單元3讀入指令并存儲讀入的指令。
控制器單元2從指令存儲單元1中讀取指令,將指令譯成控制其他模塊行為的控制信號并發(fā)送給其他模塊如數(shù)據(jù)訪問單元3、主運算模塊5和從運算模塊6等。
數(shù)據(jù)訪問單元3能夠訪問外部地址空間,直接向裝置內(nèi)部的各個存儲單元讀寫數(shù)據(jù),完成數(shù)據(jù)的加載和存儲。
互連模塊4用于連接主運算模塊和從運算模塊,可以實現(xiàn)成不同的互連拓撲(如樹狀結(jié)構(gòu)、環(huán)狀結(jié)構(gòu)、網(wǎng)格狀結(jié)構(gòu)、分級互連,總線結(jié)構(gòu)等)。
圖4示意性示出了互連模塊4的一種實施方式:h樹模塊?;ミB模塊4構(gòu)成主運算模塊5和多個從運算模塊6之間的數(shù)據(jù)通路,是由多個節(jié)點構(gòu)成的二叉樹通路,每個節(jié)點將上游的數(shù)據(jù)同樣地發(fā)給下游的兩個節(jié)點,將下游的兩個節(jié)點返回的數(shù)據(jù)進行合并,并返回給上游的節(jié)點。例如,在卷積神經(jīng)網(wǎng)絡開始計算階段,主運算模塊5內(nèi)的神經(jīng)元數(shù)據(jù)通過互連模塊4發(fā)送給各個從運算模塊6;當從運算模塊6的計算過程完成后,當從運算模塊的計算過程完成后,每個從運算模塊輸出的神經(jīng)元的值會在互連模塊中逐級拼成一個完整的由神經(jīng)元組成的向量。舉例說明,假設(shè)裝置中共有n個從運算模塊,則輸入數(shù)據(jù)xi被發(fā)送到n個從運算模塊,每個從運算模塊將輸入數(shù)據(jù)xi與該從運算模塊相應的卷積核做卷積運算,得到一標量數(shù)據(jù),各從運算模塊的標量數(shù)據(jù)被互連模塊4合并成一個含有n個元素的中間向量。假設(shè)卷積窗口總共遍歷得到a*b個(x方向為a個,y方向為b個,x、y為三維正交坐標系的坐標軸)輸入數(shù)據(jù)xi,則對a*b個xi執(zhí)行上述卷積操作,得到的所有向量在主運算模塊中合并得到a*b*n的三維中間結(jié)果。
圖5示出了根據(jù)本發(fā)明實施例的用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置中主運算模塊5的結(jié)構(gòu)的示例框圖。如圖5所示,主運算模塊5包括第一運算單元51、第一數(shù)據(jù)依賴關(guān)系判定單元52和第一存儲單元53。
其中,第一運算單元51包括向量加法單元511以及激活單元512。第一運算單元51接收來自控制器單元的控制信號,完成主運算模塊5的各種運算功能,向量加法單元511用于實現(xiàn)卷積神經(jīng)網(wǎng)絡正向計算中的加偏置操作,該部件將偏置數(shù)據(jù)與所述中間結(jié)果對位相加得到偏置結(jié)果,激活 運算單元512對偏置結(jié)果執(zhí)行激活函數(shù)操作。所述偏置數(shù)據(jù)可以是從外部地址空間讀入的,也可以是存儲在本地的。
第一數(shù)據(jù)依賴關(guān)系判定單元52是第一運算單元51讀寫第一存儲單元53的端口,保證第一存儲單元53中數(shù)據(jù)的讀寫一致性。同時,第一數(shù)據(jù)依賴關(guān)系判定單元52也負責將從第一存儲單元53讀取的數(shù)據(jù)通過互連模塊4發(fā)送給從運算模塊,而從運算模塊6的輸出數(shù)據(jù)通過互連模塊4直接發(fā)送給第一運算單元51??刂破鲉卧?輸出的指令發(fā)送給計算單元51和第一數(shù)據(jù)依賴關(guān)系判定單元52,來控制其行為。
存儲單元53用于緩存主運算模塊5在計算過程中用到的輸入數(shù)據(jù)和輸出數(shù)據(jù)。
圖6示出了根據(jù)本發(fā)明實施例的用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置中從運算模塊6的結(jié)構(gòu)的示例框圖。如圖4所示,每個從運算模塊6包括第二運算單元61、數(shù)據(jù)依賴關(guān)系判定單元62、第二存儲單元63和第三存儲單元64。
第二運算單元61接收控制器單元2發(fā)出的控制信號并進行卷積運算。第二運算單元包括向量乘單元611和累加單元612,分別負責卷積運算中的向量乘運算和累加運算。
第二數(shù)據(jù)依賴關(guān)系判定單元62負責計算過程中對第二存儲單元63的讀寫操作。第二數(shù)據(jù)依賴關(guān)系判定單元62執(zhí)行讀寫操作之前會首先保證指令之間所用的數(shù)據(jù)不存在讀寫一致性沖突。例如,所有發(fā)往數(shù)據(jù)依賴關(guān)系單元62的控制信號都會被存入數(shù)據(jù)依賴關(guān)系單元62內(nèi)部的指令隊列里,在該隊列中,讀指令的讀取數(shù)據(jù)的范圍如果與隊列位置靠前的寫指令寫數(shù)據(jù)的范圍發(fā)生沖突,則該指令必須等到所依賴的寫指令被執(zhí)行后才能夠執(zhí)行。
第二存儲單元63緩存該從運算模塊6的輸入數(shù)據(jù)和輸出標量數(shù)據(jù)。
第三存儲單元64緩存該從運算模塊6在計算過程中需要的卷積核數(shù)據(jù)。
圖7是本發(fā)明實施例提供的卷積神經(jīng)網(wǎng)絡運算裝置執(zhí)行卷積神經(jīng)網(wǎng)絡的流程圖,如圖7所示,執(zhí)行卷積神經(jīng)網(wǎng)絡指令的過程包括:
在步驟s1,在指令存儲單元1的首地址處預先存入一條io指令。
在步驟s2,運算開始,控制器單元2從指令存儲單元1的首地址讀取該條io指令,根據(jù)譯出的控制信號,數(shù)據(jù)訪問單元3從外部地址空間讀取相應的所有卷積神經(jīng)網(wǎng)絡運算指令,并將其緩存在指令存儲單元1中。
在步驟s3,控制器單元2接著從指令存儲單元讀入下一條io指令,根據(jù)譯出的控制信號,數(shù)據(jù)訪問單元3從外部地址空間讀取主運算模塊5需要的所有數(shù)據(jù)(例如,包括輸入數(shù)據(jù)、用于作快速的激活函數(shù)運算的插值表、用于配置運算器件參數(shù)的常數(shù)表、偏置數(shù)據(jù)等)至主運算模塊5的第一存儲單元53。
在步驟s4,控制器單元2接著從指令存儲單元讀入下一條io指令,根據(jù)譯出的控制信號,數(shù)據(jù)訪問單元3從外部地址空間讀取從運算模塊6需要的卷積核數(shù)據(jù)。
在步驟s5,控制器單元2接著從指令存儲單元讀入下一條config指令,根據(jù)譯出的控制信號,裝置配置該層神經(jīng)網(wǎng)絡計算需要的各種常數(shù)。例如,第一運算單元51、第二運算單元61根據(jù)控制信號里的參數(shù)配置單元內(nèi)部寄存器的值,所述參數(shù)包括例如激活函數(shù)需要的數(shù)據(jù)。
在步驟s6,控制器單元2接著從指令存儲單元讀入下一條compute指令,根據(jù)譯出的控制信號,主運算模塊5首先通過互連模塊4將卷積窗口內(nèi)的輸入數(shù)據(jù)發(fā)給各從運算模塊6,保存至從運算模塊6的第二存儲單元63,之后,再依據(jù)指令移動卷積窗口。
在步驟s7,根據(jù)compute指令譯出的控制信號,從運算模塊6的運算單元61從第三存儲單元64讀取卷積核,從第二存儲單元63讀取輸入數(shù)據(jù),完成輸入數(shù)據(jù)和卷積核的卷積運算,將中間結(jié)果通過互連模塊4返回。
在步驟s8,在互連模塊4中,各從運算模塊6返回的中間結(jié)果被逐級拼成完整的中間向量。
在步驟s9,主運算模塊5得到互連模塊4返回的中間向量,卷積窗口遍歷所有輸入數(shù)據(jù),主運算模塊將所有返回向量拼接成中間結(jié)果,根據(jù)compute指令譯出的控制信號,從第一存儲單元53讀取偏置數(shù)據(jù),與中間結(jié)果通過向量加單元511相加得到偏置結(jié)果,然后激活單元512對偏置結(jié)果做激活,并將最后的輸出數(shù)據(jù)寫回至第一存儲單元53中。
在步驟s10,控制器單元2接著從指令存儲單元讀入下一條io指令,根據(jù)譯出的控制信號,數(shù)據(jù)訪問單元3將第一存儲單元53中的輸出數(shù)據(jù)存至外部地址空間指定地址,運算結(jié)束。
對于多層神經(jīng)網(wǎng)絡卷積層,其實現(xiàn)過程與單層神經(jīng)網(wǎng)絡卷積層類似,當上一層卷積神經(jīng)網(wǎng)絡執(zhí)行完畢后,下一層的運算指令會將主運算單元中存儲的上一層的輸出數(shù)據(jù)地址作為本層的輸入數(shù)據(jù)地址。同樣地,指令中的卷積核和偏置數(shù)據(jù)地址也會變更至本層對應的地址。
通過采用用于執(zhí)行卷積神經(jīng)網(wǎng)絡正向運算的裝置和指令集,解決了cpu和gpu運算性能不足,前端譯碼開銷大的問題。有效提高了對多層卷積神經(jīng)網(wǎng)絡正向運算的支持。
通過采用針對多層卷積神經(jīng)網(wǎng)絡正向運算的專用片上緩存,充分挖掘了輸入神經(jīng)元和卷積核數(shù)據(jù)的重用性,避免了反復向內(nèi)存讀取這些數(shù)據(jù),降低了內(nèi)存訪問帶寬,避免了內(nèi)存帶寬成為多層卷積神經(jīng)網(wǎng)絡正向運算性能瓶頸的問題。
前面的附圖中所描繪的進程或方法可通過包括硬件(例如,電路、專用邏輯等)、固件、軟件(例如,被具體化在非瞬態(tài)計算機可讀介質(zhì)上的軟件),或兩者的組合的處理邏輯來執(zhí)行。雖然上文按照某些順序操作描述了進程或方法,但是,應該理解,所描述的某些操作能以不同順序來執(zhí)行。此外,可并行地而非順序地執(zhí)行一些操作。
在前述的說明書中,參考其特定示例性實施例描述了本發(fā)明的各實施例。顯然,可對各實施例做出各種修改,而不背離所附權(quán)利要求所述的本發(fā)明的更廣泛的精神和范圍。相應地,說明書和附圖應當被認為是說明性的,而不是限制性的。