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