林廣棟,黃光紅,陸俊峰
(中國電子科技集團公司第三十八研究所,安徽 合肥 230094)
近年來,深度學習模型在計算機視覺、語音處理等人工智能領域得到了越來越廣泛的應用,很多應用領域要求快速且低功耗地完成深度學習模型的推理。例如,在自動駕駛領域,要求深度學習模型在限定的時間內完成圖像傳感器拍攝的圖像中的目標識別任務;在手機等端側設備中,要求進行圖像識別、目標檢測的深度學習模型的能耗盡可能小;在大型數據中心,能耗已經成為其成本的重要組成部分,降低深度學習模型在數據中心推理和訓練的能耗成為降低數據中心成本的重要因素。然而,深度學習模型的參數量和計算量巨大,在傳統(tǒng)的CPU/DSP上難以完成高性能且低功耗的推理。因此,專門用于深度學習模型推理的人工智能芯片成為目前研究的熱點,且已經有成熟的產品出現[1-2]。中國電子科技集團公司第三十八所研制了一款人工智能芯片,該芯片是一個異構的SOC(System On Chip)芯片,由支持通用軟件的中央處理核心(Central Processing Unit,CPU)和神經網絡加速核(Neural Network Accelerator,NNA)構成。其中CPU負責一般的軟件(如Linux或嵌入式操作系統(tǒng))的運行,而NNA負責在CPU的調度下完成數值計算密集的神經網絡推理任務,兩者配合高效地完成深度學習模型的推理。FCOS模型是目前比較先進的一種單階段無錨框的目標檢測深度學習模型[3],該模型首次提出了對目標框內的所有特征點輸出目標的位置并進行訓練的機制。這種機制在后續(xù)很多新的目標檢測深度學習模型中得到應用。該文研究了FCOS模型在該人工智能芯片上的硬件加速技術,介紹了深度學習模型在該人工智能芯片上部署的一般流程,并研究了人工智能芯片的關鍵配置如算力、DDR帶寬、數據類型對推理性能、最終效果的影響。
FCOS是一個一階段的不基于錨框的目標檢測深度學習模型。與其他的一階段深度學習模型類似,它不需要提取候選區(qū)域然后在候選區(qū)域上執(zhí)行圖像分類操作。與yolo系列基于錨框的目標檢測模型相反,它不需要預先設計和定義錨框。它針對輸出特征圖的每個位置,輸出這個位置上的目標的左上角、右下角頂點相對于該位置的偏移。FCOS模型由骨干(backbone)網絡、頸(neck)網絡、頭(head)網絡組成,其中骨干網絡負責提取圖像不同層次的特征,頸網絡負責把不同層次的特征融合,而頭網絡負責根據不同尺度的特征得到最終的輸出。它同樣采用了特征金字塔格式的輸出,輸出層共5個分支,分別代表不同尺度下目標的檢測信息。FCOS目標檢測模型的骨干網絡和頸網絡的結構如圖1所示。
圖1 FCOS深度學習模型骨干及頸網絡示意圖
其頭部網絡的結構如圖2所示。該圖僅僅是輸出的五個分支的一個分支示意圖,像這樣的輸出結構在五個分支中都存在。該頭部由三類小分支組成,分別是以softmax方式處理后代表該位置目標屬于各類別的概率的分支,代表該位置處于目標的中心位置的程度的centerness分支,代表目標左上角、右下角位置的偏移的分支。若目標有N個類別,這三個小分支的通道數分別為:N、1、4。整個模型共5*(N+1+4)個輸出通道。
FCOS目標檢測深度學習模型提出了一種新的從圖像中提取更多訓練數據的方法,即位置在真實目標框里的點都可以輸出目標的位置,都會進行訓練。其于FCOS模型的思想,很多新的模型被提出,如FCOS-3D[4]、TTFNet[5]等等。相比于yolo系列目標檢測深度學習模型,FCOS模型不需要設置錨框,更便于訓練,未來將在工業(yè)界得到更廣泛的應用。
圖2 FCOS深度學習模型頭部網絡示意圖
中國電子科技集團公司第三十八研究所研制了一款人工智能推理芯片,其深度學習推理核心的理論峰值性能達到16TOPS(INT8),支持int8、uint8、int16、float16、bfloat16等數據類型。該芯片的核心SOC架構如圖3所示。
圖3 一款人工智能芯片硬件架構
該芯片是一個由深度學習推理加速核NNA與通用處理器CPU構成的異構計算系統(tǒng),兩者通過片上總線進行交互。CPU通過AHB總線配置NNA的寄存器,而NNA通過AXI總線訪問片上存儲器與片外的DDR,CPU和DDR通過片上存儲器與片外的DDR共享數據。NNA內部由4個同構的計算核構成,每核理論峰值算力為4 TOPS(INT8),4個核可以一起工作完成同一個任務,也可以分別執(zhí)行不同的任務。該芯片的高速外設主要包括用于網絡通信的以太網接口(Gigabit Media Access Control,GMAC)和用于PCIE協(xié)議通信的PCIE接口。該芯片工作時,首先由CPU配置NNA,使其獲取到待執(zhí)行的神經網絡模型的信息,如神經網絡模型的結構、權重信息。由CPU控制GMAC或PCIE接口從片外設備(如傳感器芯片)獲取待處理的輸入數據,存儲在DDR上。之后CPU控制NNA讀取輸入數據,執(zhí)行神經網絡模型的推理過程,并把神經網絡模型的輸出結果寫到DDR上。之后CPU再控制GMAC或PCIE把計算結果傳輸到片外設備,進行下一步處理。該芯片配置了一塊片上存儲器(On Chip Memory,OCM),該存儲器相比DDR的訪問帶寬更高。神經網絡推理過程中產生的需要反復使用的中間數據,如中間特征圖的值,優(yōu)先存放在OCM上,以提高推理效率。
該人工智能芯片提供了完善的軟件工具鏈來支持深度學習模型的部署,包括如下步驟:
①導入:將各種深度學習軟件框架生成的模型文件解析為該人工智能芯片內部的模型表示方式,以便后續(xù)處理。
②量化:深度學習軟件框架中一般用浮點數表示深度學習模型,而如果量化為低位寬的定點數在芯片上進行實時推理,將可提高推理速度[6-7]。對深度學習模型的量化有兩種方式:量化敏感的訓練[8](Quantization-Aware Training,QAT)、訓練后量化[9](Post-Training Quantization,PTQ)。前者在量化完成之后再使用訓練數據對量化后的模型進行精調。后者在訓練完成之后根據一些測量數據對激活度的范圍進行測量后直接量化。該人工智能芯片配套工具鏈使用的是訓練后量化方法。量化時,需要提供少量測試數據,軟件工具鏈會對這些輸入數據執(zhí)行推理過程,以得到深度學習模型各層特征圖的取值范圍,再進行量化,以使量化后的定點數最大程度地覆蓋原始模型的浮點數的取值范圍。深度學習模型的量化分為不同的層次,包括逐層量化[10]、分組量化[11]、逐通道量化[12]等等。該人工智能芯片的軟件工具鏈的量化算法均使用逐層量化的方式。深度學習模型在芯片中的量化推理方式按量化參數是否動態(tài)變化又可分為兩類:動態(tài)量化[13]、靜態(tài)量化[14]。前者的量化參數會在運行時根據實際激活度的變化范圍進行調整;而后者的量化參數在推理前確定,并在運行時保持不變。該人工智能芯片的軟件工具鏈的量化方式是靜態(tài)量化方式。
③優(yōu)化:該人工智能芯片的軟件工具鏈內部以計算圖的方式表示深度學習模型,基于計算圖,可以執(zhí)行如算子合并、冗余計算刪除等計算圖優(yōu)化操作,在不降低精度的基礎上提高性能。
④導出:把經過量化、優(yōu)化后的深度學習模型保存下來,輸出為模型文件。該人工智能芯片的模型文件同時包含模型的結構與量化后的權重。
⑤推理:芯片上的驅動在應用程序的調用下,加載并解析模型文件,根據具體的硬件配置對計算圖執(zhí)行進一步的優(yōu)化,并執(zhí)行實時的模型推理任務。
由于深度學習模型中的權重存在一定冗余性,因此把權重及激活度量化為低位寬的數據,可以在不明顯降低模型精度的前提下減少模型的計算量、減小模型的大小,進而減少模型推理時對于片外數據傳輸帶寬的需求,最終提高模型推理的效率。量化算法主要分為兩類:對稱量化[15]和非對稱量化[16]。當以對稱量化算法量化為8位時,數據類型稱為int8;當以非對稱量化算法量化為8位時,數據類型稱為uint8;當以對稱量化算法量化為16位時,數據類型稱為int16。
量化為INT8方式時,由浮點數轉換為定點數的計算方式為:
首先計算中間值:
data=round(fdata*2fl)
然后計算最終量化值:
而由量化后的INT8值計算原始浮點值的方式如下:
fdata=qdata*2-fl
其中,fl是進行INT8量化后的常數,每一層的權重與每一層的激活度在量化后有不同的fl值,分別根據該層權重與激活度的分布計算得到。其中權重的fl的計算方法如下:
fl=7-「log2(max(abs(w)))?
其中,max(abs(w))代表一層的權重的絕對值的最大值。激活度的fl按類似的方法根據激活度的分布計算得到。
UINT8型量化將權重和激活度都量化為無符號的8位數,量化后的數值范圍在0~255之間。由浮點數計算UINT8量化數的計算方式如下:
首先計算中間值:
data=round(fdata/scale+zeropoint)
然后計算最終量化值:
而由量化后的UINT8型數據轉換為浮點數據的計算方式為:
fdata=(qdata-zeropoint)*scale
其中,scale和zeropoint為根據特定算法計算得到的縮放因子與零點。以計算某一層的權重的scale和zeropoint為例,記神經網絡某層的權重的最大值為max(w),最小值為min(w),則該層的權重量化為UINT8時的scale和zeropoint的計算方式如下:
scale=
量化為INT16方式時,由浮點數轉換為定點數的計算方式為:
首先計算中間值:
data=round(fdata*2fl)
然后計算最終量化值:
而由量化后的INT8值計算原始浮點值的方式如下:
fdata=qdata*2-fl
其中,fl是進行INT8量化后的常數,每一層的權重與每一層的激活度在量化后有不同的fl值,分別根據該層權重與激活度的分布計算得到。其中權重的fl的計算方法如下:
fl=15-「log2(max(abs(w)))?
其中,max(abs(w))代表一層的權重的絕對值的最大值。激活度的fl按類似的方法根據激活度的分布計算得到。
FLOAT16是IEEE規(guī)定的標準數據格式,共16位,各位的含義如表1所示。
表1 FLOAT16數據類型
在深度學習領域,由于網絡模型中存在大量參數,這些參數具有大量的冗余性,精確地表示這些參數的重要性降低。在深度學習模型推理領域,人們開始使用bfloat16數據類型,這種數據類型相對于常規(guī)的float16數據類型降低了尾數的位寬,增加了指數的位寬,其效果是增加了其表示的數值的范圍,減少了表示的精度。這種數據類型能在與float16相同的數據位寬下以較低的精度表示更大的數據范圍,比較適合深度學習領域。這種數據類型各位的含義如表2所示。
表2 BFLOAT16數據類型
以下實驗基于中國電子科技集團公司開發(fā)的針對該人工智能芯片的演示板卡完成,該演示板卡實物圖如圖4所示。
圖4 一款人工智能芯片演示板卡實物圖
以下實驗中,FCOS模型的輸入圖像寬度為1 216,高度為800,總卷積計算量約為138 GOPS。
該人工智能芯片內部設置了4 MB大小的片上存儲器。片上存儲器的訪問延遲比片外的DDR小得多,并且其帶寬可以達到片上總線傳輸帶寬的上限。將FOCS模型量化為精度比較高的INT16數據類型,分別控制使用不同大小的片上存儲器,對性能的影響如表3所示。
表3 片上存儲器大小對FCOS模型推理時間的影響
由表3可以看出,使用芯片內部的片上存儲器可以提高深度學習模型的推理速度。當然,片上存儲器會增加芯片的面積與功耗,其容量不可能設置太大,需要在推理性能與芯片的面積和功耗之間進行平衡。
深度學習模型推理時,其中間層的通道數量很大,使得中間層特征圖無法在片上存儲器全部存儲,需要在片外容量更大的DDR中暫存。這就導致深度學習模型推理時需要進行大量片上數據與片外數據的傳輸,因此,DDR的帶寬對模型推理的性能影響很大。將FCOS模型量化為INT16數據類型,然后分別配置DDR控制器的頻率為不同的數值,在不同的DDR帶寬下進行推理,模型推理的性能如表4所示。該芯片使用DDR控制器數據位寬為64位,理論峰值帶寬(bandwidth)與頻率(frequency)的關系為:
bandwidth=frequency*64
其中,頻率的單位為MHz,而帶寬的單位為Mbit/s。
表4 DDR帶寬對FCOS模型推理時間的影響
可見,隨著DDR頻率的降低,推理性能也呈現明顯的降低。顯然,DDR帶寬對推理性能有著重要的影響。
DDR有很多配置選項,包括配置各AXI端口的優(yōu)先級、帶寬限制、是否使能bank group、寫命令重排、命令隊列選擇等等。對DDR控制器的不同屬性進行配置的寄存器數量多達三百多個。同DDR的帶寬配置一樣,DDR的各項配置也會對推理性能產生影響。該文無法窮盡所有的DDR配置,僅就是否使能bank group、是否打開寫重排功能、是否打開命令選擇功能三個選項進行實驗,檢驗這些配置對推理性能的影響。表5為幾種典型的DDR配置及不同的DDR帶寬下FCOS模型的推理性能,該表中的數據均是在模型量化為INT16數據類型、使用4核推理、片上存儲器容量為4 MB時統(tǒng)計出來的。
其中bank group是DDR4設備專用的概念,它把區(qū)分bank group的第[0]地址放到區(qū)分DRR顆?!傲小钡牡刂肺恢?使DDR控制器同時維護兩個bank group的狀態(tài),可以以更高的效率支持連續(xù)的burst讀寫。在本芯片的DDR配置中,支持bank group時,bank group的第[0]位位于軟件視角的地址的第[6]位。當DDR收到的burst請求大于64 byte時,使能bank group的效果更好。但實驗表明,使能bank group這個功能(bg_rotate_en)反而會降低性能,這是因為NNA發(fā)出的burst請求大小一般為64個byte或更小,而很少發(fā)出更大burst請求,這是由NNA的核心架構決定的。因此,NNA無法利用bank group的優(yōu)勢。
表5 不同DDR配置下FCOS模型推理時間 ms
DDR控制器維護了一個命令隊列,按照一定的邏輯把來自不同總線端口的訪問請求放入隊列中,并支持按一定的邏輯從隊列頭部的4個命令中選擇最適當的命令發(fā)送給DDR顆粒。DDR控制器一般根據bank是否沖突、地址是否沖突等規(guī)則決定從命令隊列前4個命令中取出命令的順序。若關閉命令隊列選擇(in_order_accept)功能,則DDR控制器總是選擇隊列頭部的命令發(fā)送給顆粒。實驗表明,打開命令隊列選擇的推理性能更好,這是因為DDR控制器會在隊列頭部的命令因為顆粒未準備好等原因而無法執(zhí)行時,選擇隊列頭部前4個命令中的其他命令執(zhí)行,從而提高了效率。
DDR控制器對來自不同端口的寫命令有三種策略(wr_order_req):(1)不論是否是來自相同的總線端口的寫請求,也不論命令ID是否相同,都可以改變寫的順序;(2)來自相同總線端口的帶有相同寫命令ID的請求不會被重排,其他的寫命令可以被重排;(3)只要是來自相同總線端口的寫請求,都會按發(fā)送到DDR控制器的順序執(zhí)行,不會被重排;來自不同總線端口的寫請求會被重排。顯然,根據DDR顆粒的狀態(tài)及時改變寫命令的執(zhí)行順序,將可以提高寫命令的執(zhí)行效率。實驗表明,寫重排功能打開時的推理性能要優(yōu)于寫重排關閉時的推理性能。
該人工智能芯片中,深度學習推理加速核內部由4個結構相同的核構成,每個核的理論峰值算力為4 TOPS(int8),這4個核可以組合配置為不同的算力。作為深度學習推理的核心部件,算力的配置顯然也對推理性能產生影響。表6統(tǒng)計出不同算力配置下FCOS模型的推理性能,此表中的數據均是模型量化為INT16數據類型、片上存儲器容量設為4 MB時統(tǒng)計出的。
表6 算力配置對FCOS模型推理時間的影響
顯然,算力配置越高,推理性能越強。但推理性能與算力之間并不是線性關系。例如,四核配置下的推理時間并不是單核配置下推理時間的1/4,主要原因有兩點:(1)算力提高,計算需要的數據量線性增長,對帶寬的要求也相應提高,但芯片的整體帶寬不變,因此推理性能不能線性增長;(2)核數量增加,需要額外的操作進行特征圖的切分與計算結果的合并、核之間計算的同步,帶來額外的負擔。因此,推理性能并不能隨著算力配置的增加而線性增加。
部分硬件電路可復用為支持不同的數據類型。例如,一個計算INT16乘法的電路可以復用為4個INT8乘法的電路。同樣,該電路也可復用于計算浮點數據類型尾數的乘法。理論上,本芯片計算INT8數據類型的算力是計算INT16數據類型時算力的4倍。由于芯片帶寬、片上存儲器容量等其他因素限制,實際執(zhí)行推理運算時,INT8與INT16數據類型的表現并不完全是4倍的關系。在CPU運行在1 200 MHz、NNA運行在660 MHz、DDR運行在2 400 MHz頻率下,片上存儲器容量固定為4 MB時,量化為各種數據類型的FCOS模型的運行速度如表7所示。
表7 數據類型對FCOS模型推理時間的影響
從推理性能上看,int8和uint8數據類型的推理性能幾乎相同,int16和float16的推理性能約是int8和uint8的3~4倍。Bfloat16由于需要在推理前和推理后執(zhí)行向常規(guī)數據類型的轉換,性能最差。
使用不同數據類型對FCOS模型進行量化后進行目標檢測的實際效果如表8所示。
表8 FCOS模型量化為不同數據類型后的實際目標檢測效果
從以上結果可以看出,量化為BFLOAT和INT16數量類型的FCOS模型可以檢測出最左側一列中從網球到網球拍、人三種不同尺度的物體,表現最好。最終推理的結果精度上看,效果從好到差依次為:bfloat16=int16>float16>uint8>int8。其中int16數據類型等效于對同一層的特征圖,使用統(tǒng)一的指數來表示,由于其尾數位數大于float16數據類型的尾數位數(10位),因此,其最終的效果比float16更高。
該文介紹了FCOS目標檢測模型的基本網絡結構。同時介紹了一款人工智能芯片的基本硬件結構。研究了把FCOS深度學習模型應用到該人工智能芯片的方法,并研究了片上存儲器大小、DDR帶寬、DDR配置、算力、不同的量化算法等因素對推理效果的影響。研究表明,從對推理精度的影響來看,int16量化方法和bfloat16數據類型的精度最高,float16、uint8數據類型的精度依次降低,int8最差。從對推理時間的影響來看,bfloat16數據類型的效果最差,int16和float16的性能次之,int8和uint8的推理時間最短。研究結果證實,片上存儲器容量越大、DDR帶寬都對推理時間產生重要的影響,片上存儲器容量越大、DDR帶寬越大,推理時間越短;反之則越長。另外,研究還表明,DDR的配置,如是否使能bank group、是否使能命令隊列選擇功能、是否支持寫重排,也會對推理時間產生影響,但影響的程度不如DDR帶寬的影響。研究成果將為人工智能芯片、深度學習模型推理算法的研究者提供參考。