From afb4531772e5b035a91998cf924c5a9c234ef078 Mon Sep 17 00:00:00 2001 From: wjj19950828 Date: Mon, 1 Aug 2022 11:01:42 +0800 Subject: [PATCH 1/3] Add autoscan Add op test --- tests/onnx/onnxbase.py | 3 +- tests/onnx/test_auto_scan_add.py | 69 ++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 tests/onnx/test_auto_scan_add.py diff --git a/tests/onnx/onnxbase.py b/tests/onnx/onnxbase.py index be8c859f6..4931a464c 100644 --- a/tests/onnx/onnxbase.py +++ b/tests/onnx/onnxbase.py @@ -175,7 +175,8 @@ def _onnx_to_paddle(self, ver): 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_add.py b/tests/onnx/test_auto_scan_add.py new file mode 100644 index 000000000..25638e023 --- /dev/null +++ b/tests/onnx/test_auto_scan_add.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 TestAddConvert(OPConvertAutoScanTest): + """ + ONNX op: Add + 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(["int32", "int64", "float32", "float64"])) + + config = { + "op_names": ["Add"], + "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 + } + + attrs = {} + + return (config, attrs) + + def test(self): + self.run_and_statis(max_examples=30) + + +if __name__ == "__main__": + unittest.main() From 9b35e66f824b88a8379297fef8c13b9dfe24ffbd Mon Sep 17 00:00:00 2001 From: wjj19950828 Date: Mon, 1 Aug 2022 15:01:01 +0800 Subject: [PATCH 2/3] Add elementwise op tests --- tests/onnx/auto_scan_test.py | 5 +++- ...d.py => test_auto_scan_elementwise_ops.py} | 23 +++++++++++++++---- x2paddle/op_mapper/onnx2paddle/opset10.py | 2 ++ x2paddle/utils.py | 1 + 4 files changed, 25 insertions(+), 6 deletions(-) rename tests/onnx/{test_auto_scan_add.py => test_auto_scan_elementwise_ops.py} (76%) diff --git a/tests/onnx/auto_scan_test.py b/tests/onnx/auto_scan_test.py index b9fdcc599..fb4d491c4 100644 --- a/tests/onnx/auto_scan_test.py +++ b/tests/onnx/auto_scan_test.py @@ -165,6 +165,9 @@ def run_test(self, configs): 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 @@ def run_test(self, configs): 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/test_auto_scan_add.py b/tests/onnx/test_auto_scan_elementwise_ops.py similarity index 76% rename from tests/onnx/test_auto_scan_add.py rename to tests/onnx/test_auto_scan_elementwise_ops.py index 25638e023..d528dd962 100644 --- a/tests/onnx/test_auto_scan_add.py +++ b/tests/onnx/test_auto_scan_elementwise_ops.py @@ -19,10 +19,20 @@ 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 TestAddConvert(OPConvertAutoScanTest): + +class TestElementwiseopsConvert(OPConvertAutoScanTest): """ - ONNX op: Add + ONNX op: elementwise ops OPset version: 7~15 """ @@ -42,11 +52,10 @@ def generator_data(): input_data[abs(input_data) < 1.0] = 1.0 return input_data - input_dtype = draw( - st.sampled_from(["int32", "int64", "float32", "float64"])) + input_dtype = draw(st.sampled_from(["float32", "float64"])) config = { - "op_names": ["Add"], + "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": [], @@ -56,6 +65,10 @@ def generator_data(): "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 = {} diff --git a/x2paddle/op_mapper/onnx2paddle/opset10.py b/x2paddle/op_mapper/onnx2paddle/opset10.py index 61f4d2aa5..6231c598d 100644 --- a/x2paddle/op_mapper/onnx2paddle/opset10.py +++ b/x2paddle/op_mapper/onnx2paddle/opset10.py @@ -32,3 +32,5 @@ def run_mapping(*args, **kwargs): class OpSet10(OpSet9): def __init__(self, decoder, paddle_graph): super(OpSet10, self).__init__(decoder, paddle_graph) + # Support Mod op + self.elementwise_ops.update({"Mod": "paddle.mod"}) diff --git a/x2paddle/utils.py b/x2paddle/utils.py index 12be0b0de..235cdcdea 100644 --- a/x2paddle/utils.py +++ b/x2paddle/utils.py @@ -83,6 +83,7 @@ def run(self): params.update({"extra": json.dumps(extra)}) try: + logging.basicConfig(level=logging.INFO) requests.get(stats_api, params, timeout=2) except Exception: pass From fe25c958da8280ab574e48f5b54a99b8d0e7ecdf Mon Sep 17 00:00:00 2001 From: wjj19950828 Date: Mon, 1 Aug 2022 15:26:51 +0800 Subject: [PATCH 3/3] Add mod optest --- tests/onnx/test_auto_scan_mod.py | 69 +++++++++++++++++++++++ x2paddle/op_mapper/onnx2paddle/opset10.py | 2 +- 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 tests/onnx/test_auto_scan_mod.py diff --git a/tests/onnx/test_auto_scan_mod.py b/tests/onnx/test_auto_scan_mod.py new file mode 100644 index 000000000..05e6b0e31 --- /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 6231c598d..48df1e4bc 100644 --- a/x2paddle/op_mapper/onnx2paddle/opset10.py +++ b/x2paddle/op_mapper/onnx2paddle/opset10.py @@ -32,5 +32,5 @@ def run_mapping(*args, **kwargs): class OpSet10(OpSet9): def __init__(self, decoder, paddle_graph): super(OpSet10, self).__init__(decoder, paddle_graph) - # Support Mod op + # Support Mod op Since opset version >= 10 self.elementwise_ops.update({"Mod": "paddle.mod"})