網絡模型量化
模型量化
以更少位數的數據類型用於近似表示32位有限範圍浮點型數據的過程
模型的輸入輸出依然是浮點型
達到減少模型尺寸大小、減少模型內存消耗及加快模型推理速度等目標
原理
- 模型量化橋接了定點與浮點,建立了一種有效的數據映射關係,使得以較小的精度損失代價獲得了較好的收益
- 由浮點到定點的量化
- 由定點到浮點反量化
優缺點
好處
- 減小模型尺寸,如8位整型量化可減少75%的模型大小
- 減少存儲空間,在邊緣側存儲空間不足時更具有意義
- 易於在線升級,模型更小意味着更加容易傳輸
- 減少內存耗用,更小的模型大小意味着不需要更多的內存
- 加快推理速度,訪問一次32位浮點型可以訪問四次int8整型,整型運算比浮點型運算更快
- 減少設備功耗,內存耗用少了推理速度快了自然減少了設備功耗
- 支持微處理器,有些微處理器屬於8位的,低功耗運行浮點運算速度慢,需要進行8bit量化
缺點
- 模型量化增加了操作複雜度,在量化時需要做一些特殊的處理,否則精度損失更嚴重
- 模型量化會損失一定的精度,雖然在微調後可以減少精度損失,但推理精度確實下降
TF模型的兩類量化方式
針對已經訓練好的模型進行量化
-
TensorFlow Lite converter
-
TensorFlow Lite Optimizing COnverter(toco命令工具)
-
需要結合業務場景及所擁有的硬件資源選擇量化的方式,目的是以最小損失達到最大化模型量化效果
-
訓練後量化幾種方案
-
混合量化–僅量化權重
- 浮點型的權重量化爲int8整型,可將模型大小直接減少75%、提升推理速度最大3倍
- 推理的過程中,需要將int8量化值反量化爲浮點型後再進行計算
- 如果某些Ops不支持int8整型量化,那麼其保存的權重依然是浮點型的
-
全整型量化–權重和激活值都進行量化
- 試圖將權重、激活值及輸入值均全部做int8量化,並且將所有模型運算操作置於int8下進行執行,以達到最好的量化效果
- 需要一個具有代表性的小數據集,用於統計激活值和輸入值等的浮點型範圍,以便進行精準量化
-
半精度float16量化–僅量化權重
- 將權重量化爲半精度float16形式,其可以減少一半的模型大小、相比於int8更小的精度損失
- 如果硬件支持float16計算的話那麼其效果更佳
- 在CPU運行時,半精度量化也需要像int8量化一樣進行反量化到float32在進行計算
- GPU可以支持float16運算
-
TF量化感知訓練(Quantization-aware training)
-
僞量化的過程
-
在可識別的某些操作內嵌入僞量化節點(fake quantization nodes)
-
用以統計訓練時流經該節點數據的最大最小值,便於在使用TOCO轉換tflite格式時量化使用並減少精度損失
-
需要對訓練和推理過程添加代碼
- 第一步,在訓練圖結構內添加僞量化節點
- 第二步,重寫推理圖結構並保存爲新的模型
- 第三步,轉換模型爲全量化模型
-
兩種方式的有缺點比較
- 兩者均可達到模型量化的作用
- 兩者的推理工作原理是一樣的
- 兩者都可工作在Tensorflow lite推理框架下並進行相應加速
- 訓練後量化工作量稍微簡單些,而量化感知訓練工作量更繁瑣一些
- 量化感知訓練比訓練後量化損失的精度更少,官方推薦使用量化感知訓練方式