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:
committed by
GitHub
parent
061ba1d773
commit
4921d1ad28
@@ -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():
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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'}},
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user