在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Pytorch量化感知訓(xùn)練的詳解

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-08 22:57 ? 次閱讀
文章轉(zhuǎn)載于微信公眾號(hào):GiantPandaCV
作者: Pui_Yeung

前言

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

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

Pytorch量化感知訓(xùn)練流程

??首先給出提供一個(gè)可運(yùn)行demo,直觀了解量化感知訓(xùn)練的6個(gè)步驟,再進(jìn)行詳細(xì)的介紹

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

Step1:修改模型

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

修改主要包括3點(diǎn),以下摘取相應(yīng)的代碼進(jìn)行介紹:

(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)對(duì)加法等操作加入偽量化節(jié)點(diǎn)。因?yàn)閕nt8數(shù)值進(jìn)行加法運(yùn)算容易超出數(shù)值范圍,所以不是直接進(jìn)行計(jì)算,而是進(jìn)行反量化->計(jì)算->量化的操作。以InvertedResidual的修改為例:

classQuantizableInvertedResidual(InvertedResidual):def__init__(self,*args,**kwargs):super(QuantizableInvertedResidual,self).__init__(*args,**kwargs)#加法的偽量化節(jié)點(diǎn)需要記錄所經(jīng)過(guò)該節(jié)點(diǎn)的數(shù)值的范圍,因此需要實(shí)例化一個(gè)對(duì)象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的原因是對(duì)ReLU的輸出范圍進(jìn)行截?cái)嘁跃徑饬炕癁閒p16模型時(shí)的精度下降。因?yàn)閕nt8量化本身就能確定截?cái)嚅撝担詫eLU6替換為ReLU以去掉截?cái)嚅撝倒潭?的限制。官方的修改代碼在建立網(wǎng)絡(luò)后通過(guò)/_replace/_relu()將MobileNetV2中的ReLU6替換為ReLU:

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

Step2:算子折疊

??算子折疊是將模型的多個(gè)層合并成一個(gè)層,一般用來(lái)減少計(jì)算量和加速推理。對(duì)于量化感知訓(xùn)練而言,算子折疊作用是將模型變“薄”,減少中間計(jì)算過(guò)程的誤差積累。

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

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

FakeQuantize模塊的減少意味著推理過(guò)程中進(jìn)行的量化-反量化的次數(shù)減少,有利于減少量化帶來(lái)的性能損失。

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

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

deffuse_model(self):#遍歷模型內(nèi)的每個(gè)子模型,判斷類型并進(jìn)行相應(yīng)的算子折疊forminself.modules():iftype(m)==ConvBNReLU:fuse_modules(m,['0','1','2'],inplace=True)iftype(m)==QuantizableInvertedResidual:#調(diào)用子模塊實(shí)現(xiàn)的fuse_model(),間接調(diào)用fuse_modules()m.fuse_model()

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

Step3:指定量化方案

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

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

??即通過(guò)給model增加一個(gè)名為qconfig為成員變量并賦值。

??量化方案可通過(guò)設(shè)置qconfig自定義,本文暫不討論。

Step4:插入偽量化模塊??

通過(guò)執(zhí)行prepare/_qat(),實(shí)現(xiàn)按qconfig的配置方案給每個(gè)層增加FakeQuantize()模塊?每個(gè)FakeQuantize()模塊內(nèi)包含相應(yīng)的Observer()模塊,在模型執(zhí)行forward()時(shí)自動(dòng)記錄數(shù)值,供實(shí)施量化時(shí)使用。

Step5:實(shí)施量化??

完成訓(xùn)練后,通過(guò)執(zhí)行convert()轉(zhuǎn)換為真正的int8量化模型。?完成轉(zhuǎn)換后,F(xiàn)akeQuantize()模塊被去掉,原來(lái)的ConvBNReLU2d()算子被替換為QuantizedConvReLU2d()算子。

Step6:int8模型推理

??int8模型的調(diào)用方法與普通的fp32模型的調(diào)用無(wú)異。需要注意的是,目前量化算子僅支持CPU計(jì)算,故須確保輸入和模型都在CPU側(cè)。

??若模型推理中出現(xiàn)報(bào)錯(cuò),一般是前面的步驟存在設(shè)置不當(dāng),參考常見(jiàn)問(wèn)題第1點(diǎn)。

常見(jiàn)問(wèn)題

(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作為輸入,輸入和算子的類型不一致導(dǎo)致上述錯(cuò)誤。

??一般排查方向?yàn)椋菏欠裢瓿闪四P托薷模瑢⒓臃ǖ炔僮魈鎿Q為量化版本;是否正確添加了QuantStub()和DeQuantStub();是否在執(zhí)行convert()前是否執(zhí)行了model.eval()(在traning模型下,dropout無(wú)int8實(shí)現(xiàn)但沒(méi)有被去掉,然而在執(zhí)行推理時(shí)會(huì)報(bào)錯(cuò))。

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

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

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

官方?jīng)]有明確說(shuō)明,但經(jīng)實(shí)踐是可以的。

??模型是否進(jìn)行量化取決于是否帶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)

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

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

筆者進(jìn)行的實(shí)驗(yàn)不多,在做過(guò)的簡(jiǎn)單的OCR任務(wù)中,可以做到文字檢測(cè)和識(shí)別模型的指標(biāo)下降均不超過(guò)1個(gè)點(diǎn)(量化的int8模型對(duì)比正常訓(xùn)練的fp32模型)。官方教程中提供了分類例子的效果和提升精度的技巧,可供參考。

總結(jié)

??Pytorch官方提供的量化感知訓(xùn)練API,上手較為簡(jiǎn)單,易于集成到現(xiàn)有訓(xùn)練代碼中。但目前手動(dòng)修改模型和算子折疊增加了一定的工作量,期待在未來(lái)版本的改進(jìn)。

- END -

推薦閱讀

更多嵌入式AI技術(shù)干貨請(qǐng)關(guān)注嵌入式AI專欄。

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5510

    瀏覽量

    121338
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    808

    瀏覽量

    13283
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    守護(hù)公路安全! 中海達(dá)推出輕量化監(jiān)測(cè)簡(jiǎn)易感知方案

    簡(jiǎn)易感知方案來(lái)保障公路安全。順應(yīng)市場(chǎng)需求,中海達(dá)推出中小橋和公路邊坡輕量化監(jiān)測(cè)簡(jiǎn)易感知解決方案。 ? 輕量化監(jiān)測(cè)簡(jiǎn)易感知解決方案是什么? 為
    的頭像 發(fā)表于 11-29 17:48 ?200次閱讀
    守護(hù)公路安全! 中海達(dá)推出輕<b class='flag-5'>量化</b>監(jiān)測(cè)簡(jiǎn)易<b class='flag-5'>感知</b>方案

    中海達(dá)推出輕量化監(jiān)測(cè)簡(jiǎn)易感知解決方案

    近期,針對(duì)汛期橋梁結(jié)構(gòu)和公路邊坡受自然災(zāi)害影響出現(xiàn)滑坡、坍塌等事故,交通運(yùn)輸部和應(yīng)急管理部密集發(fā)布相關(guān)政策文件,明確各地需加強(qiáng)橋梁結(jié)構(gòu)和公路邊坡檢測(cè)監(jiān)測(cè)工作,多地積極響應(yīng)政策號(hào)召,提出通過(guò)輕量化監(jiān)測(cè)簡(jiǎn)易感知方案來(lái)保障公路安全。順應(yīng)市場(chǎng)需求,中海達(dá)推出中小橋和公路邊坡輕
    的頭像 發(fā)表于 11-19 11:40 ?380次閱讀

    PyTorch GPU 加速訓(xùn)練模型方法

    在深度學(xué)習(xí)領(lǐng)域,GPU加速訓(xùn)練模型已經(jīng)成為提高訓(xùn)練效率和縮短訓(xùn)練時(shí)間的重要手段。PyTorch作為一個(gè)流行的深度學(xué)習(xí)框架,提供了豐富的工具和方法來(lái)利用GPU進(jìn)行模型
    的頭像 發(fā)表于 11-05 17:43 ?593次閱讀

    如何在 PyTorch訓(xùn)練模型

    PyTorch 是一個(gè)流行的開(kāi)源機(jī)器學(xué)習(xí)庫(kù),廣泛用于計(jì)算機(jī)視覺(jué)和自然語(yǔ)言處理等領(lǐng)域。它提供了強(qiáng)大的計(jì)算圖功能和動(dòng)態(tài)圖特性,使得模型的構(gòu)建和調(diào)試變得更加靈活和直觀。 數(shù)據(jù)準(zhǔn)備 在訓(xùn)練模型之前,首先需要
    的頭像 發(fā)表于 11-05 17:36 ?372次閱讀

    使用PyTorch在英特爾獨(dú)立顯卡上訓(xùn)練模型

    PyTorch 2.5重磅更新:性能優(yōu)化+新特性》中的一個(gè)新特性就是:正式支持在英特爾獨(dú)立顯卡上訓(xùn)練模型!
    的頭像 發(fā)表于 11-01 14:21 ?622次閱讀
    使用<b class='flag-5'>PyTorch</b>在英特爾獨(dú)立顯卡上<b class='flag-5'>訓(xùn)練</b>模型

    Pytorch深度學(xué)習(xí)訓(xùn)練的方法

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

    基于Pytorch訓(xùn)練并部署ONNX模型在TDA4應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《基于Pytorch訓(xùn)練并部署ONNX模型在TDA4應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 09-11 09:24 ?0次下載
    基于<b class='flag-5'>Pytorch</b><b class='flag-5'>訓(xùn)練</b>并部署ONNX模型在TDA4應(yīng)用筆記

    pytorch怎么在pycharm中運(yùn)行

    第一部分:PyTorch和PyCharm的安裝 1.1 安裝PyTorch PyTorch是一個(gè)開(kāi)源的機(jī)器學(xué)習(xí)庫(kù),用于構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)。要在PyCharm中使用
    的頭像 發(fā)表于 08-01 16:22 ?1509次閱讀

    pytorch如何訓(xùn)練自己的數(shù)據(jù)

    本文將詳細(xì)介紹如何使用PyTorch框架來(lái)訓(xùn)練自己的數(shù)據(jù)。我們將從數(shù)據(jù)準(zhǔn)備、模型構(gòu)建、訓(xùn)練過(guò)程、評(píng)估和測(cè)試等方面進(jìn)行講解。 環(huán)境搭建 首先,我們需要安裝PyTorch。可以通過(guò)訪問(wèn)
    的頭像 發(fā)表于 07-11 10:04 ?574次閱讀

    pytorch中有神經(jīng)網(wǎng)絡(luò)模型嗎

    當(dāng)然,PyTorch是一個(gè)廣泛使用的深度學(xué)習(xí)框架,它提供了許多預(yù)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型。 PyTorch中的神經(jīng)網(wǎng)絡(luò)模型 1. 引言 深度學(xué)習(xí)是一種基于人工神經(jīng)網(wǎng)絡(luò)的機(jī)器學(xué)習(xí)技術(shù),它在圖像識(shí)別、自然語(yǔ)言
    的頭像 發(fā)表于 07-11 09:59 ?733次閱讀

    PyTorch的介紹與使用案例

    學(xué)習(xí)領(lǐng)域的一個(gè)重要工具。PyTorch底層由C++實(shí)現(xiàn),提供了豐富的API接口,使得開(kāi)發(fā)者能夠高效地構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型。PyTorch不僅支持動(dòng)態(tài)計(jì)算圖,還提供了強(qiáng)大的自動(dòng)微分系統(tǒng),極大地簡(jiǎn)化了深度學(xué)習(xí)任務(wù)的開(kāi)發(fā)流程。
    的頭像 發(fā)表于 07-10 14:19 ?431次閱讀

    解讀PyTorch模型訓(xùn)練過(guò)程

    PyTorch作為一個(gè)開(kāi)源的機(jī)器學(xué)習(xí)庫(kù),以其動(dòng)態(tài)計(jì)算圖、易于使用的API和強(qiáng)大的靈活性,在深度學(xué)習(xí)領(lǐng)域得到了廣泛的應(yīng)用。本文將深入解讀PyTorch模型訓(xùn)練的全過(guò)程,包括數(shù)據(jù)準(zhǔn)備、模型構(gòu)建、訓(xùn)
    的頭像 發(fā)表于 07-03 16:07 ?1121次閱讀

    PyTorch如何訓(xùn)練自己的數(shù)據(jù)集

    PyTorch是一個(gè)廣泛使用的深度學(xué)習(xí)框架,它以其靈活性、易用性和強(qiáng)大的動(dòng)態(tài)圖特性而聞名。在訓(xùn)練深度學(xué)習(xí)模型時(shí),數(shù)據(jù)集是不可或缺的組成部分。然而,很多時(shí)候,我們可能需要使用自己的數(shù)據(jù)集而不是現(xiàn)成
    的頭像 發(fā)表于 07-02 14:09 ?1889次閱讀

    請(qǐng)問(wèn)電腦端Pytorch訓(xùn)練的模型如何轉(zhuǎn)化為能在ESP32S3平臺(tái)運(yùn)行的模型?

    由題目, 電腦端Pytorch訓(xùn)練的模型如何轉(zhuǎn)化為能在ESP32S3平臺(tái)運(yùn)行的模型? 如何把這個(gè)Pytorch模型燒錄到ESP32S3上去?
    發(fā)表于 06-27 06:06

    存內(nèi)計(jì)算技術(shù)工具鏈——量化

    本篇文章將重點(diǎn)講述存內(nèi)計(jì)算技術(shù)工具鏈之“量化”,我們將從面向存內(nèi)計(jì)算芯片的深度學(xué)習(xí)編譯工具鏈、神經(jīng)網(wǎng)絡(luò)中的量化(包括訓(xùn)練量化量化
    的頭像 發(fā)表于 05-16 12:35 ?1305次閱讀
    存內(nèi)計(jì)算技術(shù)工具鏈——<b class='flag-5'>量化</b>篇
    主站蜘蛛池模板: 亚洲免费在线观看视频| 欧美激情αv一区二区三区| 在线jlzzjlzz免费播放| 77788色淫视频免费观看| 又粗又长又大又黄的日本视频| 5月丁香6月婷婷| 天天干夜夜爽天天操夜夜爽视频| 欧美黄色录象| 视色4setv.com| 日本口工禁漫画无遮挡全彩| 在线免费成人| 四虎影院的网址| 欧美日韩国产一区二区三区不卡| 精品色| 91寡妇天天综合久久影院| 天天射天天干天天| 高清在线观看视频| 亚洲一区二区在线免费观看| 69国产成人综合久久精品| 特级毛片女人18毛片| 免费看污视频软件| sss在线play| 免费观看美女被cao视频| 日本人xxxxxxxxx69| 99久久精品免费观看国产| 特别毛片| 激情五月播播| 午夜影视福利| 1024你懂的国产日韩欧美| 精品一区二区三区在线视频| 四虎最新永久在线精品免费| 久久久久久青草大香综合精品| 怡红院影院| 在线播放网址| 最新人妖shemaletube人妖| 特级黄色免费片| 黄色大片毛片| 欧美午夜在线观看| 亚洲视频一区二区三区| 五月婷亚洲| 国产一级做a爰大片免费久久|