歡迎關注我的公衆号 [極智視界],擷取我的更多筆記分享
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 激活值量化需要在推理時進行;圖中間表示量化的卷積層運算;圖右邊表示怎麼和後續層進行銜接。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjcmbw5SY2cTZ2UjYjljYzcjY2MzNkN2YlBDZ2YmNlRGNlBTMy8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
以上描述的整個過程可以表示為 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 的常見結構進行了介紹。
有問題歡迎溝通,收工了~ 祝大家國慶快樂~
【公衆号傳送】