diff --git a/tests/onnx/auto_scan_test.py b/tests/onnx/auto_scan_test.py index b9fdcc59942337be4be7b9f560dede65ccdfacb5..fb4d491c4164845c03a3177d248d96e84cacd67f 100644 --- a/tests/onnx/auto_scan_test.py +++ b/tests/onnx/auto_scan_test.py @@ -165,6 +165,9 @@ class OPConvertAutoScanTest(unittest.TestCase): if not isinstance(op_names, (tuple, list)): op_names = [op_names] + if not isinstance(min_opset_version, (tuple, list)): + min_opset_version = [min_opset_version] + input_type_list = None if len(test_data_types) > 1: input_type_list = list(product(*test_data_types)) @@ -188,7 +191,7 @@ class OPConvertAutoScanTest(unittest.TestCase): enable_onnx_checker = config["enable_onnx_checker"] for i in range(len(op_names)): - obj = ONNXConverter(op_names[i], min_opset_version, + obj = ONNXConverter(op_names[i], min_opset_version[i], max_opset_version, op_names[i], inputs_name, outputs_name, inputs_shape, delta, rtol, attrs, enable_onnx_checker) diff --git a/tests/onnx/onnxbase.py b/tests/onnx/onnxbase.py index be8c859f6fe97d5f0ee64a69a518351261d3b210..4931a464cc12d7ad282f9d6167cf96f7b393f27c 100644 --- a/tests/onnx/onnxbase.py +++ b/tests/onnx/onnxbase.py @@ -175,7 +175,8 @@ class ONNXConverter(object): onnx_path, paddle_path, convert_to_lite=False, - enable_onnx_checker=self.enable_onnx_checker) + enable_onnx_checker=self.enable_onnx_checker, + disable_feedback=True) def _mk_paddle_res(self, ver): """ diff --git a/tests/onnx/test_auto_scan_elementwise_ops.py b/tests/onnx/test_auto_scan_elementwise_ops.py new file mode 100644 index 0000000000000000000000000000000000000000..d528dd9626251a72e04b633a54bf530327b4bedf --- /dev/null +++ b/tests/onnx/test_auto_scan_elementwise_ops.py @@ -0,0 +1,82 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from auto_scan_test import OPConvertAutoScanTest +from hypothesis import reproduce_failure +from onnxbase import randtool +import hypothesis.strategies as st +import numpy as np +import unittest + +min_opset_version_map = { + "Add": 7, + "Sub": 7, + "Div": 7, + "Mul": 7, + "Pow": 7, + "Max": 9, + "Min": 9, +} + + +class TestElementwiseopsConvert(OPConvertAutoScanTest): + """ + ONNX op: elementwise ops + OPset version: 7~15 + """ + + def sample_convert_config(self, draw): + input1_shape = draw( + st.lists( + st.integers( + min_value=10, max_value=20), min_size=2, max_size=4)) + + if draw(st.booleans()): + input2_shape = [input1_shape[-1]] + else: + input2_shape = input1_shape + + def generator_data(): + input_data = randtool("float", -5.0, 5.0, input2_shape) + input_data[abs(input_data) < 1.0] = 1.0 + return input_data + + input_dtype = draw(st.sampled_from(["float32", "float64"])) + + config = { + "op_names": ["Add", "Sub", "Div", "Mul", "Pow", "Max", "Min"], + "test_data_shapes": [input1_shape, generator_data], + "test_data_types": [[input_dtype], [input_dtype]], + "inputs_shape": [], + "min_opset_version": 7, + "inputs_name": ["x", "y"], + "outputs_name": ["z"], + "delta": 1e-4, + "rtol": 1e-4 + } + min_opset_versions = list() + for op_name in config["op_names"]: + min_opset_versions.append(min_opset_version_map[op_name]) + config["min_opset_version"] = min_opset_versions + + attrs = {} + + return (config, attrs) + + def test(self): + self.run_and_statis(max_examples=30) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/onnx/test_auto_scan_mod.py b/tests/onnx/test_auto_scan_mod.py new file mode 100644 index 0000000000000000000000000000000000000000..05e6b0e31bbeaa948f653078cfaaf9fd4eea4cb8 --- /dev/null +++ b/tests/onnx/test_auto_scan_mod.py @@ -0,0 +1,69 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from auto_scan_test import OPConvertAutoScanTest +from hypothesis import reproduce_failure +from onnxbase import randtool +import hypothesis.strategies as st +import numpy as np +import unittest + + +class TestModConvert(OPConvertAutoScanTest): + """ + ONNX op: Mod + OPset version: 10~15 + """ + + def sample_convert_config(self, draw): + input1_shape = draw( + st.lists( + st.integers( + min_value=10, max_value=20), min_size=2, max_size=4)) + + if draw(st.booleans()): + input2_shape = [input1_shape[-1]] + else: + input2_shape = input1_shape + + def generator_data(): + input_data = randtool("float", -5.0, 5.0, input2_shape) + input_data[abs(input_data) < 1.0] = 1.0 + return input_data + + input_dtype = draw( + st.sampled_from(["int32", "int64", "float32", "float64"])) + + config = { + "op_names": ["Mod"], + "test_data_shapes": [input1_shape, generator_data], + "test_data_types": [[input_dtype], [input_dtype]], + "inputs_shape": [], + "min_opset_version": 10, + "inputs_name": ["x", "y"], + "outputs_name": ["z"], + "delta": 1e-4, + "rtol": 1e-4 + } + + attrs = {"fmod": 0 if "int" in input_dtype else 1, } + + return (config, attrs) + + def test(self): + self.run_and_statis(max_examples=30) + + +if __name__ == "__main__": + unittest.main() diff --git a/x2paddle/op_mapper/onnx2paddle/opset10.py b/x2paddle/op_mapper/onnx2paddle/opset10.py index 61f4d2aa58202eb9738c39111ea1deb8cf307758..48df1e4bc5e49da1f05313e9e59dd3bf2dad4c63 100644 --- a/x2paddle/op_mapper/onnx2paddle/opset10.py +++ b/x2paddle/op_mapper/onnx2paddle/opset10.py @@ -32,3 +32,5 @@ def print_mapping_info(func): class OpSet10(OpSet9): def __init__(self, decoder, paddle_graph): super(OpSet10, self).__init__(decoder, paddle_graph) + # Support Mod op Since opset version >= 10 + self.elementwise_ops.update({"Mod": "paddle.mod"}) diff --git a/x2paddle/utils.py b/x2paddle/utils.py index 12be0b0de96c015af6f776897562ecdd5fd23cb4..235cdcdea84b30a6bfcef5a960a62e3a8712793f 100644 --- a/x2paddle/utils.py +++ b/x2paddle/utils.py @@ -83,6 +83,7 @@ class ConverterCheck(threading.Thread): params.update({"extra": json.dumps(extra)}) try: + logging.basicConfig(level=logging.INFO) requests.get(stats_api, params, timeout=2) except Exception: pass