1. 程式人生 > 其它 >關於量化【轉載以學習、回憶】

關於量化【轉載以學習、回憶】

關於量化 還不明白

轉載一篇以學習、回憶

來源連結: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

。具體做法是,先拿到模型完整表示的矩陣權重 W,之後用 k-means 演算法將裡面引數聚成 N 個簇。然後將 W 根據聚成的簇,轉化成 1 到 N 的整數,每個分別指向各個簇中心點。這樣就能將 32 位降到只有 log(N)位,大大減小了儲存空間。而使用時只需要按照對應的 N 查表還原就行。

因為實際運算用的還是完整精度,因此也被稱為偽量化。

訓練後量化與訓練中量化

首先訓練後量化,其實大概就類似上面說的k-means quantization過程。

而訓練中量化,一般會用一個演算法quantization-aware training。大概過程是:

  1. 量化權重
  2. 通過這個量化的網路計算損失
  3. 對沒量化權重計算梯度
  4. 然後更新未量化權重

訓練結束後,量化權重用量化後的模型直接進行預測。

pytorch量化文件https://pytorch.org/docs/master/quantization.html