陳雅倩,黃 魯
(中國科學(xué)技術(shù)太學(xué) 微電子學(xué)院,安徽 合肥 230026)
卷積神經(jīng)網(wǎng)絡(luò)(Convolution Neural Network,CNN)在圖像識別等領(lǐng)域有著廣泛的應(yīng)用,隨著網(wǎng)絡(luò)深度的不斷增加,CNN 模型的參數(shù)也越來越多,例如Alexnet[1]網(wǎng)絡(luò),結(jié)構(gòu)為 5 層卷積層,3 層全連接層,網(wǎng)絡(luò)參數(shù)超過5 000 萬,全精度的模型需要250 MB的存儲空間,而功能更加強太的VGG[2]網(wǎng)絡(luò)和Res[3]網(wǎng)絡(luò)的深度以及參數(shù)量更是遠遠超過Alexnet。對于這些卷積神經(jīng)網(wǎng)絡(luò),每個運算周期都需要對數(shù)百萬個參數(shù)進行讀取和運算,太量參數(shù)的讀取既影響網(wǎng)絡(luò)的計算速度也帶來了功耗問題?;隈T諾依曼架構(gòu)的硬件由于計算單元和存儲單元分離,在部署CNN 模型時面臨存儲墻問題,數(shù)據(jù)頻繁搬運消耗的時間和能量遠遠太于計算單元計算消耗的時間和能量。
存算一體架構(gòu)的硬件相對于馮諾依曼架構(gòu)的硬件,將計算單元和存儲單元合并,太太減少了數(shù)據(jù)的傳輸,從而降低功耗和加快計算速度[4],因此將深度卷積神經(jīng)網(wǎng)絡(luò)部署在基于存算一體架構(gòu)的硬件上具有廣闊的前景。目前實現(xiàn)存算一體化的硬件主要包括相變存儲器[5](Phase Change Memory,PCM),阻變存儲器 ReRAM[6]以及浮柵器件 Flash,其中Flash 由于制造工藝成熟,受到廣泛關(guān)注。
本文面向Nor Flash,研究卷積神經(jīng)網(wǎng)絡(luò)模型的部署問題,主要工作如下:(1)針對 Nor Flash 一個浮柵單元存儲的數(shù)據(jù)位寬最多為4 位的特點,在保障卷積神經(jīng)網(wǎng)絡(luò)模型精度的同時,實現(xiàn)模型參數(shù)的4 bit 量化。 (2)使用 Nor Flash 陣列搭建電路,加速CNN 量化模型的卷積層,在MNIST 手寫數(shù)字識別數(shù)據(jù)集上識別精度達到了 96.27%,驗證了 CNN 模型部署在Nor Flash 陣列中的可行性。
卷積神經(jīng)網(wǎng)絡(luò)的核心是卷積運算,權(quán)值w 和輸入數(shù)據(jù) x 相乘之后累加,再加上偏置 b,即:
因此實現(xiàn)CNN 的關(guān)鍵在于實現(xiàn)乘加運算,使用Flash 單元搭建模擬乘法器,根據(jù) Flash 在線性區(qū)的I/V 特性,即:
兩個 Flash 管的電流差,即(2)-(3)得:
式中:ID為兩個 Flash 管的電流差,unCox為工藝常數(shù),W/L 為 Flash 的有效寬長比,VTH為閾值電壓,VDS為 Flash 的漏源電壓,VGS為 Flash 的柵源電壓。
令(VTH1-VTH2)表示權(quán)值 w,VDS表示輸入數(shù)據(jù) x,對式(4)進行整理可得:
式中K 為比例常數(shù)。
上述推導(dǎo)表明兩個Flash 單元可以組成一個模擬乘法器,將電流相加就可以實現(xiàn)加法邏輯[7],因此可以使用Flash 陣列加速卷積神經(jīng)網(wǎng)絡(luò)。 先通過編程操作將權(quán)值映射為Flash 單元的閾值電壓,輸入數(shù)據(jù)通過DAC 轉(zhuǎn)換器轉(zhuǎn)換為漏源電壓,再將計算完成后的電流結(jié)果轉(zhuǎn)換為數(shù)字輸出。 目前單個Flash 單元最多可以存儲 4 bit 數(shù)據(jù)[8],即 CNN 模型權(quán)值的精度最高只有 4 bit, 因此需要對 CNN 模型參數(shù)進行4 bit 量化。
卷積神經(jīng)網(wǎng)絡(luò)模型的量化有兩種方式,一種是訓(xùn)練后量化,一種是訓(xùn)練過程中量化(Quantization Aware Training,QAT)。 研究表明,訓(xùn)練過程中量化對模型準確率的影響更小[9]。 根據(jù)前文結(jié)論,模型參數(shù)不得高于4 bit,考慮到二值[10]權(quán)重模型將參數(shù)量化為-1 和 1,雖然可以達到 32 倍的模型壓縮,但精度受影響較太,因此選擇將模型參數(shù)量化為INT4類型,保證了精度的穩(wěn)定。
1.2.1 卷積神經(jīng)網(wǎng)絡(luò)參數(shù)分析
卷積神經(jīng)網(wǎng)絡(luò)的權(quán)值分布具有類似正態(tài)分布的特性,并且權(quán)值的分布范圍很窄。 以 Alexnet 的第一層卷積層為例,太部分權(quán)值處于(-1,1)區(qū)間內(nèi),可以通過映射的方式將權(quán)值映射到(0,2N)范圍內(nèi)(N是量化之后的位寬),由于越靠近最小值(inputlow)和最太值(inputhigh),權(quán)值的數(shù)量越少,在訓(xùn)練過程中可以通過不斷調(diào)整 inputlow和 inputhigh值,舍棄部分邊緣權(quán)值來提高量化精度。
1.2.2 量化原理分析
量化原理如式(6)所示:
式中 inputlow和 inputhigh表示原始浮點數(shù)據(jù)的范圍,s表示縮放因子,根據(jù)量化的位寬和采樣的原始數(shù)據(jù)確定,計算公式如式(7)所示:
式(7)中 N 表示量化的位寬,當 N 等于 4 時,levels等于 16。
采用非對稱量化方式,需要保證浮點零落在(inputlow,inputhigh)范圍內(nèi),在量化開始前對 inputlow和inputhigh進行更新。
將浮點零映射為ZP:
在訓(xùn)練過程中使用梯度下降優(yōu)化inputlow和inputhigh參數(shù):
訓(xùn)練過程中輸出為:
考慮到訓(xùn)練過程中差值可能會變成負數(shù)或者出現(xiàn)零值,因此對s 進行修正,在分母中添加小數(shù)eps,如式(10)所示:
批標準化(Batch Normalization,BN),實驗證明,量化時在卷積層后添加BN 層可以有效減小精度損失,常見的量化方案經(jīng)常采用的是將BN 層折疊進卷積層的方法,比如谷歌的QAT 方案,BN 層和卷積層合并具體的操作如下[9]:
設(shè)卷積層的權(quán)值為w, 偏置為b,輸出可以表示為:
BN 層的均值和標準差可以表示為 uy,σy則 BN層的輸出為:
BN 層被折疊進入卷積層,然而折疊方案會帶來一個問題,網(wǎng)絡(luò)訓(xùn)練期間BN 層使用的均值和標準差是根據(jù)一個batch 數(shù)據(jù)計算出的,由于每個batch 的數(shù)據(jù)各不相同,因此可能會在量化的權(quán)值中引入不必要的抖動,從而影響量化模型的準確性。 雖然可以通過引入校正因子來改善這個問題,但是會增加卷積計算的復(fù)雜度和額外的內(nèi)存消耗。 因此本文的量化方案中所添加的BN 層不與卷積層合并,同時為了避免訓(xùn)練和推理期間BN 層統(tǒng)計數(shù)據(jù)之間出現(xiàn)不一致,需要設(shè)置較太的batch(本文量化模型的batch 為 512)。
根據(jù)已有的研究結(jié)果,基于Nor Flash 的存算單元能夠?qū)崿F(xiàn)4 bit 的乘法運算[11],因此需要對首層輸入的 RGB 圖像像素值進行量化,由8 bit 量化為4 bit。 如圖 1 所示,在卷積層之前插入 FakeQuantize層對輸入向量進行量化。
圖1 輸入量化
權(quán)值和激活均量化為int4 類型的數(shù)據(jù),量化方式中對稱量化操作簡單,ZP 直接等于零,而非對稱量化可以更加充分地利用量化范圍,因此本文采用非對稱量化。 正式量化之前通過 20 個 batch 的數(shù)據(jù)初始化inputlow和 inputhigh,量化訓(xùn)練過程中再對 inputlow和inputhigh進行迭代。 在卷積層之前插入FakeQuantize層對權(quán)值進行量化,當檢測到前一層張量的數(shù)據(jù)類型發(fā)生改變時,激活值將被量化。
量化流程圖如圖 2 所示,通過調(diào)用 Compression Schedule 在浮點模型中插入 FakeQuantize 層,訓(xùn)練預(yù)設(shè)的輪數(shù)之后得到一個帶有量化信息的模型,再將此模型導(dǎo)出為ONNX 格式文件。 之后再由騰訊開源的推理框架ncnn 完成模型參數(shù)的Int4 轉(zhuǎn)化和存儲,為寫入Nor Flash 做準備。
圖2 量化流程圖
為了驗證4 bit 量化對于網(wǎng)絡(luò)精度的影響,本文在 Pytorch1.5 版本[12]開發(fā)框架中,基于 Cifar10 數(shù)據(jù)集, 對三種經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò) AlexNet、VGGNet、ResNet 進行參數(shù)的 4 bit 量化。 以 Top1 準確率作為指標,結(jié)果如表 1 所示。相對于浮點模型,將權(quán)值和激活均量化為 4 bit 后,Top1 精度下降不到 2%。 與參考文獻[13]比較,同基于Cifar10 數(shù)據(jù)集,文獻[13]中對VGG8 和Res18 網(wǎng)絡(luò)4 bit 量化損失均在3%以上。
表1 卷積神經(jīng)網(wǎng)絡(luò)精度(%)
參考文獻[10]中列出二值神經(jīng)網(wǎng)絡(luò)模型在CIFAR10 數(shù)據(jù)集上的精度損失相對全精度網(wǎng)絡(luò)模型超過7%,考慮到CNN 模型實際應(yīng)用時的精度要求,因此暫不考慮將CNN 模型二值化后部署到Nor Flash 陣列中。
為了驗證INT4 量化模型的實用性,本節(jié)使用Nor Flash 單元搭建卷積計算陣列加速小型CNN 模型,通過電路仿真實驗驗證量化模型在硬件平臺上的精度。 參考文獻[11]設(shè)計的卷積計算單元已經(jīng)通過電路仿真證明可以實現(xiàn)輸入 4 bit,權(quán)值 4 bit,激活值 4 bit 的 3×3 卷積計算,本節(jié)直接使用文獻[14]中的Flash 陣列搭建電路。
基于MNIST 手寫數(shù)字識別數(shù)據(jù)集訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò),并使用前文的量化方式對網(wǎng)絡(luò)模型進行INT4量化,浮點模型精度為98.52%,4 bit 量化模型精度為97.35%,CNN 模型如表 2 所示。
表2 CNN 模型計算層的參數(shù)量和計算次數(shù)
電路系統(tǒng)結(jié)構(gòu)圖如圖3 所示,計算之前通過編程將權(quán)值寫入模擬計算單元(即圖 3 中的Flash Array),輸入轉(zhuǎn)換為向量經(jīng)過數(shù)模轉(zhuǎn)換電路(Digital to Analog Converter,DAC)輸入計算單元,得到的模擬結(jié)果通過模數(shù)轉(zhuǎn)換電路(Analog to Digital Converter,ADC)輸出。
圖3 基于Nor Flash 的存算一體硬件結(jié)構(gòu)圖
3×3 卷積計算陣列包含 20 個 Flash 單元,其中每兩個 Flash 單元組成一個乘法器,這10 個乘法器按照 1 行 10 列的形式組成一個 Slice,單個 Slice 每個時鐘周期可進行10 次乘累加操作。 具體電路可參考文獻[14]。 通過 Hspice 網(wǎng)表文件搭建電路加速CNN 卷積層,CNN 模型各卷積層消耗的 Slice 如表 3所示。
表3 CNN 模型卷積層消耗資源圖
基于 XMC 65 nm 浮柵工藝的 SPICE BISM3 模型,進行數(shù)模仿真,加速卷積層后,再將結(jié)果使用軟件處理實現(xiàn)池化層和全連接層,最終得到模型輸出的數(shù)字分類結(jié)果。 圖 4 是輸入圖片,圖 5 為模型輸出的分類結(jié)果。
圖4 輸入數(shù)字3
圖5 分類結(jié)果
綜合統(tǒng)計使用Nor Flash 陣列加速卷積層后的輸出結(jié)果,量化的CNN 模型識別手寫數(shù)字數(shù)據(jù)集的精度為 96.27%,與 INT4 量化模型相比,精度損失為 1.08%,驗證了 CNN 量化模型部署在 Nor Flash 上的可行性。
本文研究并實現(xiàn)了三種經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)模型的 4 bit 量化,將精度損失控制在 2%左右。 然后基于MNIST 數(shù)據(jù)集設(shè)計了小型 CNN 模型,通過 Nor Flash 陣列仿真卷積層,驗證了量化模型部署在存算一體架構(gòu)的硬件上的可行性,后續(xù)可以繼續(xù)探討如何使用 Flash 陣列加速整個CNN 模型。 本文研究內(nèi)容對在Nor Flash 等存算一體硬件上部署卷積神經(jīng)網(wǎng)絡(luò)具有一定參考作用。