自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MNN 引擎的稀疏計(jì)算方案設(shè)計(jì)與實(shí)踐

開(kāi)發(fā)
稀疏計(jì)算加速可以理解為一種 "可伸縮"等效位寬的技術(shù),這個(gè)角度可以探索更多獨(dú)特的應(yīng)用場(chǎng)景。

推理引擎領(lǐng)域,經(jīng)過(guò)最近幾年的打磨優(yōu)化,阿里推出的MNN(Mobile Neural Network) [1][2][3]  也成為業(yè)內(nèi)領(lǐng)先的推理引擎,當(dāng)我們想進(jìn)一步提升性能時(shí),結(jié)合深度學(xué)習(xí)模型設(shè)計(jì)入手是一個(gè)有潛力的方向,結(jié)合科學(xué)計(jì)算、高性能計(jì)算領(lǐng)域的知識(shí)則是一個(gè)更具體的方法,基于這個(gè)思考路徑, 業(yè)內(nèi)逐漸開(kāi)始從稀疏計(jì)算角度來(lái)提升推理引擎性能。稀疏是指數(shù)據(jù)矩陣中有部分是0元素,一般而言,矩陣稀疏化之后,非0元素?cái)?shù)據(jù)在內(nèi)存中不連續(xù),無(wú)法直接復(fù)用GEMM(general matrix multiply) [9] 算法,同時(shí)緩存命中問(wèn)題或判斷開(kāi)銷(xiāo)會(huì)降低稀疏計(jì)算性能,需要新的方法實(shí)現(xiàn)稀疏相對(duì)稠密計(jì)算的加速。

結(jié)合業(yè)內(nèi)已有的稀疏計(jì)算方法與MNN的推理框架、內(nèi)存布局、算子關(guān)系,我們?cè)贛NN框架中設(shè)計(jì)支撐多類(lèi)后端的稀疏整體方案,打磨稀疏計(jì)算核心匯編實(shí)現(xiàn)達(dá)到高性能;重要性能指標(biāo)數(shù)據(jù)如下:以AI(Artificial Intelligence)領(lǐng)域經(jīng)典的分類(lèi)模型MobileNetV1 [12] MobileNetV2 [13] 為例, 選取相同高通SD 835 CPU(MSM8998),與XNNPack [6] 相比,MobileNetV1 90%稀疏度時(shí)XNNPack 加速比為2.35x,MNN加速比為 2.57x - 3.96x。MobileNetV2 85% 稀疏度時(shí), XNNPack MobileNetV2(只有 block=2),加速比為1.62x,MNN加速比為 3.71x(block=4),block含義與其他模型信息見(jiàn)1.1、 3.1節(jié)解讀,其他信息在后續(xù)展開(kāi)。

1. 稀疏布局與加速原理

1.1 可調(diào)分塊稀疏權(quán)重

深度神經(jīng)網(wǎng)絡(luò)模型的稀疏計(jì)算包括輸入稀疏 [11] 、輸出稀疏、權(quán)重稀疏,0元素占全部元素的比例就是稀疏度,通常而言輸入和輸出稀疏對(duì)具備特定屬性模型會(huì)有效果,例如激活函數(shù)為ReLU,計(jì)算出負(fù)數(shù)值會(huì)被歸零,所以可以不精確計(jì)算出這些結(jié)果,只計(jì)算符號(hào)實(shí)現(xiàn)加速。而在CPU對(duì)通用DNN模型具備加速效果的是權(quán)重稀疏,在MNN中我們聚焦權(quán)重稀疏這個(gè)通用場(chǎng)景,另一個(gè)重要特點(diǎn)是面向深度學(xué)習(xí)的權(quán)重稀疏比例一般在30%-90%,有別于科學(xué)計(jì)算中極度稀疏到99%的場(chǎng)景。即以下三點(diǎn):

MNN稀疏計(jì)算的基本選型:

  • 左右矩陣方面:選擇通用權(quán)重稀疏;
  • 稀疏度方面: 在30%-90%左右需產(chǎn)生加速效果,非科學(xué)計(jì)算的極度稀疏場(chǎng)景;
  • 結(jié)構(gòu)方面:不采用裁剪權(quán)重矩陣通道維度的完全結(jié)構(gòu)化剪枝方法,而是隨機(jī)稀疏+分塊稀疏。

常規(guī)結(jié)構(gòu)化剪枝中 [4][5] ,直接刪減權(quán)重矩陣的IC或OC維度的整個(gè)維度切片,裁剪后模型仍然是稠密的,直接縮減矩陣乘法規(guī)模,由于對(duì)宏觀結(jié)構(gòu)改變較大,導(dǎo)致模型精度損失顯著。

MNN中的稀疏計(jì)算選擇對(duì)權(quán)重在OC維度做動(dòng)態(tài)分塊稀疏,下圖1為隨機(jī)稀疏分塊下矩陣乘法的左右矩陣數(shù)據(jù)布局,涂色方格表示數(shù)據(jù)非0, 白色方格表示稀疏化處理后為0,即可不存儲(chǔ),又可不計(jì)算。

下圖2為分塊稀疏的矩陣乘法的左右矩陣數(shù)據(jù)布局,左矩陣與隨機(jī)稀疏情形相同, 右矩陣為權(quán)重矩陣,以每OCBlock為單位,連續(xù)為0或非0分布于內(nèi)存中。為了靈活性考慮,我們?cè)O(shè)計(jì)支持OCBlock為可調(diào)數(shù)值。

1.2  權(quán)重矩陣數(shù)據(jù)壓縮格式

經(jīng)過(guò)對(duì)比選型,在MNN中權(quán)重矩陣采用了多種布局形式,原始權(quán)重如圖3所示,為了保障性能的同時(shí)壓縮內(nèi)存占用。性能隨機(jī)稀疏時(shí),選用圖4所示的布局樣式;分塊稀疏時(shí),選用圖5布局。原始矩陣壓縮為非0數(shù)據(jù)與索引部分。下圖4、5中,權(quán)重矩陣A的0元素被壓縮后不再存儲(chǔ),data為非0數(shù)據(jù),Row start Index 與Column Index為行索引與列索引。圖5的布局時(shí),可以節(jié)省更多索引空間,壓縮內(nèi)存占用。

2. MNN稀疏計(jì)算方案設(shè)計(jì)

2.1 推理框架層設(shè)計(jì)

在MNN已有架構(gòu)基礎(chǔ)上的設(shè)計(jì)稀疏計(jì)算,則設(shè)計(jì)與實(shí)現(xiàn)需要考慮較多現(xiàn)狀的約束,結(jié)合基礎(chǔ)軟件的定位,設(shè)計(jì)目標(biāo)主要包括以下5個(gè)方面。

說(shuō)明:由于漢語(yǔ)時(shí)序的”前后“和英語(yǔ)”forward/backward”語(yǔ)義相反,故用了向舊兼容代替通常說(shuō)的有歧義的"向前兼容"。

2.2 MNN稀疏計(jì)算架構(gòu)解析

經(jīng)過(guò)不斷設(shè)計(jì)與完善,MNN稀疏計(jì)算目前整體上包含稀疏訓(xùn)練、轉(zhuǎn)換參數(shù)、算子框架、后端kernel 四個(gè)階段,設(shè)計(jì)四部分松耦合;方便層內(nèi)擴(kuò)展,以及模塊化集成與被集成,如下圖package UML所示。為了便于理解,參考C4Model建模方法分層,圖6為container層架構(gòu)、圖7為具體一層的Component層架構(gòu)。

  1. 第一,屬于算法模型階段, 算法工程師結(jié)合數(shù)據(jù)搭建模型,根據(jù)自身偏好在各類(lèi)框架下訓(xùn)練得到AI模型;
  2. 第二,稀疏化訓(xùn)練階段,參考圖6,從float稠密權(quán)重模型開(kāi)始,導(dǎo)入MNN Python壓縮工具包(mnncompress),設(shè)定mnncompress需要的參數(shù),運(yùn)行將原模型中權(quán)重部分?jǐn)?shù)值稀疏化為0。我們建議用戶使用MNNCompress工具里的訓(xùn)練插件,最大化發(fā)揮加速性能;
  3. 第三,轉(zhuǎn)換模型階段,MNN convertor 主要包含三類(lèi)模塊,MNN內(nèi)部buffer格式轉(zhuǎn)換、圖優(yōu)化、后處理,選擇算子,將權(quán)重矩陣統(tǒng)計(jì)處理,滿足稀疏閾值的,給添加稀疏后端識(shí)別和運(yùn)行需要的參數(shù),最終寫(xiě)文件得到稀疏MNN模型;
  4. 第四,MNN engine推理計(jì)算階段,部署新模型到MNN運(yùn)行環(huán)境中,和普通模型運(yùn)行一樣,MNN 運(yùn)行時(shí)會(huì)自行處理算子映射、后端microkernel選擇、執(zhí)行推理。參考一般模型部署運(yùn)行文檔。(https://www.yuque.com/mnn/cn/create_session)

在 MNN Engine中,參考圖7, 算子operators和后端backend做如下結(jié)構(gòu)設(shè)計(jì)與考量。

  1. 外部看來(lái),算子注冊(cè)并未新增一種“稀疏卷積”算子,仍然是普通的卷積算子,這樣可以減小用戶使用的選擇成本,減少算子膨脹,在MNN內(nèi)部更靈活地選擇稀疏計(jì)算加速,或原始稠密卷積。
  2. 算子層面,將原始的稠密卷積重組成兩層,合理分配可復(fù)用與需要擴(kuò)展的部分,實(shí)現(xiàn)稀疏計(jì)算壓縮各類(lèi)操作。
  3. 量化稀疏算子則基于量化卷積算子ConvInt8Tiled擴(kuò)充實(shí)現(xiàn),基本方法與2相近。
  4. 算子中平臺(tái)有關(guān)的核心函數(shù),我們分別實(shí)現(xiàn)了ARM32 fp32,ARM32 int8,  ARM64 fp32, ARM64 int8, x86 avx2 fp32, x86 avx512 fp32共6種后端的匯編代碼。
  5. 測(cè)試類(lèi)方面,稀疏的用例完全包含稠密卷積的用例,并增加稀疏分塊維度,遍歷不同分塊、不同稀疏度、不同后端的正確性。

3. 稀疏計(jì)算性能評(píng)估

3.1 典型模型稀疏加速評(píng)估

為全面評(píng)估fp32稀疏加速效果,我們從"稀疏度、分塊大小、cpu型號(hào)、模型類(lèi)型"四個(gè)維度進(jìn)行評(píng)測(cè),匯集在圖8展示結(jié)果,  單張曲線圖表示固定一個(gè)設(shè)備、一個(gè)模型時(shí),推理耗時(shí)隨稀疏度的變化曲線。

將大圖的第1行第2列取出單列置于上方,便于解讀數(shù)據(jù)。單張曲線圖包含四條曲線,"dense"為MNN當(dāng)前基準(zhǔn), "dense-im2col"為將推理算法固定為分塊im2col做加速的數(shù)據(jù),不使用winograd之類(lèi)加速算法, "sparse-block1x1"表示對(duì)權(quán)重矩陣的稀疏為1x1分塊,也就是完全隨機(jī)稀疏。 "sparse-block1x4"是半結(jié)構(gòu)化稀疏,表示對(duì)權(quán)重矩陣的稀疏分塊為1x4分塊,沿著ic維度分塊為1, 沿著oc維度分塊為4。

從小圖可見(jiàn)在mobilenet V1、Mi6 機(jī)型、1x4分塊時(shí),對(duì)應(yīng)綠色左三角?曲線,稀疏加速比在0.9稀疏度是達(dá)到3.71x。

參考對(duì)比XNNPack模型推理性能:

XNNPack [6]  數(shù)據(jù)評(píng)測(cè)采用高通SD 835 CPU(MSM8998),mobilenetV1 為90%稀疏度,對(duì)mobilenetV2 為85% 稀疏度,

對(duì)應(yīng)SD 835 CPU,我們以小米6為例,下圖第1行第2列,為例對(duì)比數(shù)據(jù):

XNNPack mobilenetV1(sparsity=0.9, block=1),加速比為2.35x,MNN加速比為 2.57x , 分塊為1x4時(shí)加速比3.96x.

XNNPack mobilenetV2(sparsity=0.85, block=2),加速比為1.62x,MNN加速比為 3.71x(block=4).

對(duì)于卷積kernel不是1x1的層,我們?nèi)钥梢詫?shí)現(xiàn)稀疏加速,在XNNPack的論文中表明他們并未能實(shí)現(xiàn)稀疏加速。

通過(guò)數(shù)據(jù)大圖8,我們可得到幾點(diǎn)分析和結(jié)論:

  • 參照設(shè)備小米6上, 在稀疏分塊1x4時(shí),稀疏加速臨界值優(yōu)化到0.3, 低端機(jī)型臨界值有升高,其他中高端機(jī)型, 分塊1x4時(shí), 稀疏度0.1的時(shí)候就達(dá)到加速臨界值了, 0.9稀疏度時(shí)加速比可達(dá)4.13x。
  • MNN推理耗時(shí)隨稀疏度增加,基本線性下降,跨模型、cpu 一致性比較好。
  • 內(nèi)存占用:經(jīng)過(guò)推導(dǎo), 稀疏相對(duì)稠密節(jié)省的內(nèi)存比例如下,

另一方面,我們?cè)u(píng)估了典型模型的分類(lèi)精度,MobileNet V2在0.5稀疏度、1x4稀疏分塊配置下,精度損失0.6%,對(duì)應(yīng)上圖加速比為1.3x。

4. 業(yè)務(wù)模型實(shí)踐

4.1 某圖片超分業(yè)務(wù)

在某業(yè)務(wù)移動(dòng)端鏈路上,時(shí)間延遲與流量是其痛點(diǎn),業(yè)務(wù)方對(duì)接端智能 MNN與工作臺(tái),開(kāi)發(fā)超分辨率任務(wù)模型,同時(shí)使用MNN稀疏計(jì)算加速方案,主要做了四個(gè)步驟,

  1. 第一步為超分模型算法訓(xùn)練;
  2. 第二步,參考稀疏訓(xùn)練文檔,設(shè)定壓縮工具mnncompress需要的稀疏參數(shù),得到權(quán)重部分?jǐn)?shù)稀疏為0的模型;
  3. 第三步,使用MNN convertor轉(zhuǎn)換模型;
  4. 運(yùn)用MNN工作臺(tái)(https://www.mnn.zone/m/0.3/) ,部署模型到mnn運(yùn)行環(huán)境中。整套流程集成再M(fèi)NN工作臺(tái),大大提升了AI的開(kāi)發(fā)流程效率,感興趣的同學(xué)可以試用和聯(lián)系工作臺(tái)負(fù)責(zé)人”明弈“。

下圖所示,在稀疏度0.45情況下,稀疏自身方案對(duì)推理的加速比約1.2x, 業(yè)務(wù)指標(biāo)為圖像信噪比,從  34.728dB少量下降到34.502dB。對(duì)業(yè)務(wù)精度影響在接受范圍內(nèi)。

4.2 某語(yǔ)音模型

另一個(gè)業(yè)務(wù)方模型為某語(yǔ)音模型,下圖為構(gòu)造稀疏后在avx512下實(shí)測(cè)加速比,不同稀疏方法對(duì)加速會(huì)有影響,0.75稀疏度時(shí),輸入序列20時(shí)(典型場(chǎng)景1),下圖所示,稀疏與稠密模型相比,encoder1加速比 2.82x,  encoder2加速比3.02x。對(duì)于此方案達(dá)到預(yù)期的加速比。

5. 總結(jié)與展望

我們?cè)贛NN現(xiàn)有框架中,設(shè)計(jì)了通用稀疏卷積計(jì)算方案,使其數(shù)據(jù)布局、算子結(jié)構(gòu)配合既有MNN結(jié)構(gòu)、發(fā)揮出較高性能,而XNNPack的稀疏矩陣乘法只針對(duì)網(wǎng)絡(luò)pointwise類(lèi)卷積有加速。

第一點(diǎn),我們?cè)O(shè)計(jì)實(shí)現(xiàn)了推理性能優(yōu)于XNNPack的MNN稀疏加速方案;0.9稀疏度時(shí),CV模型在ARM端獲得3.16x-4.13x加速比,跨機(jī)型、跨模型加速效果都比較顯著。

第二點(diǎn),在實(shí)際業(yè)務(wù)模型中驗(yàn)證了業(yè)務(wù)精度指標(biāo),損失有限、可接受。

第三點(diǎn),推理耗時(shí)隨稀疏度增加線性下降,跨模型、cpu 一致;在小米6上,稀疏分塊1x4加速臨界值優(yōu)化到0.3,中高端機(jī)型甚至稀疏度0.1的時(shí)候可達(dá)臨界值。

第四點(diǎn),降低內(nèi)存占用隨稀疏度成正比,具體數(shù)值見(jiàn)性能分析部分。

在引擎實(shí)現(xiàn)、稀疏計(jì)算內(nèi)核、匯編代碼開(kāi)發(fā)中,經(jīng)常會(huì)從不及預(yù)想值開(kāi)始,在一次次調(diào)試中不斷加深對(duì)MNN既有邏輯的理解,優(yōu)化稀疏算子代碼、SIMD代碼,優(yōu)化數(shù)據(jù)布局,最終將綜合指標(biāo)提升到高水準(zhǔn)。

稀疏計(jì)算研發(fā)工作得以完成,非常感謝團(tuán)隊(duì)的同學(xué)通力協(xié)作!移動(dòng)端或服務(wù)端,量化加速在不同領(lǐng)域都相對(duì)常見(jiàn),指令集支持由來(lái)已久。而深度模型在CPU上的稀疏計(jì)算加速不斷發(fā)展,分別使用時(shí),二者各有相對(duì)優(yōu)勢(shì)。稀疏計(jì)算加速可以理解為一種 "可伸縮"等效位寬的技術(shù),這個(gè)角度可以探索更多獨(dú)特的應(yīng)用場(chǎng)景。

責(zé)任編輯:張燕妮 來(lái)源: 阿里巴巴移動(dòng)技術(shù)
相關(guān)推薦

2023-07-13 11:03:12

2022-05-11 12:52:25

框架實(shí)踐應(yīng)用

2021-06-09 18:52:05

方案設(shè)計(jì)庫(kù)存數(shù)

2022-08-20 07:28:44

?數(shù)據(jù)地圖大數(shù)據(jù)數(shù)據(jù)血緣

2023-02-06 09:36:00

騰訊燈塔融合引擎

2009-05-26 11:24:00

2021-12-27 08:47:44

Go設(shè)計(jì)性能

2010-08-25 17:18:10

DHCP服務(wù)器

2021-11-30 23:53:28

數(shù)據(jù)庫(kù)方案

2023-04-12 08:43:25

2022-05-10 00:03:48

業(yè)務(wù)存儲(chǔ)結(jié)構(gòu)方案

2019-07-25 08:14:40

RedisJava數(shù)據(jù)庫(kù)

2025-01-06 00:38:12

2013-06-05 11:15:10

2009-07-06 20:55:48

Linux全訪問(wèn)控制模型方案設(shè)計(jì)

2018-01-11 15:43:41

人臉識(shí)別Google阿里

2012-11-01 16:44:45

云計(jì)算

2010-06-05 15:49:18

票務(wù)管理系統(tǒng)方案

2023-11-21 07:21:39

火山引擎計(jì)算治理自動(dòng)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)