From cfcb6320f96aa1c9baa7bc5b7a8ef2f4866775a6 Mon Sep 17 00:00:00 2001 From: Roman Kazantsev Date: Thu, 18 Apr 2024 20:35:56 +0400 Subject: [PATCH] [MO Tests] Remove unit tests for no longer needed IR Reader (#24090) **Details:** Sometimes it generates sporadic failures in precommit. **Ticket:** 138724 Signed-off-by: Kazantsev, Roman --- .../unit_tests/mo/utils/ir_reader/__init__.py | 0 .../mo/utils/ir_reader/layer_to_class_test.py | 206 -------- .../unit_tests/mo/utils/ir_reader/ops_test.py | 459 ------------------ .../mo/utils/ir_reader/restore_graph_test.py | 448 ----------------- 4 files changed, 1113 deletions(-) delete mode 100644 tools/mo/unit_tests/mo/utils/ir_reader/__init__.py delete mode 100644 tools/mo/unit_tests/mo/utils/ir_reader/layer_to_class_test.py delete mode 100644 tools/mo/unit_tests/mo/utils/ir_reader/ops_test.py delete mode 100644 tools/mo/unit_tests/mo/utils/ir_reader/restore_graph_test.py diff --git a/tools/mo/unit_tests/mo/utils/ir_reader/__init__.py b/tools/mo/unit_tests/mo/utils/ir_reader/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tools/mo/unit_tests/mo/utils/ir_reader/layer_to_class_test.py b/tools/mo/unit_tests/mo/utils/ir_reader/layer_to_class_test.py deleted file mode 100644 index c74e09aeaca..00000000000 --- a/tools/mo/unit_tests/mo/utils/ir_reader/layer_to_class_test.py +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright (C) 2018-2024 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -import numpy as np - -import openvino.tools.mo.graph.graph -from openvino.tools.mo.graph.graph import Node -from openvino.tools.mo.utils.ir_engine.compare_graphs import compare_graphs -from openvino.tools.mo.utils.ir_reader.internal_ops.squeeze import SqueezeInternal -from openvino.tools.mo.utils.ir_reader.internal_ops.unsqueeze import UnsqueezeInternal -from openvino.tools.mo.utils.ir_reader.layer_to_class import groupconv_to_conv, restore_tensor_names -from unit_tests.utils.graph import build_graph -from unit_tests.utils.graph import connect_data,shaped_parameter, regular_op_with_shaped_data, connect, valued_const_with_data, shaped_const_with_data, result -from openvino.tools.mo.ops.op import Op - - -class TestFunction(): - @pytest.mark.parametrize("shape, weights_shape, reshape_shape, group",[([1, 32, 112, 112], [32, 1, 1, 3], [32, 1, 1, 1, 3], 32), - ([1, 32, 112, 112], [32, 1, 1, 1, 3], None, 32), - ]) - def test_groupconv_to_conv(self, shape, weights_shape, reshape_shape, group): - weights_const = np.random.randn(*weights_shape).astype(np.float32) - - nodes_attributes = { - **shaped_parameter('input', shape), - **regular_op_with_shaped_data('group_conv', shape, {'type': 'GroupConvolution'}), - **regular_op_with_shaped_data('conv', shape, {'type': 'Convolution'}), - **valued_const_with_data('weights', weights_const, weights_shape, {'type': 'Const'}), - **regular_op_with_shaped_data('reshape', reshape_shape, {'type': 'Reshape'}), - **shaped_const_with_data('reshape_const', len(reshape_shape) if reshape_shape is not None else None, {'type': 'Const'}), - **regular_op_with_shaped_data('add', shape, {'type': 'Add'}), - **shaped_const_with_data('add_const', [1, 32, 1, 1], {'type': 'Const'}), - **result("result") - } - - edges = [*connect('input:0', 'group_conv:0'), - *connect('group_conv:0', 'add:0'), - *connect('add_const:0', 'add:1'), - *connect('add:0', 'result:0'), - ] - - if reshape_shape is not None: - - edges += [*connect('weights:0', 'reshape:0'), - *connect('reshape_const:0', 'reshape:1'), - *connect('reshape:0', 'group_conv:1')] - else: - edges += [*connect('weights:0', 'group_conv:1')] - - graph = build_graph(nodes_attributes, edges) - reshape_node = None - if reshape_shape is None: - reshape_node = Node(graph, 'reshape') - - graph_ref = build_graph(nodes_attributes, - [*connect('input:0', 'conv:0'), - *connect('weights:0', 'conv:1'), - *connect('conv:0', 'add:0'), - *connect('add_const:0', 'add:1'), - *connect('add:0', 'result:0'), - ]) - for op in graph.get_op_nodes(type='GroupConvolution'): - groupconv_to_conv(op) - - if reshape_shape is None: - new_shape = [weights_shape[1] * group, *weights_shape[2:]] - weights_const = np.reshape(weights_const, new_shape) - node = Node(graph_ref, 'weights') - node.value = weights_const - - assert len(reshape_node.in_nodes()) == 0 and len(reshape_node.out_nodes()) == 0 - - (flag, resp) = compare_graphs(graph, graph_ref, 'result', check_op_attrs=True) - assert flag, resp - - def test_restore_tensor_names(self): - - shape = [1, 3, 224, 224] - - nodes_attributes = { - 'input': {'kind': 'op', 'type': 'Parameter', 'ports': {0: (shape, 'abc,def')}}, - 'input_data': {'shape': shape, 'kind': 'data'}, - 'add': {'kind': 'op', 'type': 'Add', 'ports': {2: (shape, r'ghi\,jkl')}}, - 'add_data': {'shape': shape, 'kind': 'data'}, - 'add_const': {'kind': 'op', 'type': 'Const', 'ports': {0: (shape, r'mno,pqr\,stu')}}, - 'add_const_data': {'shape': shape, 'kind': 'data'}, - 'result': {'kind': 'op', 'type': 'Result', 'ports': {0: (shape, None)}} - } - - edges = [('input', 'input_data'), - ('input_data', 'add'), - ('add_const', 'add_const_data'), - ('add_const_data', 'add'), - ('add', 'add_data'), - ('add_data', 'result'), - ] - - graph = build_graph(nodes_attributes, edges, nodes_with_edges_only=True) - - for op in graph.get_op_nodes(): - restore_tensor_names(op) - - node_1 = Node(graph, 'input_data') - node_2 = Node(graph, 'add_data') - node_3 = Node(graph, 'add_const_data') - - assert node_1['fw_tensor_debug_info'] == [('abc', 'abc'), ('def', 'def')], 'Restored debug info is wrong!' - assert node_2['fw_tensor_debug_info'] == [('ghi,jkl', 'ghi,jkl')], 'Restored debug info is wrong!' - assert node_3['fw_tensor_debug_info'] == [('mno', 'mno'), ('pqr,stu', 'pqr,stu')], \ - 'Restored debug info is wrong!' - - def test_squeeze(self): - nodes_attributes = { - 'input': {'kind': 'op', 'type': 'Parameter'}, - 'input_data': {'shape': [2, 1, 3], 'kind': 'data'}, - - 'axis': {'kind': 'op', 'type': 'Const', 'op': 'Const', 'value': np.array(1), 'shape': []}, - 'axis_data': {'shape': [], 'kind': 'data', 'value': np.array(1)}, - - 'squeeze': {'kind': 'op', 'type': 'Squeeze'}, - 'squeeze_data': {'shape': [2, 3], 'kind': 'data', 'value': None}, - - 'result': {'kind': 'op', 'type': 'Result'} - } - - edges = [('input', 'input_data'), - ('input_data', 'squeeze'), - ('axis', 'axis_data'), - ('axis_data', 'squeeze'), - ('squeeze', 'squeeze_data'), - ('squeeze_data', 'result'), - ] - - graph = build_graph(nodes_attributes, edges, nodes_with_edges_only=True) - - squeeze_node = Node(graph, 'squeeze') - SqueezeInternal.infer(squeeze_node) - - graph_ref = build_graph(nodes_attributes, edges, nodes_with_edges_only=True) - - # Check that graph wasn't changed after shape infer - (flag, resp) = compare_graphs(graph, graph_ref, 'result', check_op_attrs=True) - assert flag, resp - - def test_squeeze_no_axes(self): - nodes_attributes = { - 'input': {'kind': 'op', 'type': 'Parameter'}, - 'input_data': {'shape': [2, 1, 3], 'kind': 'data'}, - - 'squeeze': {'kind': 'op', 'type': 'Squeeze'}, - 'squeeze_data': {'shape': [2, 3], 'kind': 'data', 'value': None}, - - 'result': {'kind': 'op', 'type': 'Result'} - } - - edges = [('input', 'input_data'), - ('input_data', 'squeeze'), - ('squeeze', 'squeeze_data'), - ('squeeze_data', 'result'), - ] - - graph = build_graph(nodes_attributes, edges, nodes_with_edges_only=True) - - squeeze_node = Node(graph, 'squeeze') - SqueezeInternal.infer(squeeze_node) - - graph_ref = build_graph(nodes_attributes, edges, nodes_with_edges_only=True) - - # Check that graph wasn't changed after shape infer - (flag, resp) = compare_graphs(graph, graph_ref, 'result', check_op_attrs=True) - assert flag, resp - - def test_unsqueeze(self): - nodes_attributes = { - 'input': {'kind': 'op', 'type': 'Parameter'}, - 'input_data': {'shape': [2, 3], 'kind': 'data'}, - - 'axis': {'kind': 'op', 'type': 'Const', 'op': 'Const', 'value': np.array(1), 'shape': []}, - 'axis_data': {'shape': [], 'kind': 'data', 'value': np.array(1)}, - - 'unsqueeze': {'kind': 'op', 'type': 'Unsqueeze'}, - 'unsqueeze_data': {'shape': [2, 1, 3], 'kind': 'data', 'value': None}, - - 'result': {'kind': 'op', 'type': 'Result'} - } - - edges = [('input', 'input_data'), - ('input_data', 'unsqueeze'), - ('axis', 'axis_data'), - ('axis_data', 'unsqueeze'), - ('unsqueeze', 'unsqueeze_data'), - ('unsqueeze_data', 'result'), - ] - - graph = build_graph(nodes_attributes, edges, nodes_with_edges_only=True) - - unsqueeze_node = Node(graph, 'unsqueeze') - UnsqueezeInternal.infer(unsqueeze_node) - - graph_ref = build_graph(nodes_attributes, edges, nodes_with_edges_only=True) - - # Check that graph wasn't changed after shape infer - (flag, resp) = compare_graphs(graph, graph_ref, 'result', check_op_attrs=True) - assert flag, resp diff --git a/tools/mo/unit_tests/mo/utils/ir_reader/ops_test.py b/tools/mo/unit_tests/mo/utils/ir_reader/ops_test.py deleted file mode 100644 index 07424696d38..00000000000 --- a/tools/mo/unit_tests/mo/utils/ir_reader/ops_test.py +++ /dev/null @@ -1,459 +0,0 @@ -# Copyright (C) 2018-2024 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import unittest -import tempfile -import numpy as np -from pathlib import Path - -import openvino.runtime.opset13 as opset13 -import openvino.runtime.opset12 as opset12 -import openvino.runtime.opset11 as opset11 -import openvino.runtime.opset10 as opset10 -from openvino.runtime import Model, serialize, Core, PartialShape, Dimension, Type - -from openvino.tools.mo.utils.ir_reader.restore_graph import restore_graph_from_ir, save_restored_graph -from openvino.tools.mo.utils.logger import init_logger - -# required to be in global area to run MO IR Reader -init_logger('ERROR', False) - - -class TestOps(unittest.TestCase): - @staticmethod - def check_graph_can_save(model, name): - with tempfile.TemporaryDirectory() as tmp: - tmp_path = Path(tmp) - model_xml = tmp_path / (name + '.xml') - model_bin = tmp_path / (name + '.bin') - serialize(model, model_xml, model_bin) - graph, _ = restore_graph_from_ir(model_xml, model_bin) - save_restored_graph(graph, tmp, {}, name + '_restored') - # restore 2 times to validate that after save graph doesn't lose attributes etc. - restored_model_xml = tmp_path / (name + '_restored.xml') - restored_model_bin = tmp_path / (name + '_restored.bin') - graph, _ = restore_graph_from_ir( - restored_model_xml, restored_model_bin) - core = Core() - core.set_property({"ENABLE_MMAP": False}) - # check that re-saved model can be read in runtime - model = core.read_model(restored_model_xml) - return graph, model - - def test_topk_11(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset11.parameter( - data_shape, name="Data", dtype=np.float32) - k_val = np.int32(3) - axis = np.int32(1) - topk = opset11.topk(data_parameter, k_val, axis, - "max", "value", stable=True, name="TopK_11") - model = Model(topk, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'topk_model') - topk_node = graph.get_op_nodes(op="TopK")[0] - self.assertEqual(topk_node["version"], "opset11") - self.assertTrue(topk_node["stable"]) - self.assertEqual(topk_node["index_element_type"], np.int32) - - def test_interpolate_11(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset11.parameter( - data_shape, name="Data", dtype=np.float32) - interpolate = opset11.interpolate(data_parameter, np.int32( - [20, 48]), "nearest", "sizes", axes=np.int32([2, 3]), name="Interpolate_11") - model = Model(interpolate, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'interpolate_model') - interpolate_node = graph.get_op_nodes(op="Interpolate")[0] - self.assertEqual(interpolate_node["version"], "opset11") - self.assertTrue("force_precision_in_ports" in interpolate_node) - self.assertEqual(interpolate_node["force_precision_in_ports"], {1: 'int64'}) - - def test_interpolate_11_scales(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset11.parameter( - data_shape, name="Data", dtype=np.float32) - interpolate = opset11.interpolate(data_parameter, np.float32( - [2., 2.]), "nearest", "scales", axes=np.int32([2, 3]), name="Interpolate_11") - model = Model(interpolate, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'interpolate_model') - interpolate_node = graph.get_op_nodes(op="Interpolate")[0] - self.assertEqual(interpolate_node["version"], "opset11") - self.assertTrue("force_precision_in_ports" not in interpolate_node) - - def test_interpolate_11_no_axes(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset11.parameter( - data_shape, name="Data", dtype=np.float32) - interpolate = opset11.interpolate(data_parameter, np.int32( - [6, 12, 20, 48]), "nearest", "sizes", name="Interpolate_11") - model = Model(interpolate, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'interpolate_model') - interpolate_node = graph.get_op_nodes(op="Interpolate")[0] - self.assertEqual(interpolate_node["version"], "opset11") - self.assertTrue("force_precision_in_ports" in interpolate_node) - self.assertEqual(interpolate_node["force_precision_in_ports"], {1: 'int64'}) - - def test_interpolate_4(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset10.parameter( - data_shape, name="Data", dtype=np.float32) - interpolate = opset10.interpolate(data_parameter, np.int32([20, 48]), np.float32( - [2, 2]), "nearest", "sizes", axes=np.int32([2, 3]), name="Interpolate_4") - model = Model(interpolate, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'interpolate4_model') - interpolate_node = graph.get_op_nodes(op="Interpolate")[0] - self.assertEqual(interpolate_node["version"], "opset4") - - def test_unique(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset10.parameter( - data_shape, name="Data", dtype=np.float32) - unique = opset10.unique(data_parameter, axis=np.int32( - [2]), sorted=True, name="Unique_10") - model = Model(unique, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'unique_model') - unique_node = graph.get_op_nodes(op="Unique")[0] - self.assertEqual(unique_node["version"], "opset10") - self.assertListEqual(unique_node.out_port( - 0).data.get_shape().tolist(), [6, 12, None, 24]) - self.assertTrue(unique_node["sorted"]) - - def test_is_finite(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset10.parameter( - data_shape, name="Data", dtype=np.float32) - is_finite = opset10.is_finite(data_parameter, name="Is_finite_10") - model = Model(is_finite, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'is_finite_model') - is_finite_node = graph.get_op_nodes(op="IsFinite")[0] - self.assertEqual(is_finite_node["version"], "opset10") - - def test_is_inf(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset10.parameter( - data_shape, name="Data", dtype=np.float32) - is_inf = opset10.is_inf(data_parameter, name="Is_inf_10") - model = Model(is_inf, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'is_inf_model') - is_inf_node = graph.get_op_nodes(op="IsInf")[0] - self.assertEqual(is_inf_node["version"], "opset10") - - def test_is_nan(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset10.parameter( - data_shape, name="Data", dtype=np.float32) - is_nan = opset10.is_nan(data_parameter, name="Is_nan_10") - model = Model(is_nan, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'is_nan_model') - is_nan_node = graph.get_op_nodes(op="IsNaN")[0] - self.assertEqual(is_nan_node["version"], "opset10") - - def test_if(self): - parameter_x = opset11.parameter([2], np.float32, "pX") - parameter_y = opset11.parameter([2], np.float32, "pY") - const_z = opset11.constant(4.0, dtype=np.float32) - - condition = opset11.constant(True, dtype=bool) - - # then_body - x_t = opset11.parameter([2], np.float32, "X") - y_t = opset11.parameter([2], np.float32, "Y") - mmul_t = opset11.matmul(x_t, y_t, False, False) - mul_t = opset11.multiply(y_t, x_t) - then_body_res_1 = opset11.result(mmul_t) - then_body_res_2 = opset11.result(mul_t) - then_body = Model([then_body_res_1, then_body_res_2], [x_t, y_t]) - - # else_body - x_e = opset11.parameter([2], np.float32, "X") - z_e = opset11.parameter([], np.float32, "Z") - mul_e = opset11.multiply(x_e, z_e) - else_body_res_1 = opset11.result(z_e) - else_body_res_2 = opset11.result(mul_e) - else_body = Model([else_body_res_1, else_body_res_2], [x_e, z_e]) - - if_node = opset11.if_op(condition) - if_node.set_friendly_name("If_opset8") - if_node.set_then_body(then_body) - if_node.set_else_body(else_body) - if_node.set_input(parameter_x.output(0), x_t, x_e) - if_node.set_input(parameter_y.output(0), y_t, None) - if_node.set_input(const_z.output(0), None, z_e) - out1 = if_node.set_output(then_body_res_1, else_body_res_1) - out2 = if_node.set_output(then_body_res_2, else_body_res_2) - - model = Model([out1, out2], [parameter_x, parameter_y]) - graph, _ = TestOps.check_graph_can_save(model, 'if_model') - if_node = graph.get_op_nodes(op="If")[0] - self.assertEqual(if_node["version"], "opset8") - _, layer_info, _ = if_node['IE'][0] - _, callable_attribute = layer_info[0] - self.assertTrue(callable(callable_attribute)) - self.assertEqual(callable_attribute(if_node), "If_opset8") - - def test_strided_slice_no_begin_end_mask(self): - data_shape = [6, 12, 10, 24] - data_parameter = opset11.parameter( - data_shape, name="Data", dtype=np.float32) - strided_slice = opset11.strided_slice(data_parameter, np.int32([1, 2, 3, 4]), np.int32( - [3, 6, 9, 12]), np.int32([1, 1, 1, 1]), begin_mask=[], end_mask=[], name="StridedSlice_10") - model = Model(strided_slice, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'strided_slice_model') - strided_slice_node = graph.get_op_nodes(op="StridedSlice")[0] - self.assertEqual(strided_slice_node["version"], "opset1") - - def test_scatter_dynamic_shape(self): - data_parameter = opset11.parameter( - PartialShape.dynamic(Dimension(2)), name="Data", dtype=np.float32) - shape_of = opset11.shape_of(data_parameter) - gather = opset11.gather(shape_of, np.int32(1), 0) - unsqueeze = opset11.unsqueeze(gather, 0) - scatter = opset11.scatter_update(np.int64([0, 0]), np.int64([1]), unsqueeze, axis=0) - mul = opset11.multiply(scatter, np.int64([1, 2])) - reshape = opset11.reshape(data_parameter, mul, True) - model = Model(reshape, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'scatter_dynamic_model') - scatter_update_node = graph.get_op_nodes(op="ScatterUpdate")[0] - self.assertListEqual(scatter_update_node.out_port(0).data.get_value().tolist(), [0, None]) - - def test_pad_12(self): - data_parameter = opset12.parameter([6, 12, 10, 24], name="Data", dtype=np.float32) - pad = opset12.pad(data_parameter, np.int64([0, 0, -1, -2]), np.int64([0, 0, -3, -4]), "constant") - model = Model(pad, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'pad_model') - pad_node = graph.get_op_nodes(op="Pad")[0] - self.assertEqual(pad_node["version"], "opset12") - self.assertListEqual(pad_node.in_port(1).data.get_value().tolist(), [0, 0, -1, -2]) - self.assertListEqual(pad_node.in_port(2).data.get_value().tolist(), [0, 0, -3, -4]) - self.assertListEqual(pad_node.out_port(0).data.get_shape().tolist(), [6, 12, 6, 18]) - - def test_scatter_elements_update_12(self): - data_parameter = opset12.parameter([10], name="Data", dtype=np.float32) - scatter = opset12.scatter_elements_update(data_parameter, np.int32([5, 0, 7, 5]), np.float32([5., 6., 1.5, -5.]), np.int32(0), "sum", False) - model = Model(scatter, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'scatter_model') - scatter_node = graph.get_op_nodes(op="ScatterElementsUpdate")[0] - self.assertListEqual(scatter_node.out_port(0).data.get_shape().tolist(), [10]) - self.assertEqual(scatter_node["version"], "opset12") - self.assertEqual(scatter_node['reduction'], 'sum') - self.assertFalse(scatter_node['use_init_val']) - - def test_group_norm_12(self): - data_parameter = opset12.parameter([1, 3, 3, 3], name="Data", dtype=np.float32) - scale = np.array((1, 1, 1), dtype=np.float32) - bias = np.array((1, 1, 1), dtype=np.float32) - num_groups = 1 - epsilon = 1e-6 - node = opset12.group_normalization(data_parameter, scale, bias, num_groups, epsilon) - model = Model(node, [data_parameter]) - graph, _ = TestOps.check_graph_can_save(model, 'group_norm_model') - gn_node = graph.get_op_nodes(op="GroupNormalization")[0] - self.assertListEqual(gn_node.out_port(0).data.get_shape().tolist(), [1, 3, 3, 3]) - self.assertEqual(gn_node["version"], "opset12") - self.assertEqual(gn_node['num_groups'], 1) - self.assertEqual(gn_node['epsilon'], 1e-06) - - def test_bitwise_and_13(self): - a = opset13.parameter([4, 1], name="A", dtype=np.int32) - b = opset13.parameter([1, 2], name="B", dtype=np.int32) - - op = opset13.bitwise_and(a, b) - model = Model(op, [a, b]) - graph, _ = TestOps.check_graph_can_save(model, "bitwise_and_model") - op_node = graph.get_op_nodes(op="BitwiseAnd")[0] - self.assertListEqual(op_node.out_port(0).data.get_shape().tolist(), [4, 2]) - self.assertEqual(op_node["version"], "opset13") - self.assertEqual(op_node["auto_broadcast"], "numpy") - - def test_bitwise_or_13(self): - a = opset13.parameter([4, 1], name="A", dtype=np.int32) - b = opset13.parameter([1, 2], name="B", dtype=np.int32) - - op = opset13.bitwise_or(a, b) - model = Model(op, [a, b]) - graph, _ = TestOps.check_graph_can_save(model, "bitwise_or_model") - op_node = graph.get_op_nodes(op="BitwiseOr")[0] - self.assertListEqual(op_node.out_port(0).data.get_shape().tolist(), [4, 2]) - self.assertEqual(op_node["version"], "opset13") - self.assertEqual(op_node["auto_broadcast"], "numpy") - - def test_bitwise_xor_13(self): - a = opset13.parameter([4, 1], name="A", dtype=np.int32) - b = opset13.parameter([1, 2], name="B", dtype=np.int32) - - op = opset13.bitwise_xor(a, b) - model = Model(op, [a, b]) - graph, _ = TestOps.check_graph_can_save(model, "bitwise_xor_model") - op_node = graph.get_op_nodes(op="BitwiseXor")[0] - self.assertListEqual(op_node.out_port(0).data.get_shape().tolist(), [4, 2]) - self.assertEqual(op_node["version"], "opset13") - self.assertEqual(op_node["auto_broadcast"], "numpy") - - def test_bitwise_not_13(self): - a = opset13.parameter([4, 2], name="A", dtype=np.int32) - - op = opset13.bitwise_not(a) - model = Model(op, [a]) - graph, _ = TestOps.check_graph_can_save(model, "bitwise_not_model") - op_node = graph.get_op_nodes(op="BitwiseNot")[0] - self.assertListEqual(op_node.out_port(0).data.get_shape().tolist(), [4, 2]) - self.assertEqual(op_node["version"], "opset13") - - def test_multinomial_13_param_inputs(self): - data_shape = [2, 8] - probs = opset13.parameter( - data_shape, name="probs", dtype=np.float32) - num_samples = opset13.parameter( - [1], name="num_samples", dtype=np.int32) - - op = opset13.multinomial(probs, num_samples, - convert_type="i32", - with_replacement=True, - log_probs=True, - global_seed=456, - op_seed=213) - - model = Model(op, [probs, num_samples]) - graph, loaded_model = TestOps.check_graph_can_save( - model, 'multinomial_param_model') - graph_node = graph.get_op_nodes(op="Multinomial")[0] - - self.assertEqual(graph_node["version"], "opset13") - self.assertListEqual(graph_node.out_port( - 0).data.get_shape().tolist(), [2, None]) - self.assertEqual(graph_node["convert_type"], "i32") - self.assertTrue(graph_node["with_replacement"]) - self.assertTrue(graph_node["log_probs"]) - self.assertEqual(graph_node["global_seed"], 456) - self.assertEqual(graph_node["op_seed"], 213) - self.assertEqual(loaded_model.get_output_element_type(0), Type.i32) - self.assertEqual(loaded_model.get_output_partial_shape( - 0), PartialShape([2, -1])) - - def test_multinomial_13_const_inputs(self): - probs = opset13.constant( - [[0.4, 0.5, 0.1], [0.3, 0.2, 0.5]], name="probs", dtype=np.float32) - num_samples = opset13.constant( - [3], name="num_samples", dtype=np.int64) - - op = opset13.multinomial(probs, num_samples, - convert_type="i64", - with_replacement=False, - log_probs=False) - - model = Model(op, []) - graph, loaded_model = TestOps.check_graph_can_save( - model, 'multinomial_const_model') - graph_node = graph.get_op_nodes(op="Multinomial")[0] - - self.assertEqual(graph_node["version"], "opset13") - self.assertListEqual(graph_node.out_port( - 0).data.get_shape().tolist(), [2, 3]) - self.assertEqual(graph_node["convert_type"], "i64") - self.assertFalse(graph_node["with_replacement"]) - self.assertFalse(graph_node["log_probs"]) - self.assertEqual(graph_node["global_seed"], 0) - self.assertEqual(graph_node["op_seed"], 0) - self.assertEqual(loaded_model.get_output_element_type(0), Type.i64) - self.assertEqual(loaded_model.get_output_partial_shape( - 0), PartialShape([2, 3])) - - def test_nms_rotated_13_attrs_false_i32(self): - boxes_shape = [1, 100, 5] - scores_shape = [1, 2, 100] - max_output_boxes_val = 5 - iou_threshold_val = 0.5 - score_threshold_val = 0.4 - - boxes_parameter = opset13.parameter( - boxes_shape, name="Boxes", dtype=np.float32) - scores_parameter = opset13.parameter( - scores_shape, name="Scores", dtype=np.float32) - - max_output_boxes = opset13.constant([max_output_boxes_val], np.int64) - iou_threshold = opset13.constant([iou_threshold_val], np.float32) - score_threshold = opset13.constant([score_threshold_val], np.float32) - - sort_result_descending = False - output_type = "i32" - clockwise = False - - node = opset13.nms_rotated(boxes_parameter, scores_parameter, max_output_boxes, iou_threshold, - score_threshold, sort_result_descending, output_type, clockwise) - - model = Model(node, [boxes_parameter, scores_parameter]) - graph, loaded_model = TestOps.check_graph_can_save( - model, 'nms_rotated_model_1') - ir_node = graph.get_op_nodes(op="NMSRotated")[0] - - self.assertListEqual(ir_node.out_port( - 0).data.get_shape().tolist(), [None, 3]) - self.assertListEqual(ir_node.out_port( - 1).data.get_shape().tolist(), [None, 3]) - self.assertListEqual(ir_node.out_port( - 2).data.get_shape().tolist(), [1]) - - self.assertEqual(ir_node["version"], "opset13") - self.assertEqual(ir_node['sort_result_descending'], False) - self.assertEqual(ir_node['output_type'], "i32") - self.assertEqual(ir_node['clockwise'], False) - self.assertEqual(loaded_model.get_output_element_type(0), Type.i32) - self.assertEqual(loaded_model.get_output_element_type(1), Type.f32) - self.assertEqual(loaded_model.get_output_element_type(2), Type.i32) - - self.assertEqual(loaded_model.get_output_partial_shape( - 0), PartialShape([Dimension(-1, 10), 3])) - self.assertEqual(loaded_model.get_output_partial_shape( - 1), PartialShape([Dimension(-1, 10), 3])) - self.assertEqual(loaded_model.get_output_partial_shape( - 2), PartialShape([1])) - - def test_nms_rotated_13_attrs_true_i64(self): - boxes_shape = [1, 100, 5] - scores_shape = [1, 3, 100] - max_output_boxes_val = 5 - iou_threshold_val = 0.5 - score_threshold_val = 0.4 - - boxes_parameter = opset13.parameter( - boxes_shape, name="Boxes", dtype=np.float32) - scores_parameter = opset13.parameter( - scores_shape, name="Scores", dtype=np.float32) - - max_output_boxes = opset13.constant([max_output_boxes_val], np.int64) - iou_threshold = opset13.constant([iou_threshold_val], np.float32) - score_threshold = opset13.constant([score_threshold_val], np.float32) - - sort_result_descending = True - output_type = "i64" - clockwise = True - - node = opset13.nms_rotated(boxes_parameter, scores_parameter, max_output_boxes, iou_threshold, - score_threshold, sort_result_descending, output_type, clockwise) - - model = Model(node, [boxes_parameter, scores_parameter]) - graph, loaded_model = TestOps.check_graph_can_save( - model, 'nms_rotated_model_2') - ir_node = graph.get_op_nodes(op="NMSRotated")[0] - - self.assertListEqual(ir_node.out_port( - 0).data.get_shape().tolist(), [None, 3]) - self.assertListEqual(ir_node.out_port( - 1).data.get_shape().tolist(), [None, 3]) - self.assertListEqual(ir_node.out_port( - 2).data.get_shape().tolist(), [1]) - - self.assertEqual(ir_node["version"], "opset13") - self.assertEqual(ir_node['sort_result_descending'], True) - self.assertEqual(ir_node['output_type'], "i64") - self.assertEqual(ir_node['clockwise'], True) - self.assertEqual(loaded_model.get_output_element_type(0), Type.i64) - self.assertEqual(loaded_model.get_output_element_type(1), Type.f32) - self.assertEqual(loaded_model.get_output_element_type(2), Type.i64) - - self.assertEqual(loaded_model.get_output_partial_shape( - 0), PartialShape([Dimension(-1, 15), 3])) - self.assertEqual(loaded_model.get_output_partial_shape( - 1), PartialShape([Dimension(-1, 15), 3])) - self.assertEqual(loaded_model.get_output_partial_shape( - 2), PartialShape([1])) diff --git a/tools/mo/unit_tests/mo/utils/ir_reader/restore_graph_test.py b/tools/mo/unit_tests/mo/utils/ir_reader/restore_graph_test.py deleted file mode 100644 index e137296c3cb..00000000000 --- a/tools/mo/unit_tests/mo/utils/ir_reader/restore_graph_test.py +++ /dev/null @@ -1,448 +0,0 @@ -# Copyright (C) 2018-2024 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import os -import tempfile -import unittest - -import numpy as np -from defusedxml.common import EntitiesForbidden - -import openvino.tools.mo.utils.ir_reader.extenders.convert_extender -from openvino.tools.mo.middle.passes.convert_data_type import destination_type_to_np_data_type -from openvino.tools.mo.middle.passes.infer import type_infer -from openvino.tools.mo.utils.graph import Node -from openvino.tools.mo.utils.ir_engine.compare_graphs import compare_graphs -from openvino.tools.mo.utils.ir_reader.extender import Extender -from openvino.tools.mo.utils.ir_reader.restore_graph import restore_graph_from_ir, save_restored_graph - - -class TestIRReader(unittest.TestCase): - def test_read_xml_incorrect(self): - incorrect_xml = b'\n' \ - b'\n' \ - b' \n' \ - b' \n' \ - b' \n' \ - b' \n' \ - b' \n' \ - b' \n' \ - b' \n' \ - b' \n' \ - b' \n' \ - b' \n' \ - b']>\n' \ - b'&lol9;' - - incorrect_xml_file = tempfile.NamedTemporaryFile(delete=False) - incorrect_xml_file.write(incorrect_xml) - incorrect_xml_file.close() - self.assertRaises(EntitiesForbidden, restore_graph_from_ir, incorrect_xml_file.name) - os.remove(incorrect_xml_file.name) - - def test_read_untrusted_IR(self): - untrusted_xml = b'\n' \ - b'\n' \ - b'\n' \ - b']>\n' \ - b'&xxe;\n' - - untrusted_xml_file = tempfile.NamedTemporaryFile(delete=False) - untrusted_xml_file.write(untrusted_xml) - untrusted_xml_file.close() - self.assertRaises(EntitiesForbidden, restore_graph_from_ir, untrusted_xml_file.name) - os.remove(untrusted_xml_file.name) - - def test_read_malformed_IR(self): - ir_front = b'' \ - b'' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' 1' \ - b' 3' \ - b' 22' \ - b' 22' \ - b' ' \ - b' ' \ - b' ' \ - - ir_front_malformed = b'' \ - b'' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' 1' \ - b' 3' \ - b' 22' \ - b' 22' \ - b' ' \ - b' ' \ - b' ' \ - - ir_end = b' ' \ - b' ' \ - b' ' \ - b' 1' \ - b' 3' \ - b' 22' \ - b' 22' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' 1' \ - b' 3' \ - b' 22' \ - b' 22' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' 1' \ - b' 3' \ - b' 22' \ - b' 22' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b' ' \ - b'' \ - - normal_ir_ir = ir_front + ir_end - normal_ir_file = tempfile.NamedTemporaryFile(delete=False) - normal_ir_file.write(normal_ir_ir) - normal_ir_file.close() - # we must expect no exceptions - restore_graph_from_ir(normal_ir_file.name) - os.remove(normal_ir_file.name) - - # expect that IR Reader complains on IR with malformed port id - malformed_ir = ir_front_malformed + ir_end - malformed_ir_file = tempfile.NamedTemporaryFile(delete=False) - malformed_ir_file.write(malformed_ir) - malformed_ir_file.close() - self.assertRaises(ValueError, restore_graph_from_ir, malformed_ir_file.name) - os.remove(malformed_ir_file.name) - - -class PatchedConvert_extender(Extender): - """ - Original ConvertExtender contains setting 'stop_value_propagation', and because axis value goes to the Gather - through Convert during shape_infer axis turns out to be None and shape_infer fails. - For purposes of this unit-test we patch extender so that it will not add 'stop_value_propagation' attr. - Outside the unit-test Convert_extender is left unchanged because inserting 'stop_value_propagation' - is needed in other cases for CompressQuantizeWeights. - See description of openvino/tools/mo/utils/ir_reader/extenders/convert_extender.py - """ - op = 'Convert' - - @staticmethod - def extend(op: Node): - op['dst_type'] = destination_type_to_np_data_type(op.destination_type) - - -class TestIRSerializeAndRestore(unittest.TestCase): - test_ir_xml = """ - - - - - - - 1 - 128 - - - - - - - - 4 - - - - - - - - 1 - - - - - - - - 1 - 128 - - - 10 - - - 1 - - - - - 1 - 10 - - - - - - - 1 - 10 - - - - - - - - - - - - - """ - - def test_save_and_restore(self): - original_xml_file = tempfile.NamedTemporaryFile(delete=False) - original_xml_file.write(bytes(self.test_ir_xml, 'utf-8')) - original_xml_file.close() - - axis_const_blob = np.array([1], dtype=np.int32) - original_bin_file = tempfile.NamedTemporaryFile(mode='wb', delete=False) - axis_const_blob.tofile(original_bin_file) - original_bin_file.close() - - graph_orig, _ = restore_graph_from_ir(original_xml_file.name, original_bin_file.name) - type_infer(graph_orig) - os.remove(original_xml_file.name) - os.remove(original_bin_file.name) - - restored_ir_dir = tempfile.TemporaryDirectory() - - save_restored_graph(graph_orig.copy(), restored_ir_dir.name, {}) - restored_xml_name = restored_ir_dir.name + '/test_ir.xml' - restored_bin_name = restored_ir_dir.name + '/test_ir.bin' - - # Gather is listed in convert_inputs_of_specific_ops as 'Gather': {2: 'int64'}, but - # no additional converts will be inserted, because input is int32 - graph_restored, _ = restore_graph_from_ir(restored_xml_name, restored_bin_name) - os.remove(restored_xml_name) - os.remove(restored_bin_name) - os.remove(restored_xml_name.replace('xml', 'mapping')) - os.removedirs(restored_ir_dir.name) - - flag, msg = compare_graphs(graph_orig, graph_restored, 'result', 'gather/sink_port_0') - self.assertTrue(flag, msg) - - test_ir_xml_with_i8 = """ - - - - - - - 1 - 128 - - - - - - - - 10 - - - - - - - - 1 - - - - - - - - 1 - 128 - - - 10 - - - 1 - - - - - 1 - 10 - - - - - - - 1 - 10 - - - - - - - - - - - - - """ - - test_ir_xml_with_convert = """ - - - - - - - 1 - 128 - - - - - - - - 10 - - - - - - - - 1 - - - - - - - - 1 - - - - - 1 - - - - - - - - 1 - 128 - - - 10 - - - 1 - - - - - 1 - 10 - - - - - - - 1 - 10 - - - - - - - - - - - - - - """ - - def test_save_and_restore_with_converts(self): - with tempfile.TemporaryDirectory() as tmp_dir: - tmp_dir_path = tmp_dir + os.sep - original_xml_file = tempfile.NamedTemporaryFile(prefix=tmp_dir_path, delete=False) - original_xml_file.write(bytes(self.test_ir_xml_with_i8, 'utf-8')) - original_xml_file.close() - - gather_axis_blob = np.array([1], dtype=np.int8) - original_bin_file = tempfile.NamedTemporaryFile(prefix=tmp_dir_path, mode='wb', delete=False) - gather_axis_blob.tofile(original_bin_file) - original_bin_file.close() - - graph_orig, _ = restore_graph_from_ir(original_xml_file.name, original_bin_file.name) - type_infer(graph_orig) - - save_restored_graph(graph_orig.copy(), tmp_dir_path, {}) - - ir_file_with_convert = tempfile.NamedTemporaryFile(prefix=tmp_dir_path, delete=False) - ir_file_with_convert.write(bytes(self.test_ir_xml_with_convert, 'utf-8')) - ir_file_with_convert.close() - - from openvino.tools.mo.utils.ir_reader.extender import Extender - - if 'Convert' in Extender.registered_ops: - Extender.registered_ops['Convert'] = PatchedConvert_extender - - graph_with_convert, _ = restore_graph_from_ir(ir_file_with_convert.name, original_bin_file.name) - type_infer(graph_with_convert) - - if 'Convert' in Extender.registered_ops: - Extender.registered_ops['Convert'] = openvino.tools.mo.utils.ir_reader.extenders.convert_extender.Convert_extender - - restored_xml_file = tmp_dir_path + 'test_ir.xml' - restored_bin_file = tmp_dir_path + 'test_ir.bin' - - # Gather is listed in convert_inputs_of_specific_ops as 'Gather': {2: 'int64'}, - # converts from int8 to int64 will be inserted - graph_restored, _ = restore_graph_from_ir(restored_xml_file, restored_bin_file) - - flag, msg = compare_graphs(graph_orig, graph_restored, 'result', 'gather/sink_port_0') - self.assertTrue(flag, msg)