微信公眾號:OpenCV學(xué)堂
關(guān)注獲取更多計(jì)算機(jī)視覺與深度學(xué)習(xí)知識
TensorRT INT8 量化方法述
TensorRT進(jìn)行INT8量化時(shí),官方推薦的方式是通過NVIDIA ModelOpt庫在PyTorch模型中插入QDQ(量化/反量化)節(jié)點(diǎn),再由Torch-TensorRT編譯器自動轉(zhuǎn)換為TRT量化層并設(shè)置相應(yīng)構(gòu)建標(biāo)志。這種方法屬于訓(xùn)練后量化(PTQ),其核心在于準(zhǔn)備一個能代表真實(shí)推理場景的小型校準(zhǔn)數(shù)據(jù)集,通過ModelOpt的mtq.quantize接口對模型進(jìn)行校準(zhǔn),計(jì)算出合適的量化尺度,而無需進(jìn)行耗時(shí)的微調(diào)。

校準(zhǔn)完成后,模型會帶有QDQ節(jié)點(diǎn),此時(shí)直接使用Torch-TensorRT的torch_tensorrt.compile接口編譯,編譯器會自動識別并處理這些節(jié)點(diǎn),生成INT8精度的TensorRT引擎
# TensorRT INT8 量化示例腳本 (基于PyTorch + ModelOpt)import torchimport modelopt.torch.quantization as mtqimport torch_tensorrt# 1. 準(zhǔn)備模型并設(shè)置為評估模式model = MyModel().eval().cuda()# 2. 定義校準(zhǔn)數(shù)據(jù)加載循環(huán) (使用你的真實(shí)數(shù)據(jù))def calibration_loop(model):for batch in calibration_dataloader: # calibration_dataloader 需提前定義model(batch.cuda())# 3. 應(yīng)用INT8量化配置并進(jìn)行校準(zhǔn)quant_cfg = mtq.INT8_DEFAULT_CFG # 使用默認(rèn)INT8配置mtq.quantize(model, quant_cfg, forward_loop=calibration_loop)# 4. 使用Torch-TensorRT編譯生成INT8引擎inputs = [torch.randn(1, 3, 224, 224).cuda()] # 示例輸入trt_model = torch_tensorrt.compile(model,ir="dynamo",arg_inputs=inputs,min_block_size=1,)print("TensorRT INT8引擎生成完成!")
OpenVINO INT8 量化方法
OpenVINO主要通過其神經(jīng)網(wǎng)絡(luò)壓縮框架(NNCF)來執(zhí)行INT8量化,這是一種典型的訓(xùn)練后量化方法。它的工作流程是:首先將訓(xùn)練好的PyTorch或TensorFlow模型轉(zhuǎn)換為OpenVINO的中間表示(IR)格式,然后利用NNCF提供的API和一個小型校準(zhǔn)數(shù)據(jù)集(通常100-500張圖片即可)進(jìn)行量化參數(shù)校準(zhǔn),最后導(dǎo)出優(yōu)化后的INT8 IR模型。

OpenVINO的量化工具鏈設(shè)計(jì)得非常集成化,能夠自動處理許多量化細(xì)節(jié),在Intel CPU上能獲得顯著的性能提升,模型體積也能縮小約75%,這些特征可以輕松適配并應(yīng)用于任何特定場景。
# OpenVINO INT8 量化示例腳本 (使用NNCF)import nncffrom openvino.runtime import Core, serializefrom openvino.tools import mo# 1. 加載FP32的OpenVINO IR模型core = Core()model = core.read_model("model_fp32.xml")# 2. 準(zhǔn)備校準(zhǔn)數(shù)據(jù)集 (通常是一個小批量的DataLoader)# 假設(shè) validation_loader 是已有的數(shù)據(jù)加載器,這里僅作示意def transform_fn(data_item):images, _ = data_itemreturn images.numpy()calibration_dataset = nncf.Dataset(validation_loader, transform_fn)# 3. 應(yīng)用INT8量化 (使用默認(rèn)預(yù)設(shè))quantized_model = nncf.quantize(model, calibration_dataset, preset=nncf.QuantizationPreset.MIXED)# 4. 保存量化后的INT8 IR模型serialize(quantized_model, "model_int8.xml", "model_int8.bin")print("OpenVINO INT8模型生成完成!")
ORT INT8 量化方法
ONNXRUNTIME的INT8量化流程相對直接,主要使用其內(nèi)置的quantization工具包。整個過程分為三步:首先對原始ONNX模型進(jìn)行預(yù)處理(如Shape推理),然后創(chuàng)建一個校準(zhǔn)數(shù)據(jù)讀取器(CalibrationDataReader)來提供代表真實(shí)輸入分布的數(shù)據(jù),最后調(diào)用quantize_static函數(shù)執(zhí)行靜態(tài)量化,生成新的INT8 ONNX模型。

在量化配置中,可以指定量化類型(如QUInt8)、量化模式(如QDQ)以及需要量化的算子類型(如Conv、MatMul),從而實(shí)現(xiàn)靈活的量化策略。
# ONNX Runtime INT8 量化示例腳本import onnxfrom onnxruntime.quantization import quantize_static, QuantType, QuantFormatfrom onnxruntime.quantization import CalibrationDataReader# 1. 準(zhǔn)備校準(zhǔn)數(shù)據(jù)讀取器 (需自定義以適配你的數(shù)據(jù))class MyDataReader(CalibrationDataReader):def __init__(self):super().__init__()# 初始化你的校準(zhǔn)數(shù)據(jù)列表 (numpy數(shù)組)self.data = [{"input": np.random.randn(1, 3, 224, 224).astype(np.float32)} for _ in range(100)]self.iter = iter(self.data)def get_next(self):return next(self.iter, None)# 2. 執(zhí)行靜態(tài)量化input_model_path = "model_fp32.onnx"output_model_path = "model_int8.onnx"quantized_model = quantize_static(input_model_path,output_model_path,calibration_data_reader=MyDataReader(),quant_format=QuantFormat.QDQ, # 使用QDQ格式activation_type=QuantType.QUInt8,weight_type=QuantType.QUInt8,per_channel=False,op_types_to_quantize=["Conv", "MatMul"], # 指定需要量化的算子類型)print("ONNX Runtime INT8模型生成完成!")
總結(jié)

綜合來看,選擇哪個框架應(yīng)基于你的目標(biāo)硬件、性能需求和部署靈活性來權(quán)衡:追求NVIDIA GPU上的峰值性能首選TensorRT,Intel生態(tài)內(nèi)部署優(yōu)先OpenVINO,而需要兼容多種硬件或保持框架中立則推薦ONNX Runtime。實(shí)際項(xiàng)目中,這三種工具也常常組合使用(例如用ONNX作為中間格式,再轉(zhuǎn)換到TensorRT或OpenVINO),從而發(fā)揮各自所長。

推薦閱讀
玩轉(zhuǎn)YOLOv8~YOLO11全系模型從訓(xùn)練到推理就靠它了
C#上位機(jī)開發(fā)專屬OpenCV系統(tǒng)化教程
C#中輕松實(shí)現(xiàn)OpenCV算法零代碼開發(fā)
深度學(xué)習(xí)系統(tǒng)化學(xué)習(xí)路線圖專題(2025版本)
【零代碼】OpenCV C# 快速開發(fā)框架演示
正式發(fā)布|OpenVINO2025深度學(xué)習(xí)與大模型部署教程
C#上位機(jī)開發(fā)專屬OpenCV系統(tǒng)化教程
