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

evaluation_with_imagenet.py is failure #344

Closed yuyinsl closed 1 year ago

yuyinsl commented 1 year ago

运行官方示例跑Resnet50报错: ppq/ppq/samples/Imagenet/evaluation_with_imagenet.py Test: [700 / 781] Prec@1 75.843 (75.843) Prec@5 92.812 (92.812) Evaluating Model...: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 781/781 [00:34<00:00, 22.68it/s]

环境:

  1. ppq git commit id: commit 76e03261bad580e7c52e6f0856034fa9313f69b5 (HEAD -> master, origin/master, origin/HEAD) Author: AwesomeCodingBoy 43309460+ZhangZhiPku@users.noreply.github.com Date: Tue Dec 13 14:03:47 2022 +0800

    Update inference_with_ncnn.md (#324)

  2. onnxruntime 1.13.1 onnxruntime-gpu 1.13.1 或 onnxruntime 1.8.1 onnxruntime-gpu 1.8.1

ZhangZhiPku commented 1 year ago

好像你需要更新一下ppq,于此同时你需要注意并不是所有导出的带qdq节点的onnx模型onnxruntime都可以成功运行,很多时候我们只是拿onnx做一个传递scale信息的工具。

yuyinsl commented 1 year ago

“你需要注意并不是所有导出的带qdq节点的onnx模型onnxruntime都可以成功运行,很多时候我们只是拿onnx做一个传递scale信息的工具。” 大神你好,我更新到最新的ppq问题依旧,您回复的这句话我没有理解,如果要传递scale,直接使用json就行了呀? 事实上我是要验证ppq量化后模型的精度,我目前使用的两个方法都行不通: 1.将量化后的模型使用ppl.nn跑:该方案在一些比较简单的模型情况下是可以的(比如resnet),但是很多常用模型或是新出的模型,ppl.nn自身还不够完善,很多算子不支持或出错或精度不对。 2.将量化后的模型使用onnxruntime跑:onnxruntime的算子还是比较完备的,但是该官方例子跑不通导致比较难进行精度验证。 如果导出的onnx模型不全都可以用onnxruntime运行的话,对于精度验证是否还有别的办法?至于量化误差,很多时候逐层或累计量化误差已经较小了(比如小于0.02)但是精度却有很大的损失,难以定位是ppq量化的问题还是别的方面的问题。 另外很奇怪的一点,我一楼log中显示 推理验证已经运行完了却报错,如果一开始就出错,不会跑到 [700 / 781] 感谢志神解答。

ZhangZhiPku commented 1 year ago

你运行的脚本应该会先尝试使用 ppq 完成第一遍推理验证,毕竟如果 ppq 里面精度都不够那应该是有点问题。 而后才会使用 onnxruntime 进行第二遍推理验证,你好像是第二遍推理过程中报错了。

你可以把导出的带qdq节点的Onnx发我瞅一眼。

模型格式的问题很冗杂,不过大多数情况下ppq导出的onnx模型确实不是用来直接onnxruntime加载运行的。 如果你需要Onnxruntime上部署的量化模型,你可以参考这个样例: https://github.com/openppl-public/ppq/blob/master/ppq/samples/Onnxruntime/Example_PTQ.py