TensorRT、TensorFlow Lite模型量化比較

優點:

以FP32到INT8量化爲例,模型存儲佔用減小爲1/4;

增加數據throughput。

 

什麼是量化:

表達式:

示意圖:

爲什麼不使用線性量化(y=ax+b)?因爲線性量化後做乘運算會改變分佈。

怎麼量化:

TensorFlow Lite量化:

訓練後量化和量化訓練兩種方式。

訓練後量化方式:

過程:1.權重量化. 2.infer校準數據集統計activations的最大最小值以量化activations(可選項。對於移動手機來說有浮點計算單元且量化需求沒那麼高可以只量化權重,對於邊緣計算芯片來說可能有的只支持定點計算,這就需要全量化模型。).

小結:對於大模型來說參數冗餘比較高,直接量化精度損失比較小,但是對於小模型來說參數冗餘低,直接量化精度損失比較大。所以訓小模型最好使用量化訓練方式。

量化訓練方式:

過程:1.訓練模擬定點模型(卷積參數爲定點數,batch normalization參數爲高精度浮點數。注:The forward-pass models quantization, while the backward-pass models quantization as a straight-through estimator,關於straight-through estimator參考論文“Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations”)同時統計activations的分佈。2.combines batch normalization with the preceding convolutional layer。3.模擬定點模型轉全定點模型。

思考:按照TensorRT的量化方案(下面有介紹)來說weights量化對精確率沒有什麼影響,activations量化對精確率影響較大,這裏在訓練模擬定點模型時統計activations分佈最後直接量化轉定點模型似乎有點粗暴,實驗結果也表明小模型會損失1-2個點。轉全定點模型後再fine-tunning網絡會比較好,精確率可以再恢復一點(實習時公司的方案會多這一步,小模型精確率損失0.x個點)。

小結:相對於訓練後量化方式過程更復雜一些。量化後小模型平均精度損失1-2個點。

 

TensorRT量化:

訓練後量化。過程:

 關鍵點在於第三步:通過校準算法獲得最優的尺度因子。

通常來說權重和偏置在訓練過程中通過L2正則化會趨於(-1,1)之間分佈,量化weights對精確率影響不會太大,但是經過激活後輸出值的分佈不均,量化activations對精確率影響較大。此時採用下圖左邊的量化方式會對結果產生較大的影響(可以想象一個極端的例子,假如數據都是正值且分佈比較集中,那麼量化到int8時可能只有一兩個值表示),因此就需要考慮下圖右邊的量化方式,同時也引入了一個新的問題:尋找最優threshold值。

這個問題可以通過最小化相對熵解決(相對熵原理可以自行百度), 公式如下:

Kullback-Leibler\,divergence = \sum p(x)log\frac{p(x)}{q(x)}

其中,p(x)表示FP32激活的分佈,q(x)表示量化激活的分佈。這樣通過迭代計算不同的threshold的KL divergence便可確定最優threshold值。從而確定最優尺度因子。

小結:相比TensorFlow Lite量化方式簡單,大模型精度損失0.x個百分點。

 

全量化模型infer過程:

輸入量化,量化輸入與量化參數卷積,激活量化,量化輸入與量化參數卷積。。。

weights量化模型infer過程:

與全量化模型infer過程不同之處在於,卷積計算時仍是floating-point kernel,即量化weights會轉化爲浮點數參與計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章