OpenPPL / ppq

PPL Quantization Tool (PPQ) is a powerful offline neural network quantization tool.
Apache License 2.0
1.57k stars 236 forks source link

QDQ+onnxruntime 和 导出后的 trt+int8 模型结果不能对齐 #482

Closed zt706 closed 1 year ago

zt706 commented 1 year ago

你好,我这边测试发现 QDQ+onnxruntime(导出平台选 onnxruntime) 和导出后的 trt+int8 (导出平台选trt_int8,产生 fp32+json,然后使用build_engine 函数 (https://github.com/openppl-public/ppq/blob/master/ppq/utils/TensorRTUtil.py#L212 )导出到trt+int8模型)推理结果不能对齐

环境使用你们提供的 stephen222/ppq:ubuntu18.04_cuda11.4_cudnn8.4_trt8.4.1.5 容器, 代码使用最新master 分支

我看以前也有人问过类似的问题( https://github.com/openppl-public/ppq/issues/173 ) 经过一些调试和测试(比如说屏蔽最后一些层,切换量化算法),仍然还是不能对齐。倾向于是 (fp32 onnx + json)转换到 trt+int8 过程中出了问题。

ZhangZhiPku commented 1 year ago

您可以试试用那个TestAlignment函数验证一下是否确实是对不齐。 https://github.com/openppl-public/ppq/blob/master/ppq/utils/TensorRTUtil.py

如果确实出现了网络量化后跟trt对不上的情况,此时您需要将网络的后半部分截断,看看前半部分能否对齐。您需要不断调整网络截断的位置,从而找出问题所在。

zt706 commented 1 year ago

我是超分模型,结果对比过,int8+trt 确实 比 qdq+onnxruntime 模糊很多

我来试试你的方法。

另外想请教2个问题: 1 ppq导出平台选 trt_int8 后, 生成的 fp32 onnx + json文件,然后导出到 int8 trt; 和 ppq导出平台选 onnxruntime 后, 生成的 qdq onnx 文件, 他们的输出差异(都是int8)一般多少算是正常的。 2 对于超分类模型,是否使用 tensorrt 加载 qdq onnx 文件,后的输出更加容易对齐(虽然目前 tensorrt 不能读取 ppq 的 qdq onnx)

ZhangZhiPku commented 1 year ago

第一种方式导出json到trt,误差需要小于1%,你可以用ppq里面自己带的那个torch_snr_error函数去测误差。 第二种方式确实更容易对齐,误差一般小于万分之一,它的代价是使用这种方式生成的engine运行速度比较慢...