關於量化【轉載以學習、回憶】
關於量化 還不明白
轉載一篇以學習、回憶
來源連結:https://zhuanlan.zhihu.com/p/86900556
何謂量化,打個比方,看 1080p 太慢,於是降到 720p 看。
同樣的,如果用完整 32 位訓練和儲存的模型看作 1080p 的話,那麼量化完後模型就可以當作是 720p,如此一來,模型自然變小,速度自然加快。
關於量化實際使用,根據實現細節涉及到好些不同分類。比如說真量化(Real Quantization)與偽量化(Pseudo Quantization),訓練後量化(Post Training Quantization)與訓練中量化(During Training Quantization),最近 pytorch 1.3 文件中還有,動態量化(Dynamic Quantization)與靜態量化(Static Quantization),看得人頭暈。
真量化
首先真量化,便是一般意義上想的,將模型中引數表示用低精度來表示。
比較常用的方法就是直接通過:
來將高精度(比如說32位)矩陣轉換成低精度(比如說8位),之後矩陣運算使用低精度,而結果則用 scale 和 zero_point 這兩個引數來還原高精度結果。
還可以更進一步,不光矩陣運算,整個模型中的運算都用低精度(比如啟用函式)
偽量化
而關於偽量化,實際的運算過程和一般情況下跑模型沒有太大區別,其實也都是 32 位運算,而增加的操作就是將模型用低精度表示儲存,然後實際運算中查表近似還原的操作。
這裡要介紹一下,(這裡應該說的是偽量化)量化中運用很廣泛的一個演算法k-means quantization
因為實際運算用的還是完整精度,因此也被稱為偽量化。
訓練後量化與訓練中量化
首先訓練後量化,其實大概就類似上面說的k-means quantization過程。
而訓練中量化,一般會用一個演算法quantization-aware training。大概過程是:
- 量化權重
- 通過這個量化的網路計算損失
- 對沒量化權重計算梯度
- 然後更新未量化權重
訓練結束後,量化權重用量化後的模型直接進行預測。
pytorch量化文件https://pytorch.org/docs/master/quantization.html