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

校準完成后,模型會帶有QDQ節點,此時直接使用Torch-TensorRT的torch_tensorrt.compile接口編譯,編譯器會自動識別并處理這些節點,生成INT8精度的TensorRT引擎
# TensorRT INT8 量化示例腳本 (基于PyTorch + ModelOpt)import torchimport modelopt.torch.quantization as mtqimport torch_tensorrt# 1. 準備模型并設置為評估模式model = MyModel().eval().cuda()# 2. 定義校準數據加載循環 (使用你的真實數據)def calibration_loop(model):for batch in calibration_dataloader: # calibration_dataloader 需提前定義model(batch.cuda())# 3. 應用INT8量化配置并進行校準quant_cfg = mtq.INT8_DEFAULT_CFG # 使用默認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主要通過其神經網絡壓縮框架(NNCF)來執行INT8量化,這是一種典型的訓練后量化方法。它的工作流程是:首先將訓練好的PyTorch或TensorFlow模型轉換為OpenVINO的中間表示(IR)格式,然后利用NNCF提供的API和一個小型校準數據集(通常100-500張圖片即可)進行量化參數校準,最后導出優化后的INT8 IR模型。

OpenVINO的量化工具鏈設計得非常集成化,能夠自動處理許多量化細節,在Intel CPU上能獲得顯著的性能提升,模型體積也能縮小約75%,這些特征可以輕松適配并應用于任何特定場景。
# 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. 準備校準數據集 (通常是一個小批量的DataLoader)# 假設 validation_loader 是已有的數據加載器,這里僅作示意def transform_fn(data_item):images, _ = data_itemreturn images.numpy()calibration_dataset = nncf.Dataset(validation_loader, transform_fn)# 3. 應用INT8量化 (使用默認預設)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量化流程相對直接,主要使用其內置的quantization工具包。整個過程分為三步:首先對原始ONNX模型進行預處理(如Shape推理),然后創建一個校準數據讀取器(CalibrationDataReader)來提供代表真實輸入分布的數據,最后調用quantize_static函數執行靜態量化,生成新的INT8 ONNX模型。

在量化配置中,可以指定量化類型(如QUInt8)、量化模式(如QDQ)以及需要量化的算子類型(如Conv、MatMul),從而實現靈活的量化策略。
# ONNX Runtime INT8 量化示例腳本import onnxfrom onnxruntime.quantization import quantize_static, QuantType, QuantFormatfrom onnxruntime.quantization import CalibrationDataReader# 1. 準備校準數據讀取器 (需自定義以適配你的數據)class MyDataReader(CalibrationDataReader):def __init__(self):super().__init__()# 初始化你的校準數據列表 (numpy數組)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. 執行靜態量化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模型生成完成!")
總結

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

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