PaddlePaddle / Paddle2ONNX

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

当我使用opset 7测试bitwiseand时报错 #1290

Closed jiuyuedeyu156 closed 1 week ago

jiuyuedeyu156 commented 1 week ago

1 问题描述

(1)当我使用opset 7测试bitwiseand时报错 (2)当我使用opset 7指令将(1)生成的model.pdmodel转为onnx时没有报错。 问题:为什么测试时不会自动升级opset?

2 报错详情

2.1 使用opset7测试

测试代码:

def test_bitwise_and_int_type():
    """
    api: paddle.bitwise_and
    op version: 7
    """
    op = Net()
    op.eval()
    # net, name, ver_list, delta=1e-6, rtol=1e-5
    obj = APIOnnx(op, 'BitwiseAnd_spec', [7])
    obj.set_input_data(
        "input_data",
        paddle.to_tensor([-5, -1, 1]),
        paddle.to_tensor([4,  2, -3]))
    obj.run()

测试报错:

[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: BitwiseAnd_spec/cliped_model.pdmodel
[Paddle2ONNX] Parameters file path: 
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] [bitwise_and: bitwise_and_0.tmp_0] Requires the minimal opset version of 18.
[Paddle2ONNX] Due to the operator: bitwise_and, requires opset_version >= 18.
[Paddle2ONNX] This PaddlePaddle model is not able to export to ONNX with opset_version=7, please set the opset_version to 18 or higher for successfully conversion.
[ERROR] Due to opset version, the model exporting is aborted, please set a higher opset_version or set auto_upgrade_opset=true.

2.2 使用指令转模型

对 2.1 生成的model.pdmodel直接使用指令:

paddle2onnx --model_dir ./ --model_filename model.pdmodel  --save_file model.onnx --opset_version 7

没有报错,因为自动升级了opset:

[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: ./model.pdmodel
[Paddle2ONNX] Parameters file path: 
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] [bitwise_and: bitwise_and_0.tmp_0] Requires the minimal opset version of 18.
[Paddle2ONNX] Due to the operator: bitwise_and, requires opset_version >= 18.
[Paddle2ONNX] Opset version will change to 18 from 7
[Paddle2ONNX] Use opset_version = 18 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.

3 补充说明

bitwiseand 源码 https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/paddle2onnx/mapper/tensor/bitwise_and.cc#L20 bitwiseand onnx https://onnx.ai/onnx/operators/onnx__BitwiseAnd.html and onnx https://onnx.ai/onnx/operators/onnx__And.html#and

Jiang-Jia-Jun commented 1 week ago

这个是设计的逻辑,基于以下三个前提

因此在这个情况下,单测不会做自动OpSet的升级,因为例如开发人员认为7是可以被支持的,但如若自动升级绕过了这个逻辑,单测的意义就不存在了。

jiuyuedeyu156 commented 1 week ago

这个是设计的逻辑,基于以下三个前提

  • 对应OP单测代码,是对应代码开发人员写的
  • 对应代码开发人员清楚知道此OP能在哪些opset下被支持
  • 单测需要能测试此OP后续是否仍然可以在相应的opset上支持

因此在这个情况下,单测不会做自动OpSet的升级,因为例如开发人员认为7是可以被支持的,但如若自动升级绕过了这个逻辑,单测的意义就不存在了。

明白了,感谢回复