Fix for slowdown of convert_model() after multiple runs (#16751)

* Used singleton class for version check.

* Moved VersionChecker to utitl/version.py, added tests.

* Minor corrections.

* Sort imports.

* Small correction.

* Small correction.
This commit is contained in:
Anastasiia Pnevskaia
2023-04-13 09:59:11 +02:00
committed by GitHub
parent 061ba1d773
commit 4921d1ad28
7 changed files with 130 additions and 29 deletions

View File

@@ -34,12 +34,11 @@ from openvino.tools.mo.utils.cli_parser import check_available_transforms, \
get_model_name_from_args, depersonalize, get_mo_convert_params
from openvino.tools.mo.utils.error import Error
from openvino.tools.mo.utils.find_ie_version import find_ie_version
from openvino.tools.mo.utils.version import VersionChecker
from openvino.tools.mo.utils.guess_framework import deduce_legacy_frontend_by_namespace
from openvino.tools.mo.utils.logger import init_logger, progress_printer
from openvino.tools.mo.utils.utils import refer_to_faq_msg
from openvino.tools.mo.utils.telemetry_utils import send_params_info, send_framework_info
from openvino.tools.mo.utils.version import get_simplified_mo_version, get_simplified_ie_version, get_version, simplify_version
from openvino.tools.mo.utils.versions_checker import check_requirements # pylint: disable=no-name-in-module
from openvino.tools.mo.utils.telemetry_utils import get_tid
from openvino.tools.mo.moc_frontend.check_config import legacy_extensions_used
@@ -202,19 +201,7 @@ def arguments_post_parsing(argv: argparse.Namespace):
if not argv.silent:
print_argv(argv, is_caffe, is_tf, is_mxnet, is_kaldi, is_onnx, argv.model_name)
# This try-except is additional reinsurance that the IE
# dependency search does not break the MO pipeline
def raise_ie_not_found():
raise Error("Could not find the Inference Engine or nGraph Python API.\n"
"Consider building the Inference Engine and nGraph Python APIs from sources or "
"try to install OpenVINO (TM) Toolkit using pip \npip install openvino")
try:
if not find_ie_version(silent=argv.silent):
raise_ie_not_found()
except Exception as e:
log.error(e)
raise_ie_not_found()
VersionChecker().check_runtime_dependencies(argv.silent)
argv.data_type = 'FP32' # if compression was enabled will be restored back to 'FP16' after apply_offline_transformations
@@ -505,11 +492,10 @@ def emit_ir(graph: Graph, argv: argparse.Namespace, non_default_params: dict):
except Exception as e:
return_code = "failed"
log.error(e)
message = str(dict({
"platform": platform.system(),
"mo_version": get_simplified_mo_version(),
"ie_version": get_simplified_ie_version(env=os.environ),
"mo_version": VersionChecker().get_mo_simplified_version(),
"ie_version": VersionChecker().get_ie_simplified_version(),
"python_version": sys.version,
"return_code": return_code
}))
@@ -734,9 +720,7 @@ def _convert(cli_parser: argparse.ArgumentParser, framework, args):
if 'help' in args and args['help']:
show_mo_convert_help()
return None, None
version = get_version()
simplified_mo_version = simplify_version(version)
simplified_mo_version = VersionChecker().get_mo_simplified_version()
telemetry = tm.Telemetry(tid=get_tid(), app_name='Model Optimizer', app_version=simplified_mo_version)
telemetry.start_session('mo')
telemetry.send_event('mo', 'version', simplified_mo_version)
@@ -798,7 +782,7 @@ def _convert(cli_parser: argparse.ArgumentParser, framework, args):
ov_model, legacy_path = driver(argv, {"conversion_parameters": non_default_params})
# add MO meta data to model
ov_model.set_rt_info(version, "MO_version")
ov_model.set_rt_info(VersionChecker().get_mo_version(), "MO_version")
ov_model.set_rt_info(get_rt_version(), "Runtime_version")
ov_model.set_rt_info(str(legacy_path), "legacy_frontend")
for key, value in non_default_params.items():

View File

@@ -24,7 +24,6 @@ from openvino.tools.mo.middle.passes.convert_data_type import destination_type_t
from openvino.tools.mo.middle.passes.convert_data_type import np_data_type_to_destination_type
from openvino.tools.mo.utils.error import Error
from openvino.tools.mo.utils.utils import refer_to_faq_msg, get_mo_root_dir
from openvino.tools.mo.utils.version import get_version
from openvino.tools.mo.utils.help import get_convert_model_help_specifics, get_to_string_methods_for_params

View File

@@ -7,7 +7,7 @@ def get_convert_model_help_specifics():
CanonicalizePathCheckExistenceAction, CanonicalizeExtensionsPathCheckExistenceAction, \
CanonicalizePathCheckExistenceIfNeededAction, readable_file_or_dir, readable_dirs_or_files_or_empty, \
check_positive
from openvino.tools.mo.utils.version import get_version
from openvino.tools.mo.utils.version import VersionChecker
return {
'input_model':
{'description':
@@ -127,7 +127,7 @@ def get_convert_model_help_specifics():
{'action': CanonicalizePathCheckExistenceIfNeededAction},
'version':
{'action': 'version',
'version': 'Version of Model Optimizer is: {}'.format(get_version())},
'version': 'Version of Model Optimizer is: {}'.format(VersionChecker().get_mo_version())},
'scale':
{'type': float,
'aliases': {'-s'}},

View File

@@ -10,7 +10,7 @@ from openvino.tools.mo.graph.graph import Graph
from openvino.tools.mo.middle.pattern_match import for_graph_and_each_sub_graph_recursively
from openvino.tools.mo.utils.cli_parser import get_params_with_paths_list
from openvino.tools.mo.utils.telemetry_params import telemetry_params
from openvino.tools.mo.utils.version import get_simplified_mo_version
from openvino.tools.mo.utils.version import VersionChecker
try:
import openvino_telemetry as tm
@@ -19,7 +19,7 @@ except ImportError:
def init_mo_telemetry():
_ = tm.Telemetry(tid=get_tid(), app_name='Model Optimizer', app_version=get_simplified_mo_version())
_ = tm.Telemetry(tid=get_tid(), app_name='Model Optimizer', app_version=VersionChecker().get_mo_simplified_version())
def send_op_names_info(framework: str, graph: Graph):

View File

@@ -3,9 +3,13 @@
import os
import re
import subprocess # nosec
import subprocess # nosec
import sys
from openvino.runtime import get_version as get_ie_version
from openvino.tools.mo.utils.error import Error
from openvino.tools.mo.utils.find_ie_version import find_ie_version
from openvino.tools.mo.utils.utils import get_mo_root_dir
@@ -81,3 +85,64 @@ def extract_hash_from_version(full_version: str):
return res[0]
else:
return None
class SingletonMetaClass(type):
def __init__(self, cls_name, super_classes, dic):
self.__single_instance = None
super().__init__(cls_name, super_classes, dic)
def __call__(cls, *args, **kwargs):
if cls.__single_instance is None:
cls.__single_instance = super(SingletonMetaClass, cls).__call__(*args, **kwargs)
return cls.__single_instance
class VersionChecker(metaclass=SingletonMetaClass):
def __init__(self):
self.runtime_checked = False
self.mo_version = None
self.ie_version = None
self.mo_simplified_version = None
self.ie_simplified_version = None
def get_mo_version(self):
if self.mo_version:
return self.mo_version
self.mo_version = get_version()
return self.mo_version
def get_ie_version(self):
if self.ie_version:
return self.ie_version
self.ie_version = get_ie_version()
return self.ie_version
def get_mo_simplified_version(self):
if self.mo_simplified_version:
return self.mo_simplified_version
self.mo_simplified_version = simplify_version(self.get_mo_version())
return self.mo_simplified_version
def get_ie_simplified_version(self):
if self.ie_simplified_version:
return self.ie_simplified_version
self.ie_simplified_version = get_simplified_ie_version(env=os.environ)
return self.ie_simplified_version
def check_runtime_dependencies(self, silent=True):
if not self.runtime_checked:
def raise_ie_not_found():
raise Error("Could not find the Inference Engine or nGraph Python API.\n"
"Consider building the Inference Engine and nGraph Python APIs from sources or "
"try to install OpenVINO (TM) Toolkit using pip \npip install openvino")
try:
if not find_ie_version(silent=silent):
raise_ie_not_found()
except Exception as e:
import logging as log
if log is not None:
log.error(e)
raise_ie_not_found()
self.runtime_checked = True

View File

@@ -0,0 +1,41 @@
# Copyright (C) 2018-2023 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
import unittest
from openvino.runtime import get_version as get_ie_version
from openvino.tools.mo.utils.version import get_version, get_simplified_ie_version, \
get_simplified_mo_version, VersionChecker
class VersionCheckerTest(unittest.TestCase):
def test_version_checker(self):
import datetime
import os
ref_mo_version = get_version()
ref_ie_version = get_ie_version()
ref_mo_simplified_version = get_simplified_mo_version()
ref_ie_simplified_version = get_simplified_ie_version(env=os.environ)
# first init of VersionChecker
start_time = datetime.datetime.now()
VersionChecker().check_runtime_dependencies()
VersionChecker().get_mo_version()
VersionChecker().get_ie_version()
VersionChecker().get_mo_simplified_version()
VersionChecker().get_ie_simplified_version()
first_init_time = (datetime.datetime.now() - start_time).total_seconds()
# Loop with multiple usages of VersionChecker
start_time = datetime.datetime.now()
for _ in range(100):
VersionChecker().check_runtime_dependencies()
assert VersionChecker().get_mo_version() == ref_mo_version
assert VersionChecker().get_ie_version() == ref_ie_version
assert VersionChecker().get_mo_simplified_version() == ref_mo_simplified_version
assert VersionChecker().get_ie_simplified_version() == ref_ie_simplified_version
loop_time = (datetime.datetime.now() - start_time).total_seconds()
# Check that time of loop is less than first init, so no actual initialization happens
assert loop_time < first_init_time

View File

@@ -1,13 +1,17 @@
# Copyright (C) 2018-2023 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
import os
import subprocess
import sys
import unittest
import unittest.mock as mock
from unittest.mock import mock_open
from unittest.mock import patch
from openvino.tools.mo.subprocess_main import setup_env
from openvino.tools.mo.utils.version import get_version, extract_release_version, get_simplified_ie_version, \
get_simplified_mo_version, extract_hash_from_version
get_simplified_mo_version, extract_hash_from_version, VersionChecker
class TestingVersion(unittest.TestCase):
@@ -90,3 +94,11 @@ class TestingVersion(unittest.TestCase):
def test_extracting_version_hash_from_old_format(self):
self.assertEqual(extract_hash_from_version(full_version="2022.1.0-6311-a90bb1f"),
"a90bb1f")
def test_version_checker(self):
setup_env()
args = [sys.executable, '-m', 'pytest',
os.path.join(os.path.dirname(os.path.dirname(__file__)), 'convert/version_checker_test_actual.py'), '-s']
status = subprocess.run(args, env=os.environ, capture_output=True)
assert not status.returncode