色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Pytorch量化感知訓練的詳解

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-08 22:57 ? 次閱讀
文章轉載于微信公眾號:GiantPandaCV
作者: Pui_Yeung

前言

??量化感知訓練(Quantization Aware Training )是在模型中插入偽量化模塊(fake/_quant module)模擬量化模型在推理過程中進行的舍入(rounding)和鉗位(clamping)操作,從而在訓練過程中提高模型對量化效應的適應能力,獲得更高的量化模型精度 。在這個過程中,所有計算(包括模型正反向傳播計算和偽量化節點計算)都是以浮點計算實現的,在訓練完成后才量化為真正的int8模型。??

Pytorch官方從1.3版本開始提供量化感知訓練API,只需修改少量代碼即可實現量化感知訓練。目前torch.quantization仍處于beta階段,不保證API前向、后向兼容性。以下介紹基于Pytorch 1.7,其他版本可能會有差異。

Pytorch量化感知訓練流程

??首先給出提供一個可運行demo,直觀了解量化感知訓練的6個步驟,再進行詳細的介紹

importtorchfromtorch.quantizationimportprepare_qat,get_default_qat_qconfig,convertfromtorchvision.modelsimportquantization# Step1:修改模型#這里直接使用官方修改好的MobileNetV2,下文會對修改點進行介紹model=quantization.mobilenet_v2()print("originalmodel:")print(model)# Step2:折疊算子#fuse_model()在training或evaluate模式下算子折疊結果不同,#對于QAT,需確保在training狀態下進行算子折疊assertmodel.trainingmodel.fuse_model()print("fusedmodel:")print(model)#Step3:指定量化方案#通過給模型實例增加一個名為"qconfig"的成員變量實現量化方案的指定#backend目前支持fbgemm和qnnpackBACKEND="fbgemm"model.qconfig=get_default_qat_qconfig(BACKEND)# Step4:插入偽量化模塊prepare_qat(model,inplace=True)print("modelwithobservers:")print(model)#正常的模型訓練,無需修改代碼# Step5:實施量化model.eval()#執行convert函數前,需確保模型在evaluate模式model_int8=convert(model)print("quantizedmodel:")print(model_int8)# Step6:int8模型推理#指定與qconfig相同的backend,在推理時使用正確的算子torch.backends.quantized.engine=BACKEND#目前Pytorch的int8算子只支持CPU推理,需確保輸入和模型都在CPU側#輸入輸出仍為浮點數fp32_input=torch.randn(1,3,224,224)y=model_int8(fp32_input)print("output:")print(y)

Step1:修改模型

??Pytorch下需要適當修改模型才能進行量化感知訓練,以下以常用的MobileNetV2為例。官方已修改好的MobileNetV2的代碼,詳見這里(https://github.com/pytorch/vi...

修改主要包括3點,以下摘取相應的代碼進行介紹:

(1)在模型輸入前加入QuantStub(),在模型輸出后加入DeQuantStub()。目的是將輸入從fp32量化為int8,將輸出從int8反量化為fp32。模型的/_/_init/_/_()和forward()修改為:

classQuantizableMobileNetV2(MobileNetV2):def__init__(self,*args,**kwargs):"""MobileNetV2mainclassArgs:InheritsargsfromfloatingpointMobileNetV2"""super(QuantizableMobileNetV2,self).__init__(*args,**kwargs)self.quant=QuantStub()self.dequant=DeQuantStub()defforward(self,x):x=self.quant(x)x=self._forward_impl(x)x=self.dequant(x)returnx

(2)對加法等操作加入偽量化節點。因為int8數值進行加法運算容易超出數值范圍,所以不是直接進行計算,而是進行反量化->計算->量化的操作。以InvertedResidual的修改為例:

classQuantizableInvertedResidual(InvertedResidual):def__init__(self,*args,**kwargs):super(QuantizableInvertedResidual,self).__init__(*args,**kwargs)#加法的偽量化節點需要記錄所經過該節點的數值的范圍,因此需要實例化一個對象self.skip_add=nn.quantized.FloatFunctional()defforward(self,x):ifself.use_res_connect:#普通版本MobileNetV2的加法#returnx+self.conv(x)#量化版本MobileNetV2的加法returnself.skip_add.add(x,self.conv(x))else:returnself.conv(x)

(3)將ReLU6替換為ReLU。MobileNet V2使用ReLU6的原因是對ReLU的輸出范圍進行截斷以緩解量化為fp16模型時的精度下降。因為int8量化本身就能確定截斷閾值,所以將ReLU6替換為ReLU以去掉截斷閾值固定為6的限制。官方的修改代碼在建立網絡后通過/_replace/_relu()將MobileNetV2中的ReLU6替換為ReLU:

model=QuantizableMobileNetV2(block=QuantizableInvertedResidual,**kwargs)_replace_relu(model)

Step2:算子折疊

??算子折疊是將模型的多個層合并成一個層,一般用來減少計算量和加速推理。對于量化感知訓練而言,算子折疊作用是將模型變“薄”,減少中間計算過程的誤差積累。

??以下比較有無算子折疊的結果(上:無算子折疊,下:有算子折疊,打印執行prepare/_qat()后的模型)

?如果不進行算子折疊,每個Conv-BN-ReLU單元一共會插入4個FakeQuantize模塊。而進行算子折疊后,原來Conv2d()被ConvBnReLU2d()代替(3層合并到了第1層),BatchNorm2d()和ReLU()被Inentity()代替(僅作為占位),最終只插入了2個FakeQuantize模塊。

FakeQuantize模塊的減少意味著推理過程中進行的量化-反量化的次數減少,有利于減少量化帶來的性能損失。

??算子折疊由實現torch.quantization.fuse/_modules()。目前存在的比較遺憾的2點:

??算子折疊不能自動完成,只能由程序員手工指定要折疊的子模型。以torchvision.models.quantization.mobilenet/_v2()中實現的算子折疊函數為例:

deffuse_model(self):#遍歷模型內的每個子模型,判斷類型并進行相應的算子折疊forminself.modules():iftype(m)==ConvBNReLU:fuse_modules(m,['0','1','2'],inplace=True)iftype(m)==QuantizableInvertedResidual:#調用子模塊實現的fuse_model(),間接調用fuse_modules()m.fuse_model()

??能折疊的算子組合有限。目前支持的算子組合為:ConV + BN、ConV + BN + ReLU、Conv + ReLU、Linear + ReLU、BN + ReLU。如果嘗試折疊ConvTranspose2d、ReLU6等不支持的算子則會報錯。

Step3:指定量化方案

??目前支持fbgemm和qnnpack兩種backend方案。官方推薦x86平臺使用fbgemm方案,ARM平臺使用qnnpack方案。??量化方案通過如下方法指定

model.qconfig=get_default_qat_qconfig(backen)#或model.qconfig=get_default_qat_qconfig(backen)

??即通過給model增加一個名為qconfig為成員變量并賦值。

??量化方案可通過設置qconfig自定義,本文暫不討論。

Step4:插入偽量化模塊??

通過執行prepare/_qat(),實現按qconfig的配置方案給每個層增加FakeQuantize()模塊?每個FakeQuantize()模塊內包含相應的Observer()模塊,在模型執行forward()時自動記錄數值,供實施量化時使用。

Step5:實施量化??

完成訓練后,通過執行convert()轉換為真正的int8量化模型。?完成轉換后,FakeQuantize()模塊被去掉,原來的ConvBNReLU2d()算子被替換為QuantizedConvReLU2d()算子。

Step6:int8模型推理

??int8模型的調用方法與普通的fp32模型的調用無異。需要注意的是,目前量化算子僅支持CPU計算,故須確保輸入和模型都在CPU側。

??若模型推理中出現報錯,一般是前面的步驟存在設置不當,參考常見問題第1點。

常見問題

(1) RuntimeError: Could not run XX with arguments from the YY backend. XX is only available for these backends ZZ??

雖然fp32模型和int8模型都能在CPU上推理,但fp32算子僅接受tensor作為輸入,int8算子僅接受quantedtensor作為輸入,輸入和算子的類型不一致導致上述錯誤。

??一般排查方向為:是否完成了模型修改,將加法等操作替換為量化版本;是否正確添加了QuantStub()和DeQuantStub();是否在執行convert()前是否執行了model.eval()(在traning模型下,dropout無int8實現但沒有被去掉,然而在執行推理時會報錯)。

(2) 是否支持GPU訓練,是否支持DistributedDataParallel訓練???

支持。官方有一個完整的量化感知訓練的實現,使用了GPU和DistributedDataParallel,可惜在文檔和教程中未提及,參考這里(https://github.com/pytorch/vi.../_quantization.py)。

(3) 是否支持混合精度模型(例如一部分fp32推理,一部分int8推理)???

官方沒有明確說明,但經實踐是可以的。

??模型是否進行量化取決于是否帶qconfig。因此可以將模型定義修改為

classMixModel(nn.Module):def__init__(self):super(MixModel,self).__init__()self.fp32_part=Fp32Model()self.int8_part=Int8Model()defforward(self,x):x=self.int8_part(x)x=self.fp32(x)returnxmix_model=MixModel()mix_model.int8_part.qconfig=get_default_qat_qconfig(BACKEND)prepare_qat(mix_model,inplace=True)

??由此可實現所需的功能。注意將QuantStub()、Dequant()模塊移到Int8Model()中。

(4)精度保持效果如何,如何提升精度???

筆者進行的實驗不多,在做過的簡單的OCR任務中,可以做到文字檢測和識別模型的指標下降均不超過1個點(量化的int8模型對比正常訓練的fp32模型)。官方教程中提供了分類例子的效果和提升精度的技巧,可供參考。

總結

??Pytorch官方提供的量化感知訓練API,上手較為簡單,易于集成到現有訓練代碼中。但目前手動修改模型和算子折疊增加了一定的工作量,期待在未來版本的改進。

- END -

推薦閱讀

更多嵌入式AI技術干貨請關注嵌入式AI專欄。

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 深度學習
    +關注

    關注

    73

    文章

    5507

    瀏覽量

    121273
  • pytorch
    +關注

    關注

    2

    文章

    808

    瀏覽量

    13249
收藏 人收藏

    評論

    相關推薦

    守護公路安全! 中海達推出輕量化監測簡易感知方案

    簡易感知方案來保障公路安全。順應市場需求,中海達推出中小橋和公路邊坡輕量化監測簡易感知解決方案。 ? 輕量化監測簡易感知解決方案是什么? 為
    的頭像 發表于 11-29 17:48 ?184次閱讀
    守護公路安全! 中海達推出輕<b class='flag-5'>量化</b>監測簡易<b class='flag-5'>感知</b>方案

    中海達推出輕量化監測簡易感知解決方案

    近期,針對汛期橋梁結構和公路邊坡受自然災害影響出現滑坡、坍塌等事故,交通運輸部和應急管理部密集發布相關政策文件,明確各地需加強橋梁結構和公路邊坡檢測監測工作,多地積極響應政策號召,提出通過輕量化監測簡易感知方案來保障公路安全。順應市場需求,中海達推出中小橋和公路邊坡輕
    的頭像 發表于 11-19 11:40 ?361次閱讀

    PyTorch GPU 加速訓練模型方法

    在深度學習領域,GPU加速訓練模型已經成為提高訓練效率和縮短訓練時間的重要手段。PyTorch作為一個流行的深度學習框架,提供了豐富的工具和方法來利用GPU進行模型
    的頭像 發表于 11-05 17:43 ?584次閱讀

    如何在 PyTorch訓練模型

    PyTorch 是一個流行的開源機器學習庫,廣泛用于計算機視覺和自然語言處理等領域。它提供了強大的計算圖功能和動態圖特性,使得模型的構建和調試變得更加靈活和直觀。 數據準備 在訓練模型之前,首先需要
    的頭像 發表于 11-05 17:36 ?357次閱讀

    使用PyTorch在英特爾獨立顯卡上訓練模型

    PyTorch 2.5重磅更新:性能優化+新特性》中的一個新特性就是:正式支持在英特爾獨立顯卡上訓練模型!
    的頭像 發表于 11-01 14:21 ?583次閱讀
    使用<b class='flag-5'>PyTorch</b>在英特爾獨立顯卡上<b class='flag-5'>訓練</b>模型

    Pytorch深度學習訓練的方法

    掌握這 17 種方法,用最省力的方式,加速你的 Pytorch 深度學習訓練
    的頭像 發表于 10-28 14:05 ?227次閱讀
    <b class='flag-5'>Pytorch</b>深度學習<b class='flag-5'>訓練</b>的方法

    基于Pytorch訓練并部署ONNX模型在TDA4應用筆記

    電子發燒友網站提供《基于Pytorch訓練并部署ONNX模型在TDA4應用筆記.pdf》資料免費下載
    發表于 09-11 09:24 ?0次下載
    基于<b class='flag-5'>Pytorch</b><b class='flag-5'>訓練</b>并部署ONNX模型在TDA4應用筆記

    pytorch怎么在pycharm中運行

    第一部分:PyTorch和PyCharm的安裝 1.1 安裝PyTorch PyTorch是一個開源的機器學習庫,用于構建和訓練神經網絡。要在PyCharm中使用
    的頭像 發表于 08-01 16:22 ?1488次閱讀

    pytorch如何訓練自己的數據

    本文將詳細介紹如何使用PyTorch框架來訓練自己的數據。我們將從數據準備、模型構建、訓練過程、評估和測試等方面進行講解。 環境搭建 首先,我們需要安裝PyTorch。可以通過訪問
    的頭像 發表于 07-11 10:04 ?556次閱讀

    pytorch中有神經網絡模型嗎

    當然,PyTorch是一個廣泛使用的深度學習框架,它提供了許多預訓練的神經網絡模型。 PyTorch中的神經網絡模型 1. 引言 深度學習是一種基于人工神經網絡的機器學習技術,它在圖像識別、自然語言
    的頭像 發表于 07-11 09:59 ?723次閱讀

    PyTorch的介紹與使用案例

    學習領域的一個重要工具。PyTorch底層由C++實現,提供了豐富的API接口,使得開發者能夠高效地構建和訓練神經網絡模型。PyTorch不僅支持動態計算圖,還提供了強大的自動微分系統,極大地簡化了深度學習任務的開發流程。
    的頭像 發表于 07-10 14:19 ?416次閱讀

    解讀PyTorch模型訓練過程

    PyTorch作為一個開源的機器學習庫,以其動態計算圖、易于使用的API和強大的靈活性,在深度學習領域得到了廣泛的應用。本文將深入解讀PyTorch模型訓練的全過程,包括數據準備、模型構建、
    的頭像 發表于 07-03 16:07 ?1099次閱讀

    PyTorch如何訓練自己的數據集

    PyTorch是一個廣泛使用的深度學習框架,它以其靈活性、易用性和強大的動態圖特性而聞名。在訓練深度學習模型時,數據集是不可或缺的組成部分。然而,很多時候,我們可能需要使用自己的數據集而不是現成
    的頭像 發表于 07-02 14:09 ?1811次閱讀

    請問電腦端Pytorch訓練的模型如何轉化為能在ESP32S3平臺運行的模型?

    由題目, 電腦端Pytorch訓練的模型如何轉化為能在ESP32S3平臺運行的模型? 如何把這個Pytorch模型燒錄到ESP32S3上去?
    發表于 06-27 06:06

    存內計算技術工具鏈——量化

    本篇文章將重點講述存內計算技術工具鏈之“量化”,我們將從面向存內計算芯片的深度學習編譯工具鏈、神經網絡中的量化(包括訓練量化量化
    的頭像 發表于 05-16 12:35 ?1271次閱讀
    存內計算技術工具鏈——<b class='flag-5'>量化</b>篇
    主站蜘蛛池模板: 久久这里只有精品视频9| 91精品国产色综合久久不| 一本大道香蕉中文在线视频观看| 4虎最新网址| 国产三级精品三级在线观看| 男人插曲女人的叫声| 无码骚夜夜精品| 91av欧美| 幻女FREE性俄罗斯学生| 日韩精品真人荷官无码| 最近日本MV字幕免费观看视频| 国产精品嫩草99AV在线| 欧美同志高清vivoeso| 亚洲中文字幕无码一去台湾| 俄罗斯搜索引擎Yandex推广入口| 伦理片天堂eeuss影院| 亚洲成年人影院| 大香伊蕉在人线国产97| 毛片免费在线| 亚洲伊人精品| 国产啪精品视频网免费| 日本888xxxx| 99re热视频这里只有精品| 久久99精品AV99果冻传媒| 午夜影视不充值观看| 被免费网站在线视频| 两性午夜色视频免费网站| 亚洲乱亚洲乱妇在线观看| 国产盗摄一区二区| 日本精品久久久久中文字幕 1 | 同桌别揉我奶了嗯啊| www.青青草原| 美女坐脸vk| 真实伦 乱| 精品久久久久久久久免费影院| 乌克兰美女x?x?y?y| 大香伊人久久| 强姧伦久久久久久久久| 99久酒店在线精品2019| 伦理片午夜在线视频| 在线毛片片免费观看|