天天看點

【模型推理】談談模型量化組織方式

歡迎關注我的公衆号 [極智視界],擷取我的更多筆記分享

O_o

>_<

o_O

O_o

~_~

o_O

  本文主要聊一下深度學習模型量化組織方式。

  在我的這篇 《【模型推理】談談推理引擎的推理組織流程》文章裡對模型量化政策進行了一些介紹,有興趣的同學可以翻看一下。今天這裡主要聊一下實際推理中,怎麼來組織量化過程,涉及多層之間如何銜接的問題。這裡分兩個部分聊一下:量化模型結構、實際舉例說明。

文章目錄

    • 1、量化模型結構
    • 2、實際舉例
      • 2.1 Conv + Conv 結構
        • 2.1.1 網絡結構組織
        • 2.1.2 數學關系式
      • 2.2 Conv + RELU 結構
        • 2.2.1 RELU 量化的網絡結構組織
        • 2.2.2 RELU 量化的數學關系式
        • 2.2.3 RELU 不量化的網絡模型結構組織:
        • 2.2.4 RELU 不量化的數學表達式:

1、量化模型結構

  量化的操作會對網絡模型有什麼影響呢?下圖以卷積為例,圖左邊表示對輸入進行量化的過程,其中 Quantize Weight 權重量化在推理前就完成,Quantize Activation 激活值量化需要在推理時進行;圖中間表示量化的卷積層運算;圖右邊表示怎麼和後續層進行銜接。

【模型推理】談談模型量化組織方式

  以上描述的整個過程可以表示為 quantization -> compute -> dequantization / requantization,這樣就完成了一個量化的卷積結構。最近在适配新的卡,我拿一個 tf 架構量化好的網絡片斷展示一下。

【模型推理】談談模型量化組織方式

  可以看到上述結構中既有 quantization,也有 dequantization,這些看起來很正常。注意看黃色框,是做了把兩個量化層進行 tf.add 拼接的操作,tf.add 的功能十分豐富,可以做元素加、矩陣加、元素和矩陣加,也具有廣播的機制,總體來說,通過 tf.add 有兩種情況:(1)eltwise-add 次元不變,類似的算子有 darknet shortcut;(2)次元改變,類似算子有 darknet route、pytorch torch.nn.cat。對于常用的線性量化來說,類似算子拼接 concat / eltwise 的非線性變換對于正常量化來說其實并不友好。

2、實際舉例

  為了對模型量化的組織方式進行更加好的說明,這裡我進行了一些舉例。

2.1 Conv + Conv 結構

2.1.1 網絡結構組織

  假設兩個 conv 都進行量化。

  還未量化時的模型結構如下所示:

【模型推理】談談模型量化組織方式

  在經過權重量化和激活值量化後,結構示意如下:

【模型推理】談談模型量化組織方式

  上圖中 Sr1_FxP 為定點數,不少推理架構在實際推理中會進行算子融合,進而減少層與層之間的資料搬運開銷,一般會把資料搬運的對象轉換為 INT 類型的 Tensor。算子融合示意如下:

【模型推理】談談模型量化組織方式

  不同于正常的 conv + bn + relu 的算子融合,這裡其實是做量化過程特有的 conv1 + requantize 的融合,完了會得到如下 quantizedConv2d 的算子層。

【模型推理】談談模型量化組織方式

2.1.2 數學關系式

  對于量化過程,不隻是需要對量化算子計算縮放系數,還需要進行量化網絡結構組織,以及算子參數計算。

  假設卷積的數學表達式如下:

【模型推理】談談模型量化組織方式

  激活值量化和權重量化的數學表達如下:

【模型推理】談談模型量化組織方式

  将上式代入原始卷積表達式中,可以得到如下式子:

【模型推理】談談模型量化組織方式

  由于緊接着下一層還要量化,是以 y 也需要量化,其量化方式如下:

【模型推理】談談模型量化組織方式

  将上式代入卷積表達式中,得到了如下式子:

【模型推理】談談模型量化組織方式

  根據上式,假設模型壓縮後的卷積核參數為 wq,偏置為 bq,後一層 Requantize 的定點數參數為 Sr1_FxP,那麼可以得到如下對應關系:

【模型推理】談談模型量化組織方式

  把上式代入,得到融合後的卷積量化公式是如下,其中qx、wq、qy 一般是 int8 資料類型,bq、qy1 一般是 int32 資料類型,Sr1_FxP 是個定點數:

【模型推理】談談模型量化組織方式

  上述的資料表達可以對應到如下示意圖:

【模型推理】談談模型量化組織方式

  接下來介紹下 Requantize 層的計算是如何實作的,從 Requantize 的計算公式定義可知,Requantize 層實作了把一個範圍的整型數映射到了另一個範圍的整型數,以下是 Requantize 的計算方式:

【模型推理】談談模型量化組織方式

  上述式子中 k 為定點數的小數點所占比特位長度,>>k 表示比特位右移的操作。

2.2 Conv + RELU 結構

  假設這個結構有兩種量化形式:(1)conv 量化 + relu 量化;(2)conv 量化 + relu 不量化。

2.2.1 RELU 量化的網絡結構組織

  假設 Conv 和 RELU 都進行量化。

  未量化的模型結構如下:

【模型推理】談談模型量化組織方式

  經過激活值量化和權重量化後的結構示意如下:

【模型推理】談談模型量化組織方式

  上圖中 Sr1_FxP 為定點數,若進行算子融合,會得到如下示意圖:

【模型推理】談談模型量化組織方式

2.2.2 RELU 量化的數學關系式

  這裡沿用第一個例子的假設變量,同時假設 X4_INT 為 k,那麼對于 RELU 函數的量化,我們可以得到如下的數學表達式:

【模型推理】談談模型量化組織方式

  其中最關鍵的思想是:不管是 qy > zy,還是 qy <= zy,都使用了 clip 截斷函數代替了 RELU,因為使用 clip 截斷到 0 以上的範圍,就相當于進行了 RELU 操作。

  假設模型壓縮後的卷積核參數為 wq,其偏置為 bq,後一層 Requantize 的定點數參數為 Sr1_FxP,這個時候 RELU 這個層就相當于沒有了,那麼可以得到如下對應關系:

【模型推理】談談模型量化組織方式

  把上式代入,得到融合後的卷積量化公式是如下,其中 qx、wq、qy 一般是 int8 資料類型,bq、qy1 一般是 int32 資料類型,Sr1_FxP 是個定點數:

【模型推理】談談模型量化組織方式

2.2.3 RELU 不量化的網絡模型結構組織:

  如下圖所示,此時可以将 Conv1 和 Dequantize 進行算子融合,減少資料傳輸次數,其中 X2_INT 一般是 int32 資料類型。

【模型推理】談談模型量化組織方式

2.2.4 RELU 不量化的數學表達式:

  融合後,輸入是 int8 資料類型,輸出是浮點資料類型,數學表達如下:

【模型推理】談談模型量化組織方式

  同樣可以得到量化後的卷積參數如下:

【模型推理】談談模型量化組織方式

  Dequantize 層有兩種運算方案:

 (1)浮點化整數,Sr1_FxP 也采用浮點運算存儲,這一步就相當于直接采用了浮點運算進行縮放;

 (2)類似于 Requantize 層的操作,也就是

(定點小數 * 整數) = (整數 * 整數,然後右移小數位長度)

,隻是這裡 Dequantize 輸出為浮點數而已。

  以上聊了一下模型量化的組織方式,并拿 Conv + Conv、Conv + RELU 的常見結構進行了介紹。

  有問題歡迎溝通,收工了~ 祝大家國慶快樂~

 【公衆号傳送】

繼續閱讀