ptq和qat后导出的onnx模型转换为 tensorRT 的int8模型 注意事项

1. 带有QDQ节点的onnx模型, 无法转换为 fp16精度的 trt 模型, 仅仅可以用于转换 int8精度的 trt模型;

2. onnx 导出保存信息:

export failure: Exporting the operator fake_quantize_per_channel_affine to ONNX opset version 12 is not supported. Support for this operator was added in version 13, try exporting with this version

导出需要显式量化的层, 需要采用:
opset_version=13

        torch.onnx.export(
            model.cpu() if dynamic_shape else model,  # --dynamic only compatible with cpu
            im.cpu() if dynamic_shape else im,
            onnx_filename,
            verbose=False,
            opset_version=13,   # opset>=13 才开始支持 qdq 节点;
            training= torch.onnx.TrainingMode.EVAL,  # 不写参数也可以转换成功TRT模型
            do_constant_folding=True,  # 不写参数也可以转换成功TRT模型, 因为默认值即为 True
            input_names=['images'],
            output_names=['output'],
            dynamic_axes={
                'images': {0: 'batch'},
                'output': {0: 'batch'}  # shape(1,25200,85)
            } if dynamic_shape else None)
  1. 转换脚本:
#!/bin/bash


export CUDA_VISIBLE_DEVICES=0

export LD_LIBRARY_PATH=\
/mnt/TRT/TensorRT-8.6.0.12/targets/x86_64-linux-gnu/lib:\
/usr/local/cuda/lib64:\
/mnt/TRT/public/lean_trt8.2_cudnn8.2_protobuf11.4_cuda_11.0-11.5/cudnn8.2.2.26/lib:\
:$LD_LIBRARY_PATH

current_dir=$(cd `dirname $0`;pwd)
echo ${current_dir}

dst="/mnt/TRT/TensorRT-8.6.0.12/bin"
cd ${dst}

./trtexec \
--onnx=${current_dir}/yolov5_onnx/yolov5n_ptq_detect_dynamic_notDoConstant.onnx \
--saveEngine=${current_dir}/yolov5_onnx/yolov5n_ptq_detect_dynamic_notDoConstant.trt \
--buildOnly \
--minShapes=images:1x3x672x672 \
--optShapes=images:4x3x672x672 \
--maxShapes=images:8x3x672x672 \
--int8 \
--fp16
### PaddleOCR 高精度模型 INT8 量化转换教程 为了将 PaddleOCR 的高精度模型转换INT8 格式以优化性能,可以采用训练后量化的技术。这种方法不需要重新训练模型即可实现较低的计算复杂度更小的存储需求,同时保持较高的推理准确性。 以下是具体方法: #### 方法概述 PaddlePaddle 提供了内置的支持来执行训练后的量化操作。通过 `paddle.quantization` API,可以直接对预训练模型应用量化处理[^4]。对于 PaddleOCR 这样的 OCR 工具包中的高精度模型,可以通过以下步骤完成 INT8 转换。 --- #### 准备工作 1. **安装依赖库** 确保已安装最新版本的 PaddlePaddle PaddleOCR 库。 ```bash pip install paddlepaddle==2.5.0 paddleocr>=2.6.0.2 ``` 2. **加载预训练模型** 使用 PaddleOCR 中提供的接口下载并加载目标检测器或识别器的高精度模型。 ```python from paddleocr import PaddleOCR ocr_model = PaddleOCR(use_angle_cls=True, lang='en', det=False, rec=True) ``` 3. **导入量化工具** 导入 PaddlePaddle 的量化模块用于后续配置。 ```python import paddle from paddle import nn from paddle.quantization import QuantConfig from paddle.quantization.quanters.abs_max import FakeQuanterWithAbsMaxObserver ``` --- #### 实现细节 ##### 创建量化配置对象 定义一个适合于 INT8 推理的量化策略。这里我们选择绝对最大值观察法作为量化方式之一。 ```python q_config = QuantConfig(activation=FakeQuanterWithAbsMaxObserver(moving_rate=0.9)) ``` ##### 初始化量化感知实例 创建一个基于上述配置的对象,并将其应用于待量化的神经网络结构之上。 ```python from paddle.quantization import QAT model_to_quantize = ocr_model.rec_model # 假设只针对文字识别部分进行量化 quanted_model = QAT(config=q_config).quantize(model_to_quantize) ``` ##### 数据校准过程 由于采用了 Post Training Quantization 技术,在实际部署前还需要利用真实数据集调整权重分布范围参数。 ```python def calibrate(quanted_model, dataloader): quanted_model.eval() with paddle.no_grad(): for data in dataloader: images = data['image'] outputs = quanted_model(images) calibration_data_loader = ... # 构建自己的验证集合loader函数 calibrate(quanted_model, calibration_data_loader) ``` ##### 模型保存与导出 最后一步就是序列化经过量化的模型文件以便日后使用。 ```python save_path = './int8_rec_model' paddle.save(quanted_model.state_dict(), f"{save_path}/model.pdparams") print(f"Quantized model saved at {save_path}") ``` --- #### 注意事项 尽管训练后量化能够显著减少内存占用以及提升速度表现,但在某些情况下可能会引入额外误差从而影响最终效果。因此建议始终对比原始浮点数版本与整数量子版之间的差异指标如 top-k precision 或者 mean average error 来评估质量损失程度 [^5]. 此外值得注意的是,如果发现因单纯依靠PTQ而导致预测精确度过低,则可进一步探索 Quantization Aware Training(QAT),不过这通常意味着需要投入更多时间成本去微调超参设置等环节 [^1]. --- ### 总结 以上即是从零开始指导如何把来自 PaddleOCR 的高性能字符辨识方案转化为更加高效能导向之 INT8 表达形式的一套流程指南。希望这些信息对你有所帮助! ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值