深度學(xué)習(xí)模型量化概述
深度學(xué)習(xí)模型量化是一種重要的模型輕量化技術(shù),旨在通過減少網(wǎng)絡(luò)參數(shù)的比特寬度來減小模型大小和加速推理過程,同時盡量保持模型性能。從而達(dá)到把模型部署到邊緣或者低算力設(shè)備上,實現(xiàn)降本增效的目標(biāo)。
01定義
模型量化是指將神經(jīng)網(wǎng)絡(luò)的浮點算法轉(zhuǎn)換為定點算法,通常涉及將浮點數(shù)參數(shù)轉(zhuǎn)換為低位數(shù)的整數(shù),例如從32位浮點數(shù)(FP32)到8位整數(shù)(INT8)。這一技術(shù)通過減少模型中參數(shù)的位數(shù)來降低模型的存儲需求和計算復(fù)雜性。
02主要類型
靜態(tài)量化:
在模型訓(xùn)練后進(jìn)行,不涉及重新訓(xùn)練。它通常用于不需要細(xì)粒度調(diào)優(yōu)的場景。
動態(tài)量化:
在模型推理時進(jìn)行,對權(quán)重進(jìn)行量化,但保留中間激活的浮點數(shù)表示。它適用于那些需要保持較高推理精度的應(yīng)用。
量化感知訓(xùn)練QAT
QAT - Quantization Aware Training, 在訓(xùn)練過程中將量化考慮在內(nèi),通過模擬低精度的效果來訓(xùn)練模型。這種方法可以最大限度地減少量化對模型精度的影響。
03量化方法
均勻量化:
所有權(quán)重與激活值被量化到均勻間隔的離散值上。這簡化了量化的實現(xiàn),是一種普遍使用的量化方法。
非均勻量化:
考量到分布的不均勻性,通過對數(shù)或其他方式量化,目的是最小化量化前后的信號失真。
對稱與非對稱量化:
對稱量化在正負(fù)數(shù)值上使用相同的量化間隔,非對稱量化則允許正負(fù)數(shù)值有不同的量化間隔。
常用量化框架
當(dāng)前工業(yè)界常用的主流量化工具與框架主要有以下三種!
01PyTorch(torch.quantization)
支持訓(xùn)練后量化。PyTorch的量化支持主要包括三種方式:訓(xùn)練后動態(tài)量化(Post Training Dynamic Quantization)、訓(xùn)練后靜態(tài)量化(Post Training Static Quantization)以及量化感知訓(xùn)練(Quantization Aware Training, QAT)。
訓(xùn)練后量化
1. 訓(xùn)練后動態(tài)量化
概述:訓(xùn)練后動態(tài)量化是指在模型訓(xùn)練完成后,僅對模型的權(quán)重進(jìn)行量化,而激活(activations)在推理過程中進(jìn)行量化。這種方式適用于那些對精度要求不是特別高,但需要快速部署的場景。
特點:
簡單易用:不需要重新訓(xùn)練模型,只需要對訓(xùn)練好的模型進(jìn)行量化。 性能提升:與浮點數(shù)模型相比,量化后的模型在推理速度上會有顯著提升,同時模型大小也會減小。 示例代碼:
import torch from torch import nn from torch.quantization import quantize_dynamic class DemoModel(nn.Module): def __init__(self): super(DemoModel, self).__init__() self.conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=1) self.relu = nn.ReLU() self.fc = nn.Linear(2, 2) def forward(self, x): x = self.conv(x) x = self.relu(x) x = self.fc(x) return x model_fp32 = DemoModel() model_int8 = quantize_dynamic( model=model_fp32, qconfig_spec={nn.Linear}, # 僅對Linear層進(jìn)行量化 dtype=torch.qint8 )
2. 訓(xùn)練后靜態(tài)量化
概述:訓(xùn)練后靜態(tài)量化是指對模型訓(xùn)練完成后,不僅對權(quán)重進(jìn)行量化,還對激活進(jìn)行量化。這種方式需要收集一些代表性的數(shù)據(jù)來標(biāo)定(calibrate)量化參數(shù),以確保量化后的模型精度盡可能接近原始模型。由于同時量化了權(quán)重和激活,因此量化后的模型精度通常比動態(tài)量化更高。需要收集代表性的數(shù)據(jù)來標(biāo)定量化參數(shù)。
示例流程:
1. 準(zhǔn)備標(biāo)定數(shù)據(jù)集。
2. 加載并準(zhǔn)備模型(設(shè)置eval模式,并附加量化配置)。
3. 使用標(biāo)定數(shù)據(jù)集對模型進(jìn)行標(biāo)定,以收集權(quán)重和激活的分布信息。
4. 將標(biāo)定后的模型轉(zhuǎn)換為量化模型。
量化感知訓(xùn)練(QAT)
雖然QAT不屬于訓(xùn)練后量化的范疇,但它是另一種重要的量化方式,值得提及。QAT是在模型訓(xùn)練過程中插入偽量化模塊,模擬量化效應(yīng),從而提高模型對量化操作的適應(yīng)能力。這種方式可以在一定程度上彌補靜態(tài)量化在精度上的損失。
02OpenVINO NCCF
OpenVINO NCCF(Neural Network Compression Framework)量化框架是OpenVINO工具套件中的一個重要組成部分,旨在幫助開發(fā)者通過量化技術(shù)優(yōu)化深度學(xué)習(xí)模型的性能。OpenVINO NCCF是一個用于深度學(xué)習(xí)模型壓縮的框架,它提供了多種壓縮算法,包括量化、剪枝、蒸餾等,以幫助開發(fā)者減小模型大小、提高推理速度和降低功耗。量化作為其中的一種重要技術(shù),通過將模型中的浮點數(shù)參數(shù)轉(zhuǎn)換為整數(shù),實現(xiàn)了模型的壓縮和加速。
OpenVINO NCCF量化流程
OpenVINO NCCF量化流程通常包括以下幾個步驟:
模型準(zhǔn)備:
首先,需要有一個訓(xùn)練好的深度學(xué)習(xí)模型,該模型可以是PyTorch、TensorFlow等框架下的模型。
模型轉(zhuǎn)換:
將訓(xùn)練好的模型轉(zhuǎn)換為OpenVINO的中間表示(IR)格式。這一步是可選的,但轉(zhuǎn)換為IR格式可以更好地利用OpenVINO的優(yōu)化功能。
量化配置:
配置量化參數(shù),包括量化精度(如INT8、FP16等)、量化策略(如對稱量化、非對稱量化等)以及量化目標(biāo)設(shè)備(如CPU、GPU等)。
量化執(zhí)行:
使用OpenVINO NCCF提供的量化工具或API對模型進(jìn)行量化。這一步通常包括前向傳播以收集統(tǒng)計信息、計算量化參數(shù)以及應(yīng)用量化參數(shù)到模型權(quán)重和激活中。
模型評估:
對量化后的模型進(jìn)行評估,以驗證量化對模型精度的影響。如果精度損失在可接受范圍內(nèi),則可以繼續(xù)使用量化后的模型;否則,需要調(diào)整量化參數(shù)并重新執(zhí)行量化。
模型部署:
將量化后的模型部署到目標(biāo)設(shè)備上,進(jìn)行實際的推理任務(wù)。
OpenVINO NCCF量化優(yōu)勢
高精度保持:
OpenVINO NCCF提供了多種量化策略和算法,可以幫助開發(fā)者在保持模型精度的同時實現(xiàn)顯著的壓縮和加速。
多硬件支持:
OpenVINO NCCF支持多種硬件平臺,包括Intel CPU、GPU、FPGA等,使得量化后的模型可以在不同的硬件上實現(xiàn)高效的推理。
易用性:
OpenVINO NCCF提供了豐富的API和工具,使得開發(fā)者可以輕松地集成和使用量化功能,無需深入了解底層的量化算法和優(yōu)化技術(shù)。
ResNet18的圖像分類模型FP32與INT8量化版本推理速度比較:
在OpenVINO的官方文檔和社區(qū)中,可以找到關(guān)于NCCF量化的詳細(xì)示例和教程。這些示例通常包括模型準(zhǔn)備、轉(zhuǎn)換、量化、評估和部署等整個流程,為開發(fā)者提供了寶貴的參考和指導(dǎo)。
03TensorRT量化框架
TensorRT量化是深度學(xué)習(xí)模型優(yōu)化的一種重要手段,它通過將模型中的參數(shù)(如權(quán)重)從浮點數(shù)(如FP32)轉(zhuǎn)換為整數(shù)(如INT8)來減少模型的存儲和計算成本,從而達(dá)到模型壓縮和運算加速的目的。
TensorRT量化的基本概念
NVIDIA的TensorRT是一個高性能的深度學(xué)習(xí)推理優(yōu)化器,它支持多種深度學(xué)習(xí)框架(如TensorFlow、PyTorch等)的模型,并提供了一系列的優(yōu)化技術(shù),包括量化、層融合、動態(tài)張量等,以加速深度學(xué)習(xí)模型的推理速度。
TensorRT量化的目標(biāo) 減少模型大?。?/p>
通過量化,可以將模型的參數(shù)從浮點數(shù)轉(zhuǎn)換為整數(shù),從而顯著減少模型的存儲需求。
加速推理速度:
在支持INT8等低精度整數(shù)運算的硬件上,使用量化后的模型可以顯著提高推理速度。
降低功耗:
在一些嵌入式或移動設(shè)備上,使用量化后的模型可以降低功耗,延長設(shè)備的使用時間。
TensorRT量化的實現(xiàn)方式
TensorRT支持多種量化方式,主要包括隱式量化和顯式量化兩種:
隱式量化:
在TensorRT的早期版本中,隱式量化是主要的量化方式。它不需要修改模型結(jié)構(gòu)或訓(xùn)練代碼,只需要在模型推理過程中使用TensorRT提供的量化工具進(jìn)行量化。隱式量化通常適用于訓(xùn)練后量化(PTQ)場景。
顯式量化:
從TensorRT 8.0版本開始,顯式量化得到了全面支持。顯式量化允許在模型訓(xùn)練過程中插入量化指令(如QDQ操作),并在模型推理過程中使用TensorRT進(jìn)行量化。顯式量化可以提供更高的量化精度和更好的性能優(yōu)化。
TensorRT量化的校準(zhǔn)方法
在TensorRT中,量化過程中需要使用校準(zhǔn)數(shù)據(jù)集來確定量化參數(shù)(如縮放因子和零點)。TensorRT支持多種校準(zhǔn)方法,包括熵校準(zhǔn)和最小最大值校準(zhǔn)等:
熵校準(zhǔn):
熵校準(zhǔn)是一種動態(tài)校準(zhǔn)算法,它使用KL散度(KL Divergence)來度量推理數(shù)據(jù)和校準(zhǔn)數(shù)據(jù)之間的分布差異。在校準(zhǔn)過程中,TensorRT會分析每個張量的分布,并選擇合適的量化參數(shù)以最小化KL散度。
最小最大值校準(zhǔn):
最小最大值校準(zhǔn)使用最小最大值算法來計算量化參數(shù)。在校準(zhǔn)過程中,TensorRT會統(tǒng)計校準(zhǔn)數(shù)據(jù)中的最小值和最大值,并根據(jù)這些值來計算量化參數(shù)。
-
模型
+關(guān)注
關(guān)注
1文章
3243瀏覽量
48840 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5503瀏覽量
121162 -
pytorch
+關(guān)注
關(guān)注
2文章
808瀏覽量
13226
原文標(biāo)題:深度學(xué)習(xí)模型量化方法與框架介紹
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論