1. 程式人生 > 其它 >[論文理解] Quantizing Deep Convolutional Networks For Efficient Inference A Whitepaper

[論文理解] Quantizing Deep Convolutional Networks For Efficient Inference A Whitepaper

Quantizing Deep Convolutional Networks For Efficient Inference A Whitepaper

Question:到底加速在哪?

Nvidia官網上的一張圖

非對稱量化

\[\begin{aligned}x_{i n t} &=\operatorname{round}\left(\frac{x}{\Delta}\right)+z \\x_{Q} &=\operatorname{clamp}\left(0, N_{\text {levels }}-1, x_{i n t}\right)\end{aligned} \]

第一步,先轉int32,對原始資料除以delta + zero-point

第二步,把int8之外的資料剔除,將其儲存在8bit儲存單元中。

反量化:

\[x_{\text {float }}=\left(x_{Q}-z\right) \Delta \]

需要注意一點,反量化沒有誤差。

假設量化後的資料和量化前的資料可以一一對應,那麼反量化操作是可以完全恢復原始資料的!!

那有了量化後的資料我們怎麼得到運算元運算之後的資料呢??

卷積量化:

\[\begin{aligned}y(k, l, n) &=\Delta_{w} \Delta_{x} \operatorname{conv}\left(w_{Q}(k, l, m ; n)-z_{w}, x_{Q}(k, l, m)-z_{x}\right) \\y(k, l, n) &=\operatorname{conv}\left(w_{Q}(k, l, m ; n), x_{Q}(k, l, m)\right)-z_{w} \sum_{k=0}^{K-1} \sum_{l=0}^{K-1} \sum_{m=0}^{N-1} x_{Q}(k, l, m) \\&-z_{x} \sum_{k=0}^{K-1} \sum_{l=0}^{K-1} \sum_{m=0}^{N-1} w_{Q}(k, l, m ; n)+z_{x} z_{w}\end{aligned} \]

缺點是計算略微複雜了一點。z!!

對稱量化

讓z=0

原因:

zero-padding 不要有誤差。

缺點,對不關於0對稱的資料不友好,比如relu啟用後的資料,浪費位元了。

隨機量化

\[\begin{aligned}x_{\text {int }} &=\operatorname{round}\left(\frac{x+\epsilon}{\Delta}\right)+z, \quad \epsilon \sim \operatorname{Unif}\left(-\frac{1}{2}, \frac{1}{2}\right) \\x_{Q} &=\operatorname{clamp}\left(0, N_{\text {levels }}-1, x_{i n t}\right)\end{aligned} \]

論文中說:

不解。說是對梯度計算有好處? 從這個公式怎麼看出來對梯度有好處?

感知量化

量化訓練的問題:clamp不可導 → 梯度幾乎處處為0;

解決:跳過clamp函式,梯度計算直接用量化前的權重計算,而不是量化反量化之後的權重計算。

量化引數選取

KL div

Intuition: KL散度衡量的是用Q分佈來編碼真實分佈P時產生的資訊損耗;如果這個資訊損失夠小,那麼這顯然是很好的量化結果。

目的:

得到一個最佳threshold

演算法:

從一個最小值(應該是超參)到包含所有資料的最大值開始依次試,每次計算量化前後的KL div,取最小的那個結果對應的thre。

量化粒度

層間量化的效果不如每個channel量化的效果。粒度越細效果越好。

訓後量化

  1. 只量化權重 : 不需要資料
  2. 權重和啟用值都量化: 需要資料

(1)per-channel量化的效果跟原始結果已經非常接近了。

(2)資料量化幾乎是沒損失的,因為bn使得資料變得0均值小方差,relu6這樣的啟用函式將數值限制在了0到6,這都有利於量化。

(3)越大的模型(resnet)對量化越robust(相比於mibilenet)

(4)層間量化精度掉的非常多。

(5)幾乎所有的精度損失都來自於權重量化,而非資料量化。

BN的一些問題

merge加速

\[x_{b n}=\gamma\left(\frac{x-\mu_{B}}{\sigma_{B}}\right)+\beta \]

相當於對上一層的卷積的權重相乘,加上一個新bias

\[\begin{aligned}W_{i n f} &=\frac{\gamma W}{\sigma} \\\text { Bias }_{i n f} &=\beta-\frac{\gamma \mu}{\sigma}\end{aligned} \]

但是由於訓練過程中sigma和u都是和資料有關的,而且是和batch內資料非常相關,因此sim quant權重可能會因此不穩定。

Solution:量化反量化前用滑動平均,之後再恢復。