[PyOV] clean up in tests (#19091)
* [PyOV] clean up in tests * use generated model in tests * fix ci * return back fild * fix ci 1 * fix ci2 * update * move models * return back deleted test * move model creation from conftest * fix ci * fix ci
This commit is contained in:
1 parent
b790458da6
commit
23cad1770e
23 files changed
+383
-357
No files matched your search
@@ -5,74 +5,15 @@
|
||||
import os
|
||||
import pytest
|
||||
|
||||
from sys import platform
|
||||
from openvino.runtime import Core
|
||||
|
||||
|
||||
def get_model_with_template_extension():
|
||||
core = Core()
|
||||
ir = bytes(b"""<net name="Activation" version="10">
|
||||
<layers>
|
||||
<layer name="in1" type="Parameter" id="0" version="opset1">
|
||||
<data shape="1,3,22,22" element_type="f32"/>
|
||||
<output>
|
||||
<port id="0" precision="FP32" names="in_data">
|
||||
<dim>1</dim>
|
||||
<dim>3</dim>
|
||||
<dim>22</dim>
|
||||
<dim>22</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer name="activation" id="1" type="Identity" version="extension">
|
||||
<input>
|
||||
<port id="1" precision="FP32">
|
||||
<dim>1</dim>
|
||||
<dim>3</dim>
|
||||
<dim>22</dim>
|
||||
<dim>22</dim>
|
||||
</port>
|
||||
</input>
|
||||
<output>
|
||||
<port id="2" precision="FP32" names="out_data">
|
||||
<dim>1</dim>
|
||||
<dim>3</dim>
|
||||
<dim>22</dim>
|
||||
<dim>22</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer name="output" type="Result" id="2" version="opset1">
|
||||
<input>
|
||||
<port id="0" precision="FP32">
|
||||
<dim>1</dim>
|
||||
<dim>3</dim>
|
||||
<dim>22</dim>
|
||||
<dim>22</dim>
|
||||
</port>
|
||||
</input>
|
||||
</layer>
|
||||
</layers>
|
||||
<edges>
|
||||
<edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
|
||||
<edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
|
||||
</edges>
|
||||
</net>""")
|
||||
if platform == "win32":
|
||||
core.add_extension(library_path="openvino_template_extension.dll")
|
||||
else:
|
||||
core.add_extension(library_path="libopenvino_template_extension.so")
|
||||
return core, core.read_model(ir)
|
||||
|
||||
|
||||
def model_path(is_fp16=False):
|
||||
base_path = os.path.dirname(__file__)
|
||||
if is_fp16:
|
||||
test_xml = os.path.join(base_path, "test_utils", "utils", "test_model_fp16.xml")
|
||||
test_bin = os.path.join(base_path, "test_utils", "utils", "test_model_fp16.bin")
|
||||
test_xml = os.path.join(base_path, "utils", "utils", "test_model_fp16.xml")
|
||||
test_bin = os.path.join(base_path, "utils", "utils", "test_model_fp16.bin")
|
||||
else:
|
||||
test_xml = os.path.join(base_path, "test_utils", "utils", "test_model_fp32.xml")
|
||||
test_bin = os.path.join(base_path, "test_utils", "utils", "test_model_fp32.bin")
|
||||
test_xml = os.path.join(base_path, "utils", "utils", "test_model_fp32.xml")
|
||||
test_bin = os.path.join(base_path, "utils", "utils", "test_model_fp32.bin")
|
||||
return (test_xml, test_bin)
|
||||
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ from openvino.runtime import Core, Model
|
||||
from openvino.runtime.passes import Manager, Serialize, ConstantFolding, Version
|
||||
|
||||
from tests.test_graph.util import count_ops_of_type
|
||||
from tests.test_utils.test_utils import create_filename_for_test, compare_models
|
||||
from tests.utils.helpers import create_filename_for_test, compare_models
|
||||
|
||||
def create_model():
|
||||
shape = [100, 100, 2]
|
||||
|
||||
@@ -2,17 +2,18 @@
|
||||
# Copyright (C) 2018-2023 Intel Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import os
|
||||
import pytest
|
||||
import numpy as np
|
||||
|
||||
from tests.conftest import model_path
|
||||
from tests.test_utils.test_utils import get_relu_model, generate_image, generate_model_and_image, generate_relu_compiled_model
|
||||
from openvino import Model, Shape, Core, Tensor
|
||||
from tests.utils.helpers import (
|
||||
get_relu_model,
|
||||
generate_image,
|
||||
generate_model_and_image,
|
||||
generate_relu_compiled_model,
|
||||
create_filename_for_test)
|
||||
from openvino import Model, Shape, Core, Tensor, serialize
|
||||
from openvino.runtime import ConstOutput
|
||||
|
||||
test_net_xml, test_net_bin = model_path()
|
||||
|
||||
|
||||
def test_get_property(device):
|
||||
model = get_relu_model([1, 3, 32, 32])
|
||||
@@ -23,9 +24,7 @@ def test_get_property(device):
|
||||
|
||||
|
||||
def test_get_runtime_model(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
compiled_model = core.compile_model(model, device)
|
||||
compiled_model = generate_relu_compiled_model(device)
|
||||
runtime_model = compiled_model.get_runtime_model()
|
||||
assert isinstance(runtime_model, Model)
|
||||
|
||||
@@ -36,8 +35,7 @@ def test_export_import(device):
|
||||
if "EXPORT_IMPORT" not in core.get_property(device, "OPTIMIZATION_CAPABILITIES"):
|
||||
pytest.skip(f"{core.get_property(device, 'FULL_DEVICE_NAME')} plugin due-to export, import model API isn't implemented.")
|
||||
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
compiled_model = core.compile_model(model, device)
|
||||
compiled_model = generate_relu_compiled_model(device)
|
||||
|
||||
user_stream = compiled_model.export_model()
|
||||
|
||||
@@ -46,7 +44,7 @@ def test_export_import(device):
|
||||
img = generate_image()
|
||||
res = new_compiled.infer_new_request({"data": img})
|
||||
|
||||
assert np.argmax(res[new_compiled.outputs[0]]) == 9
|
||||
assert np.argmax(res[new_compiled.outputs[0]]) == 531
|
||||
|
||||
|
||||
def test_export_import_advanced(device):
|
||||
@@ -57,8 +55,7 @@ def test_export_import_advanced(device):
|
||||
if "EXPORT_IMPORT" not in core.get_property(device, "OPTIMIZATION_CAPABILITIES"):
|
||||
pytest.skip(f"{core.get_property(device, 'FULL_DEVICE_NAME')} plugin due-to export, import model API isn't implemented.")
|
||||
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
compiled_model = core.compile_model(model, device)
|
||||
compiled_model = generate_relu_compiled_model(device)
|
||||
|
||||
user_stream = io.BytesIO()
|
||||
|
||||
@@ -69,7 +66,7 @@ def test_export_import_advanced(device):
|
||||
img = generate_image()
|
||||
res = new_compiled.infer_new_request({"data": img})
|
||||
|
||||
assert np.argmax(res[new_compiled.outputs[0]]) == 9
|
||||
assert np.argmax(res[new_compiled.outputs[0]]) == 531
|
||||
|
||||
|
||||
@pytest.mark.parametrize("input_arguments", [[0], ["data"], []])
|
||||
@@ -222,11 +219,15 @@ def test_direct_infer(device, shared_flag):
|
||||
assert np.array_equal(ref[compiled_model.outputs[0]], res[compiled_model.outputs[0]])
|
||||
|
||||
|
||||
def test_compiled_model_after_core_destroyed(device):
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_compiled_model_after_core_destroyed(request, tmp_path, device):
|
||||
core = Core()
|
||||
with open(test_net_bin, "rb") as f:
|
||||
xml_path, bin_path = create_filename_for_test(request.node.name, tmp_path)
|
||||
model = get_relu_model()
|
||||
serialize(model, xml_path, bin_path)
|
||||
with open(bin_path, "rb") as f:
|
||||
weights = f.read()
|
||||
with open(test_net_xml, "rb") as f:
|
||||
with open(xml_path, "rb") as f:
|
||||
xml = f.read()
|
||||
model = core.read_model(model=xml, weights=weights)
|
||||
compiled = core.compile_model(model, device)
|
||||
|
||||
@@ -16,29 +16,21 @@ from openvino import (
|
||||
CompiledModel,
|
||||
tensor_from_file,
|
||||
compile_model,
|
||||
serialize,
|
||||
)
|
||||
|
||||
from openvino.runtime import Extension
|
||||
|
||||
from tests.conftest import (
|
||||
model_path,
|
||||
model_onnx_path,
|
||||
get_model_with_template_extension,
|
||||
)
|
||||
|
||||
from tests.test_utils.test_utils import (
|
||||
from tests.utils.helpers import (
|
||||
generate_image,
|
||||
generate_relu_compiled_model,
|
||||
get_relu_model,
|
||||
plugins_path,
|
||||
compare_models,
|
||||
create_filename_for_test,
|
||||
get_model_with_template_extension,
|
||||
)
|
||||
|
||||
|
||||
test_net_xml, test_net_bin = model_path()
|
||||
test_net_onnx = model_onnx_path()
|
||||
|
||||
|
||||
def test_compact_api_xml():
|
||||
img = generate_image()
|
||||
|
||||
@@ -48,8 +40,12 @@ def test_compact_api_xml():
|
||||
assert np.argmax(results[list(results)[0]]) == 531
|
||||
|
||||
|
||||
def test_compact_api_xml_posix_path():
|
||||
compiled_model = compile_model(Path(test_net_xml))
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_compact_api_xml_posix_path(request, tmp_path):
|
||||
xml_path, _ = create_filename_for_test(request.node.name, tmp_path, True)
|
||||
model = get_relu_model()
|
||||
serialize(model, xml_path)
|
||||
compiled_model = compile_model(Path(xml_path))
|
||||
assert isinstance(compiled_model, CompiledModel)
|
||||
|
||||
|
||||
@@ -80,33 +76,51 @@ def test_core_class(device):
|
||||
assert np.allclose(results[list(results)[0]], expected_output)
|
||||
|
||||
|
||||
def test_compile_model(device):
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_compile_model(request, tmp_path, device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
xml_path, bin_path = create_filename_for_test(request.node.name, tmp_path)
|
||||
relu_model = get_relu_model()
|
||||
serialize(relu_model, xml_path, bin_path)
|
||||
model = core.read_model(model=xml_path, weights=bin_path)
|
||||
compiled_model = core.compile_model(model, device)
|
||||
assert isinstance(compiled_model, CompiledModel)
|
||||
|
||||
|
||||
def test_compile_model_without_device():
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_compile_model_without_device(request, tmp_path):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
xml_path, bin_path = create_filename_for_test(request.node.name, tmp_path)
|
||||
relu_model = get_relu_model()
|
||||
serialize(relu_model, xml_path, bin_path)
|
||||
model = core.read_model(model=xml_path, weights=bin_path)
|
||||
compiled_model = core.compile_model(model)
|
||||
assert isinstance(compiled_model, CompiledModel)
|
||||
|
||||
|
||||
def test_read_model_from_ir():
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_read_model_from_ir(request, tmp_path):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
xml_path, bin_path = create_filename_for_test(request.node.name, tmp_path)
|
||||
relu_model = get_relu_model()
|
||||
serialize(relu_model, xml_path, bin_path)
|
||||
model = core.read_model(model=xml_path, weights=bin_path)
|
||||
assert isinstance(model, Model)
|
||||
|
||||
model = core.read_model(model=test_net_xml)
|
||||
model = core.read_model(model=xml_path)
|
||||
assert isinstance(model, Model)
|
||||
|
||||
|
||||
def test_read_model_from_tensor():
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_read_model_from_tensor(request, tmp_path):
|
||||
core = Core()
|
||||
model = open(test_net_xml).read()
|
||||
tensor = tensor_from_file(test_net_bin)
|
||||
xml_path, bin_path = create_filename_for_test(request.node.name, tmp_path, is_xml_path=True, is_bin_path=True)
|
||||
relu_model = get_relu_model()
|
||||
serialize(relu_model, xml_path, bin_path)
|
||||
arr = np.ones(shape=(10), dtype=np.int8)
|
||||
arr.tofile(bin_path)
|
||||
model = open(xml_path).read()
|
||||
tensor = tensor_from_file(bin_path)
|
||||
model = core.read_model(model=model, weights=tensor)
|
||||
assert isinstance(model, Model)
|
||||
|
||||
@@ -118,48 +132,49 @@ def test_read_model_with_wrong_input():
|
||||
assert "Provided python object type <class 'int'> isn't supported as 'model' argument." in str(e.value)
|
||||
|
||||
|
||||
def test_read_model_as_path():
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_read_model_as_path(request, tmp_path):
|
||||
core = Core()
|
||||
model = core.read_model(model=Path(test_net_xml), weights=Path(test_net_bin))
|
||||
xml_path, bin_path = create_filename_for_test(request.node.name, tmp_path, True, True)
|
||||
relu_model = get_relu_model()
|
||||
serialize(relu_model, xml_path, bin_path)
|
||||
|
||||
model = core.read_model(model=Path(xml_path), weights=Path(bin_path))
|
||||
assert isinstance(model, Model)
|
||||
|
||||
model = core.read_model(model=test_net_xml, weights=Path(test_net_bin))
|
||||
model = core.read_model(model=xml_path, weights=Path(bin_path))
|
||||
assert isinstance(model, Model)
|
||||
|
||||
model = core.read_model(model=Path(test_net_xml))
|
||||
model = core.read_model(model=Path(xml_path))
|
||||
assert isinstance(model, Model)
|
||||
|
||||
|
||||
def test_read_model_from_onnx():
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_read_model_from_buffer(request, tmp_path):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_onnx)
|
||||
assert isinstance(model, Model)
|
||||
|
||||
|
||||
def test_read_model_from_onnx_as_path():
|
||||
core = Core()
|
||||
model = core.read_model(model=Path(test_net_onnx))
|
||||
assert isinstance(model, Model)
|
||||
|
||||
|
||||
def test_read_model_from_buffer():
|
||||
core = Core()
|
||||
with open(test_net_bin, "rb") as f:
|
||||
xml_path, bin_path = create_filename_for_test(request.node.name, tmp_path)
|
||||
relu_model = get_relu_model()
|
||||
serialize(relu_model, xml_path, bin_path)
|
||||
with open(bin_path, "rb") as f:
|
||||
weights = f.read()
|
||||
with open(model_path()[0], "rb") as f:
|
||||
with open(xml_path, "rb") as f:
|
||||
xml = f.read()
|
||||
model = core.read_model(model=xml, weights=weights)
|
||||
assert isinstance(model, Model)
|
||||
|
||||
|
||||
def test_model_from_buffer_valid():
|
||||
# request - https://docs.pytest.org/en/7.1.x/reference/reference.html#request
|
||||
def test_model_from_buffer_valid(request, tmp_path):
|
||||
core = Core()
|
||||
with open(test_net_bin, "rb") as f:
|
||||
xml_path, bin_path = create_filename_for_test(request.node.name, tmp_path)
|
||||
relu_model = get_relu_model()
|
||||
serialize(relu_model, xml_path, bin_path)
|
||||
with open(bin_path, "rb") as f:
|
||||
weights = f.read()
|
||||
with open(model_path()[0], "rb") as f:
|
||||
with open(xml_path, "rb") as f:
|
||||
xml = f.read()
|
||||
model = core.read_model(model=xml, weights=weights)
|
||||
ref_model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
ref_model = core.read_model(model=xml_path, weights=bin_path)
|
||||
assert compare_models(model, ref_model)
|
||||
|
||||
|
||||
@@ -255,7 +270,7 @@ def test_get_property_str():
|
||||
|
||||
def test_query_model(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
query_model = core.query_model(model=model, device_name=device)
|
||||
ops_model = model.get_ordered_ops()
|
||||
ops_func_names = [op.friendly_name for op in ops_model]
|
||||
@@ -326,7 +341,7 @@ def test_add_extension():
|
||||
core = Core()
|
||||
core.add_extension(EmptyExtension())
|
||||
core.add_extension([EmptyExtension(), EmptyExtension()])
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
assert isinstance(model, Model)
|
||||
|
||||
|
||||
@@ -398,7 +413,7 @@ def test_read_model_from_buffer_no_weights():
|
||||
|
||||
def test_infer_new_request_return_type(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
img = generate_image()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
res = compiled_model.infer_new_request({"data": img})
|
||||
@@ -406,6 +421,6 @@ def test_infer_new_request_return_type(device):
|
||||
|
||||
assert isinstance(arr, np.ndarray)
|
||||
assert arr.itemsize == 4
|
||||
assert arr.shape == (10,)
|
||||
assert arr.shape == (3, 32, 32)
|
||||
assert arr.dtype == "float32"
|
||||
assert arr.nbytes == 40
|
||||
assert arr.nbytes == 12288
|
||||
@@ -27,10 +27,7 @@ from openvino.runtime import ProfilingInfo
|
||||
from openvino.preprocess import PrePostProcessor
|
||||
|
||||
from tests import skip_need_mock_op
|
||||
from tests.conftest import model_path
|
||||
from tests.test_utils.test_utils import generate_image, get_relu_model
|
||||
|
||||
test_net_xml, test_net_bin = model_path()
|
||||
from tests.utils.helpers import generate_image, get_relu_model
|
||||
|
||||
|
||||
def create_model_with_memory(input_shape, data_type):
|
||||
@@ -100,7 +97,10 @@ def abs_model_with_data(device, ov_type, numpy_dtype):
|
||||
|
||||
def test_get_profiling_info(device):
|
||||
core = Core()
|
||||
model = core.read_model(test_net_xml, test_net_bin)
|
||||
param = ops.parameter([1, 3, 32, 32], np.float32, name="data")
|
||||
softmax = ops.softmax(param, 1, name="fc_out")
|
||||
model = Model([softmax], [param], "test_model")
|
||||
|
||||
core.set_property(device, {"PERF_COUNT": "YES"})
|
||||
compiled_model = core.compile_model(model, device)
|
||||
img = generate_image()
|
||||
@@ -164,22 +164,28 @@ def test_tensor_setter(device):
|
||||
|
||||
def test_set_tensors(device):
|
||||
core = Core()
|
||||
model = core.read_model(test_net_xml, test_net_bin)
|
||||
|
||||
param = ops.parameter([1, 3, 32, 32], np.float32, name="data")
|
||||
softmax = ops.softmax(param, 1, name="fc_out")
|
||||
res = ops.result(softmax, name="res")
|
||||
res.output(0).get_tensor().set_names({"res"})
|
||||
model = Model([res], [param], "test_model")
|
||||
|
||||
compiled_model = core.compile_model(model, device)
|
||||
|
||||
data1 = generate_image()
|
||||
tensor1 = Tensor(data1)
|
||||
data2 = np.ones(shape=(1, 10), dtype=np.float32)
|
||||
data2 = np.ones(shape=(1, 3, 32, 32), dtype=np.float32)
|
||||
tensor2 = Tensor(data2)
|
||||
data3 = np.ones(shape=(1, 3, 32, 32), dtype=np.float32)
|
||||
tensor3 = Tensor(data3)
|
||||
data4 = np.zeros(shape=(1, 10), dtype=np.float32)
|
||||
data4 = np.zeros(shape=(1, 3, 32, 32), dtype=np.float32)
|
||||
tensor4 = Tensor(data4)
|
||||
|
||||
request = compiled_model.create_infer_request()
|
||||
request.set_tensors({"data": tensor1, "fc_out": tensor2})
|
||||
request.set_tensors({"data": tensor1, "res": tensor2})
|
||||
t1 = request.get_tensor("data")
|
||||
t2 = request.get_tensor("fc_out")
|
||||
t2 = request.get_tensor("res")
|
||||
assert np.allclose(tensor1.data, t1.data, atol=1e-2, rtol=1e-2)
|
||||
assert np.allclose(tensor2.data, t2.data, atol=1e-2, rtol=1e-2)
|
||||
|
||||
@@ -295,7 +301,7 @@ def test_inputs_outputs_property_and_method(device):
|
||||
@pytest.mark.skip(reason="Sporadically failed. Need further investigation. Ticket - 95967")
|
||||
def test_cancel(device):
|
||||
core = Core()
|
||||
model = core.read_model(test_net_xml, test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
img = generate_image()
|
||||
request = compiled_model.create_infer_request()
|
||||
@@ -316,7 +322,7 @@ def test_cancel(device):
|
||||
@pytest.mark.parametrize("share_inputs", [True, False])
|
||||
def test_start_async(device, share_inputs):
|
||||
core = Core()
|
||||
model = core.read_model(test_net_xml, test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
img = generate_image()
|
||||
jobs = 3
|
||||
@@ -482,7 +488,7 @@ def test_infer_queue(device, share_inputs):
|
||||
jobs = 8
|
||||
num_request = 4
|
||||
core = Core()
|
||||
model = core.read_model(test_net_xml, test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
infer_queue = AsyncInferQueue(compiled_model, num_request)
|
||||
jobs_done = [{"finished": False, "latency": 0} for _ in range(jobs)]
|
||||
@@ -563,7 +569,7 @@ def test_infer_queue_fail_on_cpp_model(device):
|
||||
jobs = 6
|
||||
num_request = 4
|
||||
core = Core()
|
||||
model = core.read_model(test_net_xml, test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
infer_queue = AsyncInferQueue(compiled_model, num_request)
|
||||
|
||||
@@ -585,7 +591,7 @@ def test_infer_queue_fail_on_py_model(device):
|
||||
jobs = 1
|
||||
num_request = 1
|
||||
core = Core()
|
||||
model = core.read_model(test_net_xml, test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
infer_queue = AsyncInferQueue(compiled_model, num_request)
|
||||
|
||||
|
||||
@@ -4,19 +4,17 @@
|
||||
|
||||
import os
|
||||
|
||||
from ..conftest import model_path
|
||||
from openvino.runtime import Input, RTMap
|
||||
from openvino._pyopenvino import DescriptorTensor
|
||||
import openvino.runtime.opset12 as ops
|
||||
|
||||
from openvino import Core, OVAny, Shape, PartialShape, Type
|
||||
|
||||
test_net_xml, test_net_bin = model_path()
|
||||
from tests.utils.helpers import get_relu_model
|
||||
|
||||
|
||||
def test_input_type(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
@@ -25,7 +23,7 @@ def test_input_type(device):
|
||||
|
||||
def test_const_output_docs(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
@@ -35,7 +33,7 @@ def test_const_output_docs(device):
|
||||
|
||||
def test_input_get_index(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
@@ -44,7 +42,7 @@ def test_input_get_index(device):
|
||||
|
||||
def test_input_element_type(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
@@ -53,36 +51,36 @@ def test_input_element_type(device):
|
||||
|
||||
def test_input_get_shape(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
assert str(input_node.get_shape()) == str(Shape([1, 10]))
|
||||
assert str(input_node.get_shape()) == str(Shape([1, 3, 32, 32]))
|
||||
|
||||
|
||||
def test_input_get_partial_shape(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
expected_partial_shape = PartialShape([1, 10])
|
||||
expected_partial_shape = PartialShape([1, 3, 32, 32])
|
||||
assert input_node.get_partial_shape() == expected_partial_shape
|
||||
|
||||
|
||||
def test_input_get_source_output(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
name = input_node.get_source_output().get_node().get_friendly_name()
|
||||
assert name == "fc_out"
|
||||
assert name == "relu"
|
||||
|
||||
|
||||
def test_input_get_tensor(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
@@ -92,7 +90,7 @@ def test_input_get_tensor(device):
|
||||
|
||||
def test_input_get_rt_info(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
@@ -102,7 +100,7 @@ def test_input_get_rt_info(device):
|
||||
|
||||
def test_input_rt_info(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
@@ -126,7 +124,7 @@ def test_input_replace_source_output(device):
|
||||
|
||||
def test_input_update_rt_info(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
net_input = compiled_model.output(0)
|
||||
input_node = net_input.get_node().inputs()[0]
|
||||
|
||||
@@ -9,7 +9,7 @@ import openvino.runtime as ov
|
||||
from openvino import Tensor
|
||||
from openvino.runtime.op import Constant
|
||||
|
||||
from tests.test_utils.test_utils import generate_image
|
||||
from tests.utils.helpers import generate_image
|
||||
|
||||
|
||||
@pytest.mark.parametrize(("cls", "cls_str"), [
|
||||
|
||||
@@ -23,7 +23,7 @@ from openvino import (
|
||||
)
|
||||
from openvino.runtime import Output
|
||||
|
||||
from tests.test_utils.test_utils import generate_add_model, create_filename_for_test
|
||||
from tests.utils.helpers import generate_add_model, create_filename_for_test
|
||||
|
||||
|
||||
def test_test_descriptor_tensor():
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import os
|
||||
import pytest
|
||||
from copy import copy, deepcopy
|
||||
|
||||
from ..conftest import model_path
|
||||
import openvino.runtime.opset12 as ops
|
||||
from openvino import (
|
||||
Shape,
|
||||
@@ -19,16 +19,12 @@ from openvino.runtime import (
|
||||
Output,
|
||||
RTMap,
|
||||
)
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
test_net_xml, test_net_bin = model_path()
|
||||
from tests.utils.helpers import get_relu_model
|
||||
|
||||
|
||||
def test_const_output_type(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
node = compiled_model.input(0)
|
||||
assert isinstance(node, ConstOutput)
|
||||
@@ -36,7 +32,7 @@ def test_const_output_type(device):
|
||||
|
||||
def test_const_output_docs(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
node = compiled_model.input(0)
|
||||
exptected_string = "openvino.runtime.ConstOutput represents port/node output."
|
||||
@@ -45,7 +41,7 @@ def test_const_output_docs(device):
|
||||
|
||||
def test_const_output_get_index(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
node = compiled_model.input("data")
|
||||
assert node.get_index() == 0
|
||||
@@ -54,7 +50,7 @@ def test_const_output_get_index(device):
|
||||
|
||||
def test_const_output_get_element_type(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
node = compiled_model.input("data")
|
||||
assert node.get_element_type() == Type.f32
|
||||
@@ -63,7 +59,7 @@ def test_const_output_get_element_type(device):
|
||||
|
||||
def test_const_output_get_shape(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
node = compiled_model.input("data")
|
||||
expected_shape = Shape([1, 3, 32, 32])
|
||||
@@ -73,7 +69,7 @@ def test_const_output_get_shape(device):
|
||||
|
||||
def test_const_output_get_partial_shape(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
exec_net = core.compile_model(model, device)
|
||||
node = exec_net.input("data")
|
||||
expected_partial_shape = PartialShape([1, 3, 32, 32])
|
||||
@@ -83,7 +79,7 @@ def test_const_output_get_partial_shape(device):
|
||||
|
||||
def test_const_output_get_target_inputs(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
outputs = compiled_model.outputs
|
||||
for node in outputs:
|
||||
@@ -93,7 +89,7 @@ def test_const_output_get_target_inputs(device):
|
||||
|
||||
def test_const_output_get_names(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
input_name = "data"
|
||||
node = compiled_model.input(input_name)
|
||||
@@ -107,7 +103,7 @@ def test_const_output_get_names(device):
|
||||
|
||||
def test_const_get_rf_info(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
output_node = compiled_model.output(0)
|
||||
rt_info = output_node.get_rt_info()
|
||||
@@ -116,7 +112,7 @@ def test_const_get_rf_info(device):
|
||||
|
||||
def test_const_output_runtime_info(device):
|
||||
core = Core()
|
||||
model = core.read_model(model=test_net_xml, weights=test_net_bin)
|
||||
model = get_relu_model()
|
||||
compiled_model = core.compile_model(model, device)
|
||||
input_name = "data"
|
||||
output_node = compiled_model.input(input_name)
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
import os
|
||||
|
||||
from ..conftest import model_path
|
||||
import openvino.runtime.opset12 as ops
|
||||
from openvino import Type
|
||||
|
||||
|
||||
@@ -442,7 +442,7 @@ def test_properties_capability_gpu():
|
||||
|
||||
def test_properties_hint_model():
|
||||
# Temporary imports
|
||||
from tests.test_utils.test_utils import generate_add_model
|
||||
from tests.utils.helpers import generate_add_model
|
||||
|
||||
model = generate_add_model()
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ from openvino.helpers import pack_data, unpack_data
|
||||
|
||||
import pytest
|
||||
|
||||
from tests.test_utils.test_utils import generate_image, generate_relu_compiled_model
|
||||
from tests.utils.helpers import generate_image, generate_relu_compiled_model
|
||||
|
||||
|
||||
@pytest.mark.parametrize(("ov_type", "numpy_dtype"), [
|
||||
|
||||
@@ -9,7 +9,7 @@ from openvino.runtime.op import Parameter, Constant
|
||||
from openvino.runtime.opset12 import add, multiply
|
||||
|
||||
import openvino as ov
|
||||
from tests.test_utils.test_utils import create_filename_for_test
|
||||
from tests.utils.helpers import create_filename_for_test
|
||||
|
||||
|
||||
def make_constant(values, transposed):
|
||||
|
||||
@@ -19,7 +19,7 @@ from openvino._offline_transformations import (
|
||||
from openvino.runtime import Model, PartialShape, Core, serialize, save_model
|
||||
import openvino.runtime as ov
|
||||
|
||||
from tests.test_utils.test_utils import create_filename_for_test, compare_models, _compare_models
|
||||
from tests.utils.helpers import create_filename_for_test, compare_models, _compare_models
|
||||
|
||||
|
||||
def get_relu_model():
|
||||
|
||||
@@ -17,7 +17,7 @@ from openvino.runtime.passes import (
|
||||
)
|
||||
|
||||
from tests.test_transformations.utils.utils import count_ops, get_relu_model
|
||||
from tests.test_utils.test_utils import create_filename_for_test, compare_models
|
||||
from tests.utils.helpers import create_filename_for_test, compare_models
|
||||
|
||||
|
||||
def get_model():
|
||||
|
||||
@@ -6,13 +6,11 @@ import os
|
||||
import pytest
|
||||
import numpy as np
|
||||
|
||||
from tests.conftest import model_path
|
||||
from tests.test_utils.test_utils import generate_relu_compiled_model
|
||||
from tests.utils.helpers import generate_relu_compiled_model
|
||||
from openvino.runtime import Model, ConstOutput, Type, Shape, Core, Tensor
|
||||
from openvino.runtime.utils.data_helpers import _data_dispatch
|
||||
|
||||
is_myriad = os.environ.get("TEST_DEVICE") == "MYRIAD"
|
||||
test_net_xml, test_net_bin = model_path(is_myriad)
|
||||
|
||||
|
||||
def _get_value(value):
|
||||
|
||||
@@ -2,99 +2,19 @@
|
||||
# Copyright (C) 2018-2023 Intel Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
from typing import Tuple, Union, List
|
||||
|
||||
import os
|
||||
import sys
|
||||
import numpy as np
|
||||
import pytest
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import openvino
|
||||
import openvino.runtime.opset12 as ops
|
||||
from openvino.runtime import Model, Core, Shape
|
||||
from openvino.utils import deprecated
|
||||
from tests.utils.helpers import compare_models, get_relu_model
|
||||
|
||||
|
||||
def _compare_models(model_one: Model, model_two: Model, compare_names: bool = True) -> Tuple[bool, str]: # noqa: C901 the function is too complex
|
||||
"""Function to compare OpenVINO model (ops names, types and shapes).
|
||||
|
||||
Note that the functions uses get_ordered_ops, so the topological order of ops should be also preserved.
|
||||
|
||||
:param model_one: The first model to compare.
|
||||
:param model_two: The second model to compare.
|
||||
:param compare_names: Flag to control friendly names checking. Default: True
|
||||
:return: Tuple which consists of bool value (True if models are equal, otherwise False)
|
||||
and string with the message to reuse for debug/testing purposes. The string value
|
||||
is empty when models are equal.
|
||||
"""
|
||||
result = True
|
||||
msg = ""
|
||||
|
||||
# Check friendly names of models
|
||||
if compare_names and model_one.get_friendly_name() != model_two.get_friendly_name():
|
||||
result = False
|
||||
msg += "Friendly names of models are not equal "
|
||||
msg += f"model_one: {model_one.get_friendly_name()}, model_two: {model_two.get_friendly_name()}.\n"
|
||||
|
||||
model_one_ops = model_one.get_ordered_ops()
|
||||
model_two_ops = model_two.get_ordered_ops()
|
||||
|
||||
# Check overall number of operators
|
||||
if len(model_one_ops) != len(model_two_ops):
|
||||
result = False
|
||||
msg += "Not equal number of ops "
|
||||
msg += f"model_one: {len(model_one_ops)}, model_two: {len(model_two_ops)}.\n"
|
||||
|
||||
for i in range(len(model_one_ops)):
|
||||
op_one_name = model_one_ops[i].get_friendly_name() # op from model_one
|
||||
op_two_name = model_two_ops[i].get_friendly_name() # op from model_two
|
||||
# Check friendly names
|
||||
if (compare_names and op_one_name != op_two_name and model_one_ops[i].get_type_name() != "Constant"):
|
||||
result = False
|
||||
msg += "Not equal op names "
|
||||
msg += f"model_one: {op_one_name}, "
|
||||
msg += f"model_two: {op_two_name}.\n"
|
||||
# Check output sizes
|
||||
if model_one_ops[i].get_output_size() != model_two_ops[i].get_output_size():
|
||||
result = False
|
||||
msg += f"Not equal output sizes of {op_one_name} and {op_two_name}.\n"
|
||||
for idx in range(model_one_ops[i].get_output_size()):
|
||||
# Check partial shapes of outputs
|
||||
op_one_partial_shape = model_one_ops[i].get_output_partial_shape(idx)
|
||||
op_two_partial_shape = model_two_ops[i].get_output_partial_shape(idx)
|
||||
if op_one_partial_shape != op_two_partial_shape:
|
||||
result = False
|
||||
msg += f"Not equal op partial shapes of {op_one_name} and {op_two_name} on {idx} index "
|
||||
msg += f"model_one: {op_one_partial_shape}, "
|
||||
msg += f"model_two: {op_two_partial_shape}.\n"
|
||||
# Check element types of outputs
|
||||
op_one_element_type = model_one_ops[i].get_output_element_type(idx)
|
||||
op_two_element_type = model_two_ops[i].get_output_element_type(idx)
|
||||
if op_one_element_type != op_two_element_type:
|
||||
result = False
|
||||
msg += f"Not equal output element types of {op_one_name} and {op_two_name} on {idx} index "
|
||||
msg += f"model_one: {op_one_element_type}, "
|
||||
msg += f"model_two: {op_two_element_type}.\n"
|
||||
|
||||
return result, msg
|
||||
|
||||
|
||||
def compare_models(model_one: Model, model_two: Model, compare_names: bool = True):
|
||||
"""Function to compare OpenVINO model (ops names, types and shapes).
|
||||
|
||||
:param model_one: The first model to compare.
|
||||
:param model_two: The second model to compare.
|
||||
:param compare_names: Flag to control friendly names checking. Default: True
|
||||
:return: True if models are equal, otherwise raise an error with a report of mismatches.
|
||||
"""
|
||||
result, msg = _compare_models(model_one, model_two, compare_names=compare_names)
|
||||
|
||||
if not result:
|
||||
raise RuntimeError(msg)
|
||||
|
||||
return result
|
||||
def test_compare_functions():
|
||||
try:
|
||||
from openvino.test_utils import compare_functions
|
||||
model = get_relu_model()
|
||||
status, _ = compare_functions(model, model)
|
||||
assert status
|
||||
except RuntimeError:
|
||||
print("openvino.test_utils.compare_functions is not available") # noqa: T201
|
||||
|
||||
|
||||
def test_compare_models_pass():
|
||||
@@ -113,63 +33,6 @@ def test_compare_models_fail():
|
||||
assert "Not equal op names model_one: data, model_two: ABC." in str(e.value)
|
||||
|
||||
|
||||
def plugins_path(device, lib_path):
|
||||
plugin_xml = f"""<ie>
|
||||
<plugins>
|
||||
<plugin location="{lib_path}" name="{device}">
|
||||
</plugin>
|
||||
</plugins>
|
||||
</ie>"""
|
||||
|
||||
with open("plugin_path.xml", "w") as f:
|
||||
f.write(plugin_xml)
|
||||
|
||||
plugins_paths = os.path.join(os.getcwd(), "plugin_path.xml")
|
||||
return plugins_paths
|
||||
|
||||
|
||||
def generate_image(shape: Tuple = (1, 3, 32, 32), dtype: Union[str, np.dtype] = "float32") -> np.array:
|
||||
np.random.seed(42)
|
||||
return np.random.rand(*shape).astype(dtype)
|
||||
|
||||
|
||||
def get_relu_model(input_shape: List[int] = None, input_dtype=np.float32) -> openvino.runtime.Model:
|
||||
if input_shape is None:
|
||||
input_shape = [1, 3, 32, 32]
|
||||
param = ops.parameter(input_shape, input_dtype, name="data")
|
||||
relu = ops.relu(param, name="relu")
|
||||
model = Model([relu], [param], "test_model")
|
||||
model.get_ordered_ops()[2].friendly_name = "friendly"
|
||||
|
||||
assert model is not None
|
||||
return model
|
||||
|
||||
|
||||
def generate_relu_compiled_model(
|
||||
device,
|
||||
input_shape: List[int] = None,
|
||||
input_dtype=np.float32,
|
||||
) -> openvino.runtime.CompiledModel:
|
||||
if input_shape is None:
|
||||
input_shape = [1, 3, 32, 32]
|
||||
model = get_relu_model(input_shape, input_dtype)
|
||||
core = Core()
|
||||
return core.compile_model(model, device, {})
|
||||
|
||||
|
||||
def generate_model_and_image(device, input_shape: List[int] = None):
|
||||
if input_shape is None:
|
||||
input_shape = [1, 3, 32, 32]
|
||||
return (generate_relu_compiled_model(device, input_shape), generate_image(input_shape))
|
||||
|
||||
|
||||
def generate_add_model() -> openvino._pyopenvino.Model:
|
||||
param1 = ops.parameter(Shape([2, 1]), dtype=np.float32, name="data1")
|
||||
param2 = ops.parameter(Shape([2, 1]), dtype=np.float32, name="data2")
|
||||
add = ops.add(param1, param2)
|
||||
return Model(add, [param1, param2], "TestFunction")
|
||||
|
||||
|
||||
def test_deprecation_decorator():
|
||||
@deprecated()
|
||||
def deprecated_function1(param1, param2=None):
|
||||
@@ -195,21 +58,3 @@ def test_deprecation_decorator():
|
||||
deprecated_function3()
|
||||
with pytest.warns(DeprecationWarning, match="deprecated_function4 is deprecated and will be removed in version 2025.4. Use another function instead"):
|
||||
deprecated_function4()
|
||||
|
||||
|
||||
def create_filename_for_test(test_name, tmp_path, is_xml_path=False, is_bin_path=False):
|
||||
"""Return a tuple with automatically generated paths for xml and bin files.
|
||||
|
||||
:param test_name: Name used in generating.
|
||||
:param is_xml_path: True if xml file should be pathlib.Path object, otherwise return string.
|
||||
:param is_bin_path: True if bin file should be pathlib.Path object, otherwise return string.
|
||||
:return: Tuple with two objects representing xml and bin files.
|
||||
"""
|
||||
python_version = str(sys.version_info.major) + "_" + str(sys.version_info.minor)
|
||||
filename = test_name.replace("test_", "").replace("[", "_").replace("]", "_")
|
||||
filename = filename + "_" + python_version
|
||||
path_to_xml = tmp_path / Path(filename + ".xml")
|
||||
path_to_bin = tmp_path / Path(filename + ".bin")
|
||||
_xml = path_to_xml if is_xml_path else str(path_to_xml)
|
||||
_bin = path_to_bin if is_bin_path else str(path_to_bin)
|
||||
return (_xml, _bin)
|
||||
@@ -0,0 +1,227 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (C) 2018-2023 Intel Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
from typing import Tuple, Union, List
|
||||
|
||||
import os
|
||||
import sys
|
||||
import numpy as np
|
||||
|
||||
from sys import platform
|
||||
from pathlib import Path
|
||||
|
||||
import openvino
|
||||
import openvino.runtime.opset12 as ops
|
||||
from openvino.runtime import Model, Core, Shape
|
||||
|
||||
|
||||
def _compare_models(model_one: Model, model_two: Model, compare_names: bool = True) -> Tuple[bool, str]: # noqa: C901 the function is too complex
|
||||
"""Function to compare OpenVINO model (ops names, types and shapes).
|
||||
|
||||
Note that the functions uses get_ordered_ops, so the topological order of ops should be also preserved.
|
||||
|
||||
:param model_one: The first model to compare.
|
||||
:param model_two: The second model to compare.
|
||||
:param compare_names: Flag to control friendly names checking. Default: True
|
||||
:return: Tuple which consists of bool value (True if models are equal, otherwise False)
|
||||
and string with the message to reuse for debug/testing purposes. The string value
|
||||
is empty when models are equal.
|
||||
"""
|
||||
result = True
|
||||
msg = ""
|
||||
|
||||
# Check friendly names of models
|
||||
if compare_names and model_one.get_friendly_name() != model_two.get_friendly_name():
|
||||
result = False
|
||||
msg += "Friendly names of models are not equal "
|
||||
msg += f"model_one: {model_one.get_friendly_name()}, model_two: {model_two.get_friendly_name()}.\n"
|
||||
|
||||
model_one_ops = model_one.get_ordered_ops()
|
||||
model_two_ops = model_two.get_ordered_ops()
|
||||
|
||||
# Check overall number of operators
|
||||
if len(model_one_ops) != len(model_two_ops):
|
||||
result = False
|
||||
msg += "Not equal number of ops "
|
||||
msg += f"model_one: {len(model_one_ops)}, model_two: {len(model_two_ops)}.\n"
|
||||
|
||||
for i in range(len(model_one_ops)):
|
||||
op_one_name = model_one_ops[i].get_friendly_name() # op from model_one
|
||||
op_two_name = model_two_ops[i].get_friendly_name() # op from model_two
|
||||
# Check friendly names
|
||||
if (compare_names and op_one_name != op_two_name and model_one_ops[i].get_type_name() != "Constant"):
|
||||
result = False
|
||||
msg += "Not equal op names "
|
||||
msg += f"model_one: {op_one_name}, "
|
||||
msg += f"model_two: {op_two_name}.\n"
|
||||
# Check output sizes
|
||||
if model_one_ops[i].get_output_size() != model_two_ops[i].get_output_size():
|
||||
result = False
|
||||
msg += f"Not equal output sizes of {op_one_name} and {op_two_name}.\n"
|
||||
for idx in range(model_one_ops[i].get_output_size()):
|
||||
# Check partial shapes of outputs
|
||||
op_one_partial_shape = model_one_ops[i].get_output_partial_shape(idx)
|
||||
op_two_partial_shape = model_two_ops[i].get_output_partial_shape(idx)
|
||||
if op_one_partial_shape != op_two_partial_shape:
|
||||
result = False
|
||||
msg += f"Not equal op partial shapes of {op_one_name} and {op_two_name} on {idx} index "
|
||||
msg += f"model_one: {op_one_partial_shape}, "
|
||||
msg += f"model_two: {op_two_partial_shape}.\n"
|
||||
# Check element types of outputs
|
||||
op_one_element_type = model_one_ops[i].get_output_element_type(idx)
|
||||
op_two_element_type = model_two_ops[i].get_output_element_type(idx)
|
||||
if op_one_element_type != op_two_element_type:
|
||||
result = False
|
||||
msg += f"Not equal output element types of {op_one_name} and {op_two_name} on {idx} index "
|
||||
msg += f"model_one: {op_one_element_type}, "
|
||||
msg += f"model_two: {op_two_element_type}.\n"
|
||||
|
||||
return result, msg
|
||||
|
||||
|
||||
def compare_models(model_one: Model, model_two: Model, compare_names: bool = True):
|
||||
"""Function to compare OpenVINO model (ops names, types and shapes).
|
||||
|
||||
:param model_one: The first model to compare.
|
||||
:param model_two: The second model to compare.
|
||||
:param compare_names: Flag to control friendly names checking. Default: True
|
||||
:return: True if models are equal, otherwise raise an error with a report of mismatches.
|
||||
"""
|
||||
result, msg = _compare_models(model_one, model_two, compare_names=compare_names)
|
||||
|
||||
if not result:
|
||||
raise RuntimeError(msg)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def plugins_path(device, lib_path):
|
||||
plugin_xml = f"""<ie>
|
||||
<plugins>
|
||||
<plugin location="{lib_path}" name="{device}">
|
||||
</plugin>
|
||||
</plugins>
|
||||
</ie>"""
|
||||
|
||||
with open("plugin_path.xml", "w") as f:
|
||||
f.write(plugin_xml)
|
||||
|
||||
plugins_paths = os.path.join(os.getcwd(), "plugin_path.xml")
|
||||
return plugins_paths
|
||||
|
||||
|
||||
def generate_image(shape: Tuple = (1, 3, 32, 32), dtype: Union[str, np.dtype] = "float32") -> np.array:
|
||||
np.random.seed(42)
|
||||
return np.random.rand(*shape).astype(dtype)
|
||||
|
||||
|
||||
def get_model_with_template_extension():
|
||||
core = Core()
|
||||
ir = bytes(b"""<net name="Activation" version="10">
|
||||
<layers>
|
||||
<layer name="in1" type="Parameter" id="0" version="opset1">
|
||||
<data shape="1,3,22,22" element_type="f32"/>
|
||||
<output>
|
||||
<port id="0" precision="FP32" names="in_data">
|
||||
<dim>1</dim>
|
||||
<dim>3</dim>
|
||||
<dim>22</dim>
|
||||
<dim>22</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer name="activation" id="1" type="Identity" version="extension">
|
||||
<input>
|
||||
<port id="1" precision="FP32">
|
||||
<dim>1</dim>
|
||||
<dim>3</dim>
|
||||
<dim>22</dim>
|
||||
<dim>22</dim>
|
||||
</port>
|
||||
</input>
|
||||
<output>
|
||||
<port id="2" precision="FP32" names="out_data">
|
||||
<dim>1</dim>
|
||||
<dim>3</dim>
|
||||
<dim>22</dim>
|
||||
<dim>22</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer name="output" type="Result" id="2" version="opset1">
|
||||
<input>
|
||||
<port id="0" precision="FP32">
|
||||
<dim>1</dim>
|
||||
<dim>3</dim>
|
||||
<dim>22</dim>
|
||||
<dim>22</dim>
|
||||
</port>
|
||||
</input>
|
||||
</layer>
|
||||
</layers>
|
||||
<edges>
|
||||
<edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
|
||||
<edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
|
||||
</edges>
|
||||
</net>""")
|
||||
if platform == "win32":
|
||||
core.add_extension(library_path="openvino_template_extension.dll")
|
||||
else:
|
||||
core.add_extension(library_path="libopenvino_template_extension.so")
|
||||
return core, core.read_model(ir)
|
||||
|
||||
|
||||
def get_relu_model(input_shape: List[int] = None, input_dtype=np.float32) -> openvino.runtime.Model:
|
||||
if input_shape is None:
|
||||
input_shape = [1, 3, 32, 32]
|
||||
param = ops.parameter(input_shape, input_dtype, name="data")
|
||||
relu = ops.relu(param, name="relu")
|
||||
model = Model([relu], [param], "test_model")
|
||||
model.get_ordered_ops()[2].friendly_name = "friendly"
|
||||
|
||||
assert model is not None
|
||||
return model
|
||||
|
||||
|
||||
def generate_relu_compiled_model(
|
||||
device,
|
||||
input_shape: List[int] = None,
|
||||
input_dtype=np.float32,
|
||||
) -> openvino.runtime.CompiledModel:
|
||||
if input_shape is None:
|
||||
input_shape = [1, 3, 32, 32]
|
||||
model = get_relu_model(input_shape, input_dtype)
|
||||
core = Core()
|
||||
return core.compile_model(model, device, {})
|
||||
|
||||
|
||||
def generate_model_and_image(device, input_shape: List[int] = None):
|
||||
if input_shape is None:
|
||||
input_shape = [1, 3, 32, 32]
|
||||
return (generate_relu_compiled_model(device, input_shape), generate_image(input_shape))
|
||||
|
||||
|
||||
def generate_add_model() -> openvino._pyopenvino.Model:
|
||||
param1 = ops.parameter(Shape([2, 1]), dtype=np.float32, name="data1")
|
||||
param2 = ops.parameter(Shape([2, 1]), dtype=np.float32, name="data2")
|
||||
add = ops.add(param1, param2)
|
||||
return Model(add, [param1, param2], "TestFunction")
|
||||
|
||||
|
||||
def create_filename_for_test(test_name, tmp_path, is_xml_path=False, is_bin_path=False):
|
||||
"""Return a tuple with automatically generated paths for xml and bin files.
|
||||
|
||||
:param test_name: Name used in generating.
|
||||
:param is_xml_path: True if xml file should be pathlib.Path object, otherwise return string.
|
||||
:param is_bin_path: True if bin file should be pathlib.Path object, otherwise return string.
|
||||
:return: Tuple with two objects representing xml and bin files.
|
||||
"""
|
||||
python_version = str(sys.version_info.major) + "_" + str(sys.version_info.minor)
|
||||
filename = test_name.replace("test_", "").replace("[", "_").replace("]", "_")
|
||||
filename = filename + "_" + python_version
|
||||
path_to_xml = tmp_path / Path(filename + ".xml")
|
||||
path_to_bin = tmp_path / Path(filename + ".bin")
|
||||
_xml = path_to_xml if is_xml_path else str(path_to_xml)
|
||||
_bin = path_to_bin if is_bin_path else str(path_to_bin)
|
||||
return (_xml, _bin)
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Reference in new issue
Block a user