天天看點

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

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

O_o

>_<

o_O

O_o

~_~

o_O

  本文主要聊一下深度學習模型量化相關政策。

  模型小型化是算法部署的關鍵技術,模型小型化的過程通常用模型量化來描述。量化通常是高比特位到低比特位的映射過程,量化的對象既可以是權重資料,也可以是激活值。量化方式具有多種形态,不管是混合量化、還是全整型量化;不管是單層量化、成組量化、還是整網量化,都存在浮點數映射到整型數的過程,這個過程一定存在精度損失,而對于我們來說,要做的是把精度損失控制在可接受的範圍。

  量化又可以分為後量化、訓練時量化又或是量化感覺訓練。後量化相比訓練時量化,是一種更加高效和無侵入式的算法加速技術,這裡主要聊一下後量化,包括一些主要的量化類型和量化政策:

  • 量化類型:非對稱量化和對稱量化、非線性量化和線性量化;
  • 量化政策:MinMax、KLD、ADMM、EQ;

文章目錄

    • 1、量化類型
      • 1.1 非對稱量化和對稱量化
      • 1.2 非線性量化和線性量化
    • 2、量化政策
      • 2.1 MinMax 量化
      • 2.2 KLD 量化
      • 2.3 ADMM 量化
      • 2.4 EQ 量化
    • 3、量化實驗

1、量化類型

1.1 非對稱量化和對稱量化

  非對稱量化是比對稱量化更加廣義的概念,對稱量化是非對稱量化的一種特殊情況。

  非對稱量化也就是帶有偏置的線性映射,其數學表達可以是這樣:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  其中 Z 不一定等于 0,代表浮點數的零點不一定對應整型的零點。E() 代表截斷函數,作用是使其截斷到對應整型的數值表述範圍内。對于非對稱量化,滿足如下的限制:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  上述限制中,T1 和 T2 是對于浮點數的截斷範圍,也就是非對稱量化的門檻值。通過換算可以得到門檻值和線性映射參數 S 和 Z 的數學關系,在确定了門檻值後,也就确定了線性映射的參數。

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  對稱量化可以看作非對稱量化當 Z = 0 時的一種特殊情況,滿足 T1 = -T2,此時的門檻值和線性映射參數的數學關系如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

1.2 非線性量化和線性量化

  線性量化往往又被稱為均勻量化,這在目前的算法落地中是最常用的,上面提到的非對稱量化和對稱量化也是基于線性量化的。非線性量化實際用的比較少,以 LOG 量化為代表。

  不同的量化方式對資料分布具有選擇性。對于均勻量化,假設資料在整個表達空間内均勻分布,在均勻分布下線性量化是一種較好的量化方式。 LOG 量化則可以保證數值空間内相對誤差的最優化,這是目前大部分非線形量化的目标,通過對資料分布的分析,可以提升高密度資料區域的表達能力。

  舉個例子,假設我要對一組資料 x 進行 int8 對稱量化,量化範圍為 (-a, a),對于線性量化,可以用以下數學式進行表達:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  同樣的,對于 LOG 非線性量化可以用如下式子進行表達:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

2、量化政策

  從上述的映射關系中,如果知道了門檻值,那麼其對應的線性映射參數也就知道了,整個量化過程也就明确了。那麼該如何确定門檻值呢?一般來說,對于權重的量化,由于權重的資料分布是靜态的,一般直接找出 MIN 和 MAX 線性映射即可;而對于推理激活值來說,其資料分布是動态的,為了得到激活值的資料分布,往往需要一個所謂校準集的東西來進行抽樣分布,有了抽樣分布後再通過一些量化算法進行量化門檻值的選取。

2.1 MinMax 量化

  MinMax 是最簡單的量化方法,量化示意如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  MinMax 其實就是簡單的把浮點數直接映射到 int8 的資料範圍,MinMax 方法由浮點映射到定點的數學表達如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  其中,R:真實浮點值(fp32);Q:量化後的定點值(int8,Q屬于[-127, 127]);Z:表示0浮點值對應的量化定點值;S:定點量化後可表示的最小刻度。

  這種量化方式,主要關注浮點範圍的最大值和最小值,然後通過尺度 S 線性映射。這種量化方法往往會使精度下降較多,一般後面還會跟一個 requantize 的微調優化。實際上,把 MinMax 量化應用于網絡權重這樣靜态分布的資料的時候,對于網絡推理最後的精度損失影響不大,且量化操作開銷更小,量化過程效率更高,這是 Nvidia 經過大量實驗得出的結論。

2.2 KLD 量化

  KLD 量化是用 KL 散度來衡量兩個分布之間的相似性,是 Nvidia TensorRT 中對于激活值采用的量化方法,KLD 量化的示意如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ
  • 這種方法不是直接将 [min, max] 映射到 [-127,127],而是去尋找一個門檻值|T| < max(|max|, |min|),将其 [-T, T] 映射到 [-127, 127]。認為隻要門檻值選取得當,就能将門檻值外的值舍棄掉,也不會對精度損失造成大的影響;
  • 超出門檻值 ±|T| 外的直接映射為門檻值。比如上圖中的三個紅色點,直接映射為-127,這種映射關系為飽和的(Saturate );

  KLD 量化方法試圖将 fp32 數值分布和 int8 數值分布抽象成兩個分布,用門檻值 |T| 來更新兩個數值分布,并用 KL 散度來衡量兩個分布的相似性,若 KL 散度值越小,說明這兩個分布越相似,也說明這個門檻值 |T| 選擇的最好。

  下面的圖是 TensorRT 中的關于 KL 散度校準的僞代碼,這個圖也完美诠釋了 KLD 整個量化過程。

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

2.3 ADMM 量化

  ADMM 交替方向乘子法,是優化函數的一種方式,一般用于帶有限制的最優解問題。類似的,梯度下降法、牛頓下降法、拉格朗日乘子法也是類似的優化方法。

  其通用優化式子如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  在 ADMM 中,其等價的優化式,也就是拉格朗日式如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  同拉格朗日乘子法不同的是,ADMM 采用的是類似于分布疊代的方式獲得最終解。其采用如下的步驟:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  下面我們将量化門檻值的選取政策變換成 ADMM 算法,利用前面所說的對稱量化方法,把量化當成一個編碼問題,編碼再加上解碼,就還原出了可以跟原始資料進行對比的資料。這樣的邏輯下,将優化目标設計成如下表達:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  2-範式易于求導,那麼上述的優化目标可以轉換成如下形式:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  個人認為在對于對稱量化不需要使用 ADMM,因為隻有一個變量,使用梯度下降法也是可以得到最終的s。

2.4 EQ 量化

  EQ 量化即 EasyQuant,是格靈深瞳開源的量化算法,在文章《EasyQuant: Post-training Quantization via Scale Optimization》中進行了介紹。EQ 量化方法的主要思想是:誤差累計、整網決策變成單網決策、以餘弦相似度為優化目标、交替優化權重縮放系數和激活值縮放系數。

  假設量化公式如下(為了友善起見,采用對稱量化進行說明):

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  假設量化目标精度為 IntN,其中的 clip 函數表示把量化後的數值規範到整型範圍,如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  EQ 量化算法把縮放系數 S 的獲得看成數學優化問題,将優化目标進行了如下表達:假設傳入的校準集中樣本個數為 N、被量化模型的網絡層個數為 L,Qil 表示未量化推理時第 l 層網絡層的第 i 個樣本的輸出值,Q^il 表示量化推理時第 l 層網絡層的第 i 個樣本的輸出值,因為誤差累計和問題分解的手段,使用餘弦相似度作為評判标準,最終的優化目标如下所示:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  其中 Qil 和 Q^il 在該層為卷積的時候為:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  EQ 算法最大的亮點在于對權重的縮放系數也進行了優化,其他的量化門檻值選取政策基本是不考慮對權重的縮放系數進行優化,直接使用 Min-Max 得到縮放系數。加入了權重的縮放系數的優化變量,導緻了多變量優化問題。如若按照正常的方式進行多變量優化,該優化目标往往難以解析,EQ 給出的解法是使用交替優化權重激活系數和激活縮放系數。

  EQ 算法流程如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

3、量化實驗

  這裡選取了 KLD 和 ADMM 兩種量化算法進行了一些實驗模拟。

  使用 python numpy 創造随機資料分布,下面均是以正太分布進行試驗。對同個分布分别使用 KL 和 ADMM 算法進行門檻值計算。

  以下是三次試驗的結果:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ
【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ
【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  使用 KLD 和 ADMM 算法得到的門檻值如下:

【模型推理】談談幾種量化政策:MinMax、KLD、ADMM、EQ

  實驗小結:單從試驗結果可知,ADMM 得到的量化門檻值總是比 KLD 的量化門檻值要高,基本穩定在

max(|均值-3 * 标準差|,|均值+ 3 * 标準差|)

。按照正太分布的定義,ADMM 的門檻值會覆寫 99.99% 分布的資料,因為其優化目标難以忍受太小的門檻值,那樣會讓門檻值外的數值量化 + 反量化後誤差極大。

  以上聊了一下一些量化算法相關的東西,包括量化類型、量化政策以及貼了個試驗分析,關于量化是一個實用且值得深挖的領域,有問題歡迎讨論,我也在學習中~

  好了,收工~

 【公衆号傳送】

繼續閱讀