首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >TensorRT、OpenVINO、ONNXRuntime INT8量化:三份脚本,一张表,直接封神

TensorRT、OpenVINO、ONNXRuntime INT8量化:三份脚本,一张表,直接封神

作者头像
OpenCV学堂
发布2026-07-14 18:35:56
发布2026-07-14 18:35:56
220
举报

TensorRT INT8 量化方法述

TensorRT进行INT8量化时,官方推荐的方式是通过NVIDIA ModelOpt库在PyTorch模型中插入QDQ(量化/反量化)节点,再由Torch-TensorRT编译器自动转换为TRT量化层并设置相应构建标志。这种方法属于训练后量化(PTQ),其核心在于准备一个能代表真实推理场景的小型校准数据集,通过ModelOpt的mtq.quantize接口对模型进行校准,计算出合适的量化尺度,而无需进行耗时的微调。

校准完成后,模型会带有QDQ节点,此时直接使用Torch-TensorRT的torch_tensorrt.compile接口编译,编译器会自动识别并处理这些节点,生成INT8精度的TensorRT引擎

代码语言:javascript
复制
# TensorRT INT8 量化示例脚本 (基于PyTorch + ModelOpt)
import torch
import modelopt.torch.quantization as mtq
import 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%,这些特征可以轻松适配并应用于任何特定场景。

代码语言:javascript
复制
# OpenVINO INT8 量化示例脚本 (使用NNCF)
代码语言:javascript
复制
import nncf
from openvino.runtime import Core, serialize
from 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_item
    return 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),从而实现灵活的量化策略。

代码语言:javascript
复制
# ONNX Runtime INT8 量化示例脚本
import onnx
from onnxruntime.quantization import quantize_static, QuantType, QuantFormat
from 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),从而发挥各自所长。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档