PaddlePaddle / PaddleSlim

PaddleSlim is an open-source library for deep model compression and architecture search.
https://paddleslim.readthedocs.io/zh_CN/latest/
Apache License 2.0
1.54k stars 348 forks source link

[Paddle2ONNX] Oops, there are some operators not supported yet #1766

Open aixuedegege opened 1 year ago

aixuedegege commented 1 year ago

运行如下代码报错了:[Paddle2ONNX] Oops, there are some operators not supported yet,including fake_channel_wise_quantize_dequantize_abs_max,fake_quantize_dequantize_moving_average_abs_max,

import fastdeploy as fd
import os
import cv2
import time
option = fd.RuntimeOption()
#option.use_openvino_backend()
option.use_ort_backend()
#option.use_paddle_infer_backend()
#option.use_trt_backend()
#option.set_trt_cache_file(os.path.join("ppyoloe_crn_l_300e_coco_qat", "model.trt"))
#option.set_trt_input_shape("image", min_shape=[1, 3, 640, 640])
#option.set_trt_input_shape("scale_factor", min_shape=[1, 2])
model_file = os.path.join("ppyoloe_l_qat", "model.pdmodel")
params_file = os.path.join("ppyoloe_l_qat", "model.pdiparams")
config_file = os.path.join("ppyoloe_l_qat", "infer_cfg.yml")
model = fd.vision.detection.PPYOLOE( model_file, params_file, config_file, runtime_option=option)

ppyoloe_l_qat里面的模型是通过如下生成的,我将model、params分别重命名为model.pdmodel、model.pdiparams, infer_cfg.yml是从训练的文件拷贝出来的。再用上述方式推理报了文章开头的错:

from paddlelite.lite import *
# 1. 创建opt实例
opt=Opt()
# 2. 指定输入模型地址 
opt.set_model_dir("/data/ai/xc/PaddleDetection-release-2.6/output_inference/ppyoloe_l_qat")
# 3. 指定转化类型: arm、x86、opencl、npu
opt.set_valid_places("x86")
# 4. 指定模型转化类型: naive_buffer、protobuf
opt.set_model_type("protobuf")
# 4. 输出模型地址
opt.set_optimize_out("/data/ai/xc/PaddleDetection-release-2.6/output_inference/ppyoloe_l_qat_paddlelite/ppyoloe_l_qat_paddlelite")
# 5. 执行模型优化
opt.run()

训练和导出代码如下:


python tools/train.py -c configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml \
--use_vdl=true \
--vdl_log_dir=vdl_dir/scalar5  \
--slim_config configs/slim/quant/ppyoloe_l_qat.yml  \
--eval

python tools/export_model.py \
-c configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml  \
--slim_config configs/slim/quant/ppyoloe_l_qat.yml \
-o weights=output/ppyoloe_l_qat/model_final

环境如下:

pip list | grep paddle
paddle-bfloat           0.1.7
paddle2onnx             1.0.6
paddlefsl               1.1.0
paddlenlp               2.4.9
paddlepaddle-gpu        2.4.1.post112
paddleslim              2.4.1
x2paddle                1.4.0

求破,在线等,急。

Wst-sd commented 6 months ago

请问问题解决了吗? 我也导不出onnx

aixuedegege commented 6 months ago

没有,没用这个了

Wst-sd commented 6 months ago

已收到邮件,谢谢!

PlumBlossomMaid commented 4 months ago

如果你观察paddle2onnx的输出的话,你会发现p2o会检测到这个是一个量化模型。对于量化之后的算子,paddle2onnx没有与其对应的onnx算子,所以无法导出。这是因为本身算子就无法导出还是因为p2o的作者懒呢?在同类框架Pytorch中,torch.onnx.export也无法导出经过量化的算子,所以我认为经过量化之后的模型是没有与其对应的onnx算子的,因而也无法导出。如果想要导出为onnx并且实现模型压缩的话,建议在训练的时候不进行量化处理,在导出onnx之后单独使用onnxslim库进行模型优化。