MegEngine 使用小技巧:量化
常見神經(jīng)網(wǎng)絡(luò)模型所用的 Tensor 數(shù)據(jù)類型 一般是 float32 類型, 而工業(yè)界出于對特定場景的需求(極少的計算資源,極致的推理速度),需要把模型的權(quán)重和或激活值轉(zhuǎn)換為位數(shù)更少的數(shù)值類型(比 int8, float16) —— 整個過程被稱為量化(Quantization)。

通常以浮點模型為起點,經(jīng)過中間的量化處理后最終變成量化模型,在這個過程中一般會導(dǎo)致模型掉點。
目前業(yè)界緩解模型掉點的問題的技術(shù)主要有兩種,在 MegEngine 中都進行了支持:
訓練后量化(Post-Training Quantization, PTQ);
量化感知訓練(Quantization-Aware Training, QAT)。
更多量化基本流程:量化基本流程介紹 https://www.megengine.org.cn/doc/stable/zh/user-guide/model-development/quantization/index.html#quantization-intro
整體流程
以量化感知訓練為例,一般以一個訓練完畢的浮點模型為起點,稱為 Float 模型。 包含假量化算子的用浮點操作來模擬量化過程的新模型,我們稱之為 Quantized-Float 模型,或者 QFloat 模型。 可以直接在終端設(shè)備上運行的模型,稱之為 Quantized 模型,簡稱 Q 模型。
而三者的精度一般是 Float > QFloat > Q ,故而一般量化算法也就分為兩步:
拉近 QFloat 和 Q,這樣訓練階段的精度可以作為最終 Q 精度的代理指標,這一階段偏工程;
拔高 QFloat 逼近 Float,這樣就可以將量化模型性能盡可能恢復(fù)到 Float 的精度,這一階段偏算法。
典型的三種模型在三個階段的精度變化如下:

對應(yīng)到具體的 MegEngine 接口中,三階段如下:
基于 Module 搭建網(wǎng)絡(luò)模型,并按照正常的浮點模型方式進行訓練;
使用 quantize_qat 將浮點模型轉(zhuǎn)換為 QFloat 模型, 其中可被量化的關(guān)鍵 Module 會被轉(zhuǎn)換為 QATModule , 并基于量化配置 QConfig 設(shè)置好假量化算子和數(shù)值統(tǒng)計方式;
使用 quantize 將 QFloat 模型轉(zhuǎn)換為 Q 模型, 對應(yīng)的 QATModule 則會被轉(zhuǎn)換為 QuantizedModule , 此時網(wǎng)絡(luò)無法再進行訓練,網(wǎng)絡(luò)中的算子都會轉(zhuǎn)換為低比特計算方式,即可用于部署了。

此處為標準量化流程,實際使用時也可有靈活的變化。
ResNet 實例講解
下面我們以 ResNet18 為例來講解量化的完整流程。主要分為以下幾步:
修改網(wǎng)絡(luò)結(jié)構(gòu),使用已經(jīng)融合好的 ConvBn2d、ConvBnRelu2d、ElementWise 代替原先的 Module. 在正常模式下預(yù)訓練模型,并在每輪迭代保存網(wǎng)絡(luò)檢查點;
調(diào)用 quantize_qat 轉(zhuǎn)換模型,并進行量化感知訓練微調(diào)(或校準,取決于 QConfig);
調(diào)用 quantize 轉(zhuǎn)換為量化模型,導(dǎo)出模型用于后續(xù)模型部署。
詳細操作指南文檔見:ResNet 實例講解:https://www.megengine.org.cn/doc/stable/zh/user-guide/model-development/quantization/index.html#resnet:~:text=%E8%BF%9B%E8%A1%8C%E5%8A%A0%E8%BD%BD%E3%80%82-,ResNet%20%E5%AE%9E%E4%BE%8B%E8%AE%B2%E8%A7%A3,-%C2%B6
附:
「MegEngine 使用小技巧」系列文章,重點輸出 MegEngine 及周邊工具的使用技巧,如有催更或投稿,歡迎聯(lián)系我們哦~
技術(shù)交流 QQ 群:1029741705;Bot 微信:megengine-bot
更多 MegEngine 信息獲取,您可以:查看文檔https://www.megengine.org.cn/doc/stable/zh/
GitHub 項目: https://github.com/MegEngine
歡迎參與 MegEngine 社區(qū)貢獻,成為 Awesome MegEngineer:https://www.megengine.org.cn/community-AMGE,榮譽證書、定制禮品享不停。 作者:曠視天元MegEngine https://www.bilibili.com/read/cv23032882 出處:bilibili