目錄
- 模型量化
模型量化
1、模型量化優點
- 低精度模型表示模型權重數值格式為FP16(半精度浮點)或者INT8(8位定點整數),但是目前低精度往往就指代INT8。
- 常規精度模型則一般表示模型權重數值格式為FP32(32位浮點,單精度)。
- 混合精度則在模型中同時使用FP32和FP16的權重數值格式。FP16減少了一半的內存大小,但有些參數或操作符必須采用FP32格式才能保持準確度。
2、模型量化方案
- data free:不適用校準集,直接將浮點數轉化成量化數。高通的DFQ不使用校準集也得到了很高的精度。
- calibration:基于校準集方案,通過輸入少量真實數據進行統計分析。
- finetune:基于訓練微調的方案,將量化誤差在訓練時仿真建模,調整權重使其更適合量化。好處是能帶來更大的精度提升,缺點是要修改模型訓練代碼,開發周期較長。
FP32轉Int8量化參考這篇博客:
Int8量化介紹
3、PTQ
訓練后量化(Post Training Quantizationi),也叫做離線量化,根據量化零點 x z e r o _ p o i n t x_{zero\_point} xzero_point?是否為0,訓練后量化分為對稱量化和非對稱量化;根據數據通道順序NHWC這一維度區分,訓練后量化分為逐層量化和逐通道量化。目前TensorRT使用逐層量化的方法,每一層采用同一個閾值進行量化。逐通道量化對每一層每個通道都有各自的閾值,對精度可以有一個很好的提升。
4、QAT
在線量化,即在模型訓練時加入偽量化節點,用于模擬模型量化時引起的誤差。偽量化節點就是模仿quantization-dequantization的過程。
論文中一般在activation后和conv weight之前加入偽量化節點。
4、量化的分類
- 二值化
- 線性量化:采用均勻分布的聚類中心,原始浮點數據和量化后的定點數據存在一個簡單的線性變換關系,因為卷積、全連接等網絡層本身只是簡單的線性計算,因此線性量化中可以直接用量化后的數據直接計算。
- 對數量化:一種比較特殊的量化方法。兩個同底的冪指數進行相乘,那么等價于其指數相加,降低了計算強度。同時加法也被轉變為索引計算。
5、對稱量化和非對稱量化
根據偏移量Z是否為0,可以將浮點數的線性量化分為兩類:對稱量化和非對稱量化。
對稱量化的浮點值和 8 位定點值的映射關系如下圖,從圖中可以看出,對稱量化就是將一個tensor中的[-max(|x|), max(|x|)]內的FP32值分別映射到8bit數據的[-128, 127]的范圍內,中間值按照線性關系進行映射,稱這種映射關系是對稱量化。可以看出,對稱量化的浮點值和量化值范圍都是相對于0對稱。
非對稱量化就是偏移量不為0,此時INT8的值域為[0, 255]。
權重量化浮點值可以分為兩個步驟:
1、通過在權重張量中找到min和max值從而確定 x s c a l e x_{scale} xscale?和 x z e r o p o i n t x_{zero_point} xzerop?oint?。
2、將權重張量的每個值從FP32轉換為INT8。
6、量化方法的改進