Pytorch模型量化介绍
? ? ? ? 在深度學習領域量化主要是存儲量化(減少存儲所需內存)以及計算量化(減少計算時間)。而博主主要使用pytorch,在pytorch里支持的量化主要有動態量化(推理過程中進行量化)、靜態量化(訓練后進行量化)、感知量化(邊訓練邊量化,用的時間更長,但精度幾乎無損)。
Tensor量化
? ? ? ?要實現量化首先要進行Tensor量化,Tensor量化與scale、zero-point參數有關,公式為:
????????round(x/scale+zero-point)
?? ? ? Tensor一般量化有2種模式,per tensor與per channel,前者所有數值都按照相同方式進行scale與zero-point計算,后者有多種不同的scale與zero-pointc參數,而且精度損失更少。
靜態量化
? ? ? ? 靜態量化一般有2種形式,僅weight量化以及weight與activation同時量化。前者主要目的是使得模型參數所占內存減小,且相對簡單。后者則相對較為復雜。
? ? ? ? 在pytorch內靜態量化分為5個步驟。(以下步驟主要進行的是模型量化,本質上就是用量化OP替換非量化OP)
? ? ? ? ? ? ? ?(1)fuse_model,就是將可進行融合的op進行融合,比如Conv與BN層進行融合等。融合后第一個op會替換融合后的op,其余op則替換為nn.identity。
fuse_modules(model, modules_to_fuse, inplace=False, fuser_func=fuse_known_modules, fuse_custom_config_dict=None)? ? ? ? ? ? ? ? (2)qconfig,該步驟目的是設置模型量化的方式,通過插入兩個observer來監測activation與weight。同時由于推理平臺的不同,pytorch的量化配置也不相同。
? ? ? ? ? ? ? ? (3)prepare,將每個可支持量化的模塊插入Observer,收集數據并進行量化分析。
? ? ? ? ? ? ? ? (4)feed data,將一個合適的校驗數據送入前述模型中,獲得更好的activation的量化參數信息。
? ? ? ? ? ? ? ? (5)convert,運用代碼轉化模型。
torch.quantization.convert(model, inplace=True)? ? ? ? ?模型量化后就是量化模型的推理,與浮點模型的區別主要是要進行量化節點的插入以及op替換。
? ? ? ? 量化節點插入:需要在網絡的forward里面插入QuantStub與DeQuantSub兩個節點。
? ? ? ? op替換:需要將模型中的Add、Concat等操作替換為支持量化的FloatFunctional。
總結
以上是生活随笔為你收集整理的Pytorch模型量化介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis笔记——redis事务及锁应用
- 下一篇: 设计模式开闭原则