TensorRT8 使用手記(1)模型測(cè)試 Conv+BN+Relu 結(jié)構(gòu)融合

Conv+BN+Relu 結(jié)構(gòu)

在主流卷積神經(jīng)網(wǎng)絡(luò)模型中Conv+BN+Relu是一種常見的模型結(jié)構(gòu)盒犹。在模型推理和訓(xùn)練中牵祟,BN層往往與其他層合并痪蝇,以減少計(jì)算量。

模型解析

node_of_325

[TRT] Parsing node: node_of_325 [Conv]
[TRT] Searching for input: 324
[TRT] Searching for input: layer1.0.conv1.weight
[TRT] node_of_325 [Conv] inputs: [324 -> (-1, 64, 56, 56)[FLOAT]], [layer1.0.conv1.weight -> (128, 64, 1, 1)[FLOAT]],
[TRT] Convolution input dimensions: (-1, 64, 56, 56)
[TRT] Registering layer: node_of_325 for ONNX node: node_of_325
[TRT] Using kernel: (1, 1), strides: (1, 1), prepadding: (0, 0), postpadding: (0, 0), dilations: (1, 1), numOutputs: 128
[TRT] Convolution output dimensions: (-1, 128, 56, 56)
[TRT] Registering tensor: 325 for ONNX tensor: 325
[TRT] node_of_325 [Conv] outputs: [325 -> (-1, 128, 56, 56)[FLOAT]],

node_of_326

[TRT] Parsing node: node_of_326 [BatchNormalization]
[TRT] Searching for input: 325
[TRT] Searching for input: layer1.0.bn1.weight
[TRT] Searching for input: layer1.0.bn1.bias
[TRT] Searching for input: layer1.0.bn1.running_mean
[TRT] Searching for input: layer1.0.bn1.running_var
[TRT] node_of_326 [BatchNormalization] inputs: [325 -> (-1, 128, 56, 56)[FLOAT]], [layer1.0.bn1.weight -> (128)[FLOAT]], [layer1.0.bn1.bias
n1.running_mean -> (128)[FLOAT]], [layer1.0.bn1.running_var -> (128)[FLOAT]],
[TRT] Registering layer: node_of_326 for ONNX node: node_of_326
[TRT] Registering tensor: 326 for ONNX tensor: 326
[TRT] node_of_326 [BatchNormalization] outputs: [326 -> (-1, 128, 56, 56)[FLOAT]],

node_of_327

[TRT] Parsing node: node_of_327 [Relu]
[TRT] Searching for input: 326
[TRT] node_of_327 [Relu] inputs: [326 -> (-1, 128, 56, 56)[FLOAT]],
[TRT] Registering layer: node_of_327 for ONNX node: node_of_327
[TRT] Registering tensor: 327 for ONNX tensor: 327
[TRT] node_of_327 [Relu] outputs: [327 -> (-1, 128, 56, 56)[FLOAT]],

優(yōu)化

在TensorRT中會(huì)對(duì)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行垂直整合喻旷,即將 Conv生逸、BN、Relu 三個(gè)層融合為了一個(gè)層,即CBR融合

Scale fusion

[TRT] Fusing convolution weights from node_of_325 with scale node_of_326

在BN層中槽袄,首先對(duì)輸入X進(jìn)行歸一化(mean_{BN}輸入張量的均值烙无,var_{BN}輸入張量的方差),然后對(duì)歸一化的結(jié)果進(jìn)行比例縮放和位移遍尺。[1][2]

Y = \frac{X -mean_{BN}}{\sqrt{ var_{BN} + epsilon}} * scale + B

展開可得:

Y = \frac{X * scale }{\sqrt{ var_{BN} + epsilon}} + B - \frac{scale * mean_{BN}}{\sqrt{ var_{BN} + epsilon}}

W_{BN} = \frac{scale}{\sqrt{ var_{BN} + epsilon}} b_{BN} = B - \frac{scale * mean_{BN}}{\sqrt{ var_{BN} + epsilon}}帶入替換后可得:

Y = W_{BN}*X+b_{BN}

此時(shí)可以將BN層視為一個(gè)1x1卷積層截酷。

BN層的輸入特征(Conv層的輸出特征)X的形狀為C×H×W,對(duì)于Conv層:

  • 卷積核大小為k
  • 權(quán)重為W_{Conv}乾戏,偏置為b_{Conv}
  • 通道數(shù)為C_{Conv}

X = W_{Conv}*X_{Conv}+b_{Conv}迂苛,因此BN與Conv融合之后
Y = W_{BN}*(W_{Conv}*X_{Conv}+b_{Conv})+b_{BN}

融合之后:

  • 權(quán)重為 W = W_{BN}*W_{Conv}
  • 偏置為 b = W_{BN}*b_{Conv}+b_{BN}

ConvRelu fusion

[TRT] ConvReluFusion: Fusing node_of_325 with node_of_327

線性整流函數(shù)(Rectified Linear Unit, ReLU)即:f(x) = max(0,x),又稱修正線性單元鼓择,是一種人工神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)(activation function)三幻。

ReLU 函數(shù)

在神經(jīng)網(wǎng)絡(luò)中,線性整流作為神經(jīng)元的激活函數(shù)惯退,定義了該神經(jīng)元在線性變換之后的非線性輸出結(jié)果赌髓。換言之,對(duì)于來自上一層卷積層的輸入向量X催跪,使用線性整流激活函數(shù)可以得到輸出:
Y = max(0,W*X+b)

在Int8量化模型中锁蠕,Conv+ReLU 一般也可以合并成一個(gè)Conv進(jìn)行運(yùn)算[3]

對(duì)于Int8ReLU懊蒸,其計(jì)算公式可以寫為 :

Y = (max(0,round(\frac{X}{Scale_{in}}+Zeropoint_{in}) )- Zeropoint_{out})* Scale_{out}

zeropoint和scale

由于ReLU的輸入(數(shù)值范圍為(-n,n))和輸出(數(shù)值范圍為(0,n))的數(shù)值范圍不同荣倾,因此需要保證Zeropoint_{in}Zeropoint_{out}Scale_{in}Scale_{out} 是一致的骑丸。由于ReLU的截?cái)嗖僮魃嗳裕虼诵枰褂?img class="math-inline" src="https://math.jianshu.com/math?formula=Scale_%7Bout%7D" alt="Scale_{out}" mathimg="1"> 和 Zeropoint_{out},即對(duì)于ReLU的輸入通危,使用輸出對(duì)應(yīng)的 Scale_{out}Zeropoint_{out} 保證其對(duì)小于0截?cái)嗟妮斎脒M(jìn)行截?cái)嘀恚瑢?duì)大于等于0的輸入映射至[0,255]范圍內(nèi)。

INT8卷積

在Int8Conv的計(jì)算過程中菊碟,首先使用量化計(jì)算公式 Q = round(\frac{R}{Scale}+ Zeropoint)對(duì)輸入和權(quán)重值進(jìn)行量化計(jì)算节芥,將其轉(zhuǎn)換為數(shù)值范圍為(0,255)的整數(shù),在完成卷積計(jì)算后再將計(jì)算結(jié)果進(jìn)行反量化計(jì)算逆害。而 ReLU 本身沒有做任何的數(shù)學(xué)運(yùn)算头镊,只是一個(gè)截?cái)嗪瘮?shù)。假設(shè)Int8Conv的卷積輸出為 122(scale_{conv} = \frac{1}{20}, zeropoint_{conv} = 128)魄幕,則對(duì)應(yīng)反量化輸出 -0.3相艇,經(jīng)過Int8ReLU(scale_{relu} = \frac{1}{255}, zeropoint_{relu} = 0),對(duì)該值進(jìn)行Int8量化纯陨,對(duì)應(yīng)的輸出為0坛芽。因此在ReLU層對(duì)輸入進(jìn)行截?cái)嘀傲舸ⅲ纯傻玫叫枰財(cái)嗟臄?shù)值。

因此靡馁,通過在完成卷積計(jì)算后直接使用 ReLU 后的 scale 和 zeropoint進(jìn)行反量化欲鹏,實(shí)現(xiàn)了將 ConvReLU融合。


  1. BatchNormalization https://hub.fastgit.org/onnx/onnx/blob/master/docs/Operators.md#BatchNormalization ?

  2. Speeding up model with fusing batch normalization and convolution http://learnml.today/speeding-up-model-with-fusing-batch-normalization-and-convolution-3 ?

  3. 神經(jīng)網(wǎng)絡(luò)量化入門--Folding BN ReLU https://zhuanlan.zhihu.com/p/176982058 ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臭墨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膘盖,更是在濱河造成了極大的恐慌胧弛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侠畔,死亡現(xiàn)場(chǎng)離奇詭異结缚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)软棺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門红竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喘落,你說我怎么就攤上這事茵宪。” “怎么了瘦棋?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵稀火,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我赌朋,道長(zhǎng)凰狞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任沛慢,我火速辦了婚禮赡若,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘团甲。我一直安慰自己逾冬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喧兄,像睡著了一般哈恰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霸株,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音集乔,去河邊找鬼去件。 笑死坡椒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尤溜。 我是一名探鬼主播倔叼,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宫莱!你這毒婦竟也來了丈攒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤授霸,失蹤者是張志新(化名)和其女友劉穎巡验,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碘耳,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡显设,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辛辨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捕捂。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斗搞,靈堂內(nèi)的尸體忽然破棺而出指攒,到底是詐尸還是另有隱情,我是刑警寧澤榜旦,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布幽七,位于F島的核電站,受9級(jí)特大地震影響溅呢,放射性物質(zhì)發(fā)生泄漏澡屡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一咐旧、第九天 我趴在偏房一處隱蔽的房頂上張望驶鹉。 院中可真熱鬧,春花似錦铣墨、人聲如沸室埋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姚淆。三九已至,卻和暖如春屡律,著一層夾襖步出監(jiān)牢的瞬間腌逢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工超埋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搏讶,地道東北人佳鳖。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像媒惕,于是被迫代替她去往敵國(guó)和親系吩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容