PaddlePaddle / Paddle2ONNX

ONNX Model Exporter for PaddlePaddle
Apache License 2.0
670 stars 157 forks source link

【Hackathon 6th No.56】Add deform conv2d op #1256

Closed xiaoyewww closed 1 month ago

xiaoyewww commented 1 month ago

Details: add deform conv2d op

xiaoyewww commented 1 month ago
@Zheng-Bicheng 具体接入的时候有几个问题需要请教一下:
    // 1. 这个变量名称映射paddle的是哪个呢?看上去是ops.yaml和op_compat.yaml吗?
    // 2. c++ api上没有bias,这个是def deformable_conv调用C_ops后再加上的,这里怎么处理呢?optional的输入也要全写入吗
    // 3. 这个opsetx怎么具体对应起来呢?跟onnx似乎对不上
xiaoyewww commented 1 month ago

另外这个仓库pre-commit还在使用吗,昨天配置的时候一直遇到网络的问题

Zheng-Bicheng commented 1 month ago

目前PR存在的问题

Zheng-Bicheng commented 1 month ago

另外这个仓库pre-commit还在使用吗,昨天配置的时候一直遇到网络的问题

这个确实暂时用不了,先不管他,保持一个文件内的代码格式变化不要太大就好了

xiaoyewww commented 1 month ago

目前PR存在的问题

  • ONNX DeformConv只支持 opset19+,因此需要升级 opset 版本,这个将由 @Zheng-Bicheng 来做支持
  • OpsetX()函数的调用过程默认从当前模型的 Opset 版本 向下一级一级往下降。例如当前的Opset版本是16,那么Paddle2ONNX会先看Opset16()这个有没有实现,没有的话就会去调用Opset15(),最低调用到Opset7()
  • Bias我看了下是可选的,可以暂时不用管它,传一个默认的参数(猜测过去应该是0),其他的函数有类似的逻辑,我晚上回去截图给你
  • 变量名称映射 paddle 我没明白是什么意思

还有几个问题

  • 这里的opset 版本我没弄清楚是跟onnx什么关系,比如deformconv,onnx只支持19+,我们也只需要定义Opset19吗,但我看conv2d是Opset7,但是onnx上opset1就支持了。
  • 变量名称映射,我是指GetAttr这里面的属性获取的第一个参数是怎么来的。
Zheng-Bicheng commented 1 month ago

这里的opset 版本我没弄清楚是跟onnx什么关系,比如deformconv,onnx只支持19+,我们也只需要定义Opset19吗,但我看conv2d是Opset7,但是onnx上opset1就支持了。

opset和onnx版本绑定,一个onnx版本对应一个opset,Paddle2ONNX默认从opset7开始支持,目前Paddle2ONNX支持的最高opset是18,因此需要升级

Zheng-Bicheng commented 1 month ago

变量名称映射,我是指GetAttr这里面的属性获取的第一个参数是怎么来的。

可以用netron可视化静态图模型获取

xiaoyewww commented 1 month ago

@Zheng-Bicheng 那我目前这边测例无法通过就不用改了吗,请麻烦看一下还有哪里需要修改。

目前单测报的是版本不支持的问题:

[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: deform_conv2d/cliped_model.pdmodel
[Paddle2ONNX] Parameters file path: 
[Paddle2ONNX] Start to parsing Paddle model...
[ERROR] Paddle2ONNX now only support opset version in range of [7, 18].

--------------------------------------
C++ Traceback (most recent call last):
--------------------------------------
0   paddle2onnx::Export(char const*, char const*, char**, int*, int, bool, bool, bool, bool, bool, paddle2onnx::CustomOp*, int, char const*, char**, int*, char const*, bool*, bool, char**, int)

----------------------
Error Message Summary:
----------------------
FatalError: `Process abort signal` is detected by the operating system.
  [TimeInfo: *** Aborted at 1716473326 (unix time) try "date -d @1716473326" if you are using GNU date ***]
  [SignalInfo: *** SIGABRT (@0x7b3da) received by PID 504794 (TID 0x7f2e08d8e4c0) from PID 504794 ***]

[1]    504794 abort (core dumped)  python tests/test_deform_conv2d.py
Zheng-Bicheng commented 1 month ago

那我目前这边测例无法通过就不用改了吗,请麻烦看一下还有哪里需要修改。

我今天会添加Paddle2ONNX对OP19的支持,到时候你再测试下

Zheng-Bicheng commented 1 month ago

在这个 PR 中更新 opset 版本到支持19

xiaoyewww commented 1 month ago
/root/miniconda3/envs/paddle_onnx/lib/python3.9/site-packages/paddle/static/io.py:610: UserWarning: no variable in your model, please ensure there are any variables in your model to save
  warnings.warn(
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: deform_conv2d/cliped_model.pdmodel
[Paddle2ONNX] Parameters file path: 
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 19 for ONNX export.
[Paddle2ONNX] The exported ONNX model is invalid.
[Paddle2ONNX] Model checker error log: No Op registered for DeformConv with domain_version of 19

==> Context: Bad node spec for node. Name: p2o.DeformConv.0 OpType: DeformConv
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
Traceback (most recent call last):
  File "/wuzp/Paddle2ONNX/tests/test_deform_conv2d.py", line 41, in <module>
    test_deform_conv2d()
  File "/wuzp/Paddle2ONNX/tests/test_deform_conv2d.py", line 37, in test_deform_conv2d
    obj.run()
  File "/wuzp/Paddle2ONNX/tests/onnxbase.py", line 420, in run
    res_fict[str(v)] = self._mk_onnx_res(ver=v)
  File "/wuzp/Paddle2ONNX/tests/onnxbase.py", line 300, in _mk_onnx_res
    sess = InferenceSession(
  File "/root/miniconda3/envs/paddle_onnx/lib/python3.9/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 419, in __init__
    self._create_inference_session(providers, provider_options, disabled_optimizers)
  File "/root/miniconda3/envs/paddle_onnx/lib/python3.9/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py", line 483, in _create_inference_session
    sess.initialize_session(providers, provider_options, disabled_optimizers)
onnxruntime.capi.onnxruntime_pybind11_state.NotImplemented: [ONNXRuntimeError] : 9 : NOT_IMPLEMENTED : Could not find an implementation for DeformConv(19) node with name 'p2o.DeformConv.0'

上面还是报错了,这里有点困惑,其实我上面只输入了三个参数。X W offset,另外的bias和mask其实一开始没填,还是报同样的错。

我参考看了一下conv2d,这里面其实也只有两个输入参数,但是ONNX上是输入参数也是2~3个。

  auto node = helper_->MakeNode(
      "Conv", {input_info[0].name, kernel_info[0].name}, {output_info[0].name});
Zheng-Bicheng commented 1 month ago

Model checker error log: No Op registered for DeformConv with domain_version of 19

这个我看了下好像是第三方库onnx的报错,我再看看原因。

Zheng-Bicheng commented 1 month ago

Model checker error log: No Op registered for DeformConv with domain_version of 19

补充修复:

Zheng-Bicheng commented 1 month ago

ONNXRuntime暂时没有对DeformConv进行实现,考虑实现后再合入这个PR

Zheng-Bicheng commented 1 month ago

或者在这里加入一下你的test的名字吧,也不用注释了

xiaoyewww commented 1 month ago

@Zheng-Bicheng @jzhang533 已注释,麻烦review一下,感谢~