Check the selected frontend to correspond use_new/legacy_frontend options (#10084)

* Check the selected frontend to correspond use_new/legacy_frontend options

Signed-off-by: Roman Kazantsev <roman.kazantsev@intel.com>

* Fix a default case when no frontend is found

Signed-off-by: Roman Kazantsev <roman.kazantsev@intel.com>
This commit is contained in:
Roman Kazantsev
2022-02-03 20:34:07 +03:00
committed by GitHub
parent f2f281e60b
commit 64aabc74d1
4 changed files with 42 additions and 24 deletions

View File

@@ -194,6 +194,8 @@ Framework-agnostic parameters:
--transformations_config TRANSFORMATIONS_CONFIG --transformations_config TRANSFORMATIONS_CONFIG
Use the configuration file with transformations Use the configuration file with transformations
description. description.
--use_new_frontend Force the usage of new frontend API for model processing.
--use_legacy_frontend Force the usage of legacy API for model processing.
``` ```
The sections below provide details on using particular parameters and examples of CLI commands. The sections below provide details on using particular parameters and examples of CLI commands.

View File

@@ -35,7 +35,7 @@ from openvino.tools.mo.utils.cli_parser import check_available_transforms, get_c
from openvino.tools.mo.utils.error import Error, FrameworkError from openvino.tools.mo.utils.error import Error, FrameworkError
from openvino.tools.mo.utils.find_ie_version import find_ie_version from openvino.tools.mo.utils.find_ie_version import find_ie_version
from openvino.tools.mo.utils.get_ov_update_message import get_ov_update_message from openvino.tools.mo.utils.get_ov_update_message import get_ov_update_message
from openvino.tools.mo.utils.guess_framework import deduce_framework_by_namespace 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.logger import init_logger, progress_printer
from openvino.tools.mo.utils.model_analysis import AnalysisResults from openvino.tools.mo.utils.model_analysis import AnalysisResults
from openvino.tools.mo.utils.utils import refer_to_faq_msg from openvino.tools.mo.utils.utils import refer_to_faq_msg
@@ -138,27 +138,45 @@ def get_moc_frontends(argv: argparse.Namespace):
def arguments_post_parsing(argv: argparse.Namespace): def arguments_post_parsing(argv: argparse.Namespace):
use_legacy_frontend = argv.use_legacy_frontend
use_new_frontend = argv.use_new_frontend
if use_new_frontend and use_legacy_frontend:
raise Error('Options --use_new_frontend and --use_legacy_frontend must not be used simultaneously '
'in the Model Optimizer command-line')
moc_front_end, available_moc_front_ends = get_moc_frontends(argv) moc_front_end, available_moc_front_ends = get_moc_frontends(argv)
is_tf, is_caffe, is_mxnet, is_kaldi, is_onnx =\ if not moc_front_end and use_new_frontend:
deduce_framework_by_namespace(argv) if not moc_front_end else [False, False, False, False, False] raise Error('Option --use_new_frontend is specified but the Model Optimizer is unable to find new frontend. '
'Please ensure that your environment contains new frontend for the input model format or '
'try to convert the model without specifying --use_new_frontend option.')
if any([is_tf, is_caffe, is_mxnet, is_kaldi, is_onnx]): is_tf, is_caffe, is_mxnet, is_kaldi, is_onnx =\
deduce_legacy_frontend_by_namespace(argv) if not moc_front_end else [False, False, False, False, False]
is_legacy_frontend = any([is_tf, is_caffe, is_mxnet, is_kaldi, is_onnx])
if not is_legacy_frontend and use_legacy_frontend:
raise Error('Option --use_legacy_frontend is specified but Model Optimizer does not have legacy frontend '
'for the input model format. Please try to convert the model without specifying --use_legacy_frontend option.')
# handle a default case, i.e. use_new_frontend and use_legacy_frontend are not specified, when no frontend is found
if not is_legacy_frontend and not moc_front_end:
legacy_frameworks = ['tf', 'caffe', 'mxnet', 'kaldi', 'onnx']
frameworks = list(set(legacy_frameworks + available_moc_front_ends))
if not argv.framework:
raise Error('Framework name can not be deduced from the given options: {}={}. '
'Please use --framework with one from the list: {}.',
'--input_model', argv.input_model, frameworks)
elif argv.framework not in frameworks:
raise Error('Framework {} is not a valid target. Please use --framework with one from the list: {}. ' +
refer_to_faq_msg(15), argv.framework, frameworks)
if is_legacy_frontend:
if new_extensions_used(argv): if new_extensions_used(argv):
raise Error('New kind of extensions used on legacy path') raise Error('New kind of extensions used on legacy path')
if new_transformations_config_used(argv): if new_transformations_config_used(argv):
raise Error('New kind of transformations configuration used on legacy path') raise Error('New kind of transformations configuration used on legacy path')
else: # new frontend used
frameworks = ['tf', 'caffe', 'mxnet', 'kaldi', 'onnx']
frameworks = list(set(frameworks + available_moc_front_ends))
if argv.framework not in frameworks:
if argv.use_legacy_frontend:
raise Error('Framework {} is not a valid target when using the --use_legacy_frontend flag. '
'The following legacy frameworks are available: {}' +
refer_to_faq_msg(15), argv.framework, frameworks)
else:
raise Error('Framework {} is not a valid target. Please use --framework with one from the list: {}. ' +
refer_to_faq_msg(15), argv.framework, frameworks)
if is_tf and not argv.input_model and not argv.saved_model_dir and not argv.input_meta_graph: if is_tf and not argv.input_model and not argv.saved_model_dir and not argv.input_meta_graph:
raise Error('Path to input model or saved model dir is required: use --input_model, --saved_model_dir or ' raise Error('Path to input model or saved model dir is required: use --input_model, --saved_model_dir or '
@@ -208,7 +226,8 @@ def arguments_post_parsing(argv: argparse.Namespace):
# dependency search does not break the MO pipeline # dependency search does not break the MO pipeline
def raise_ie_not_found(): def raise_ie_not_found():
raise Error("Could not find the Inference Engine or nGraph Python API.\n" 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 \"install_prerequisites.{}\"".format( "Consider building the Inference Engine and nGraph Python APIs from sources or "
"try to install OpenVINO (TM) Toolkit using \"install_prerequisites.{}\"".format(
"bat" if sys.platform == "windows" else "sh")) "bat" if sys.platform == "windows" else "sh"))
try: try:
if not find_ie_version(silent=argv.silent): if not find_ie_version(silent=argv.silent):
@@ -332,7 +351,7 @@ def check_fallback(argv : argparse.Namespace):
fallback_reasons = {} fallback_reasons = {}
# Some frontend such as PDPD does not have legacy path so it has no reasons to fallback # Some frontend such as PDPD does not have legacy path so it has no reasons to fallback
if not any(deduce_framework_by_namespace(argv)): if not any(deduce_legacy_frontend_by_namespace(argv)):
return fallback_reasons return fallback_reasons
# There is no possibility for fallback if a user strictly wants to use new frontend # There is no possibility for fallback if a user strictly wants to use new frontend
@@ -372,7 +391,7 @@ def prepare_ir(argv : argparse.Namespace):
return graph, ngraph_function return graph, ngraph_function
else: # apply fallback else: # apply fallback
reasons_message = ", ".join(fallback_reasons) reasons_message = ", ".join(fallback_reasons)
load_extensions(argv, *list(deduce_framework_by_namespace(argv))) load_extensions(argv, *list(deduce_legacy_frontend_by_namespace(argv)))
t.send_event("mo", "fallback_reason", reasons_message) t.send_event("mo", "fallback_reason", reasons_message)
log.warning("The IR preparation was executed by the legacy MO path. " log.warning("The IR preparation was executed by the legacy MO path. "
"This is a fallback scenario applicable only for some specific cases. " "This is a fallback scenario applicable only for some specific cases. "

View File

@@ -443,10 +443,10 @@ def get_common_cli_parser(parser: argparse.ArgumentParser = None):
common_group.add_argument('--legacy_ir_generation', common_group.add_argument('--legacy_ir_generation',
help=argparse.SUPPRESS, action=DeprecatedStoreTrue, default=False) help=argparse.SUPPRESS, action=DeprecatedStoreTrue, default=False)
common_group.add_argument("--use_new_frontend", common_group.add_argument("--use_new_frontend",
help="Use new frontend API for model processing", help="Force the usage of new frontend API for model processing",
action='store_true', default=False) action='store_true', default=False)
common_group.add_argument("--use_legacy_frontend", common_group.add_argument("--use_legacy_frontend",
help="Use legacy API for model processing", help="Force the usage of legacy API for model processing",
action='store_true', default=False) action='store_true', default=False)
return parser return parser

View File

@@ -8,7 +8,7 @@ from openvino.tools.mo.utils.error import Error
from openvino.tools.mo.utils.utils import refer_to_faq_msg from openvino.tools.mo.utils.utils import refer_to_faq_msg
def deduce_framework_by_namespace(argv: Namespace): def deduce_legacy_frontend_by_namespace(argv: Namespace):
if not argv.framework: if not argv.framework:
if getattr(argv, 'saved_model_dir', None) or getattr(argv, 'input_meta_graph', None): if getattr(argv, 'saved_model_dir', None) or getattr(argv, 'input_meta_graph', None):
argv.framework = 'tf' argv.framework = 'tf'
@@ -20,9 +20,6 @@ def deduce_framework_by_namespace(argv: Namespace):
raise Error('Path to input model is required: use --input_model.') raise Error('Path to input model is required: use --input_model.')
else: else:
argv.framework = guess_framework_by_ext(argv.input_model) argv.framework = guess_framework_by_ext(argv.input_model)
if not argv.framework:
raise Error('Framework name can not be deduced from the given options: {}={}. Use --framework to choose '
'one of caffe, tf, mxnet, kaldi, onnx', '--input_model', argv.input_model, refer_to_faq_msg(15))
return map(lambda x: argv.framework == x, ['tf', 'caffe', 'mxnet', 'kaldi', 'onnx']) return map(lambda x: argv.framework == x, ['tf', 'caffe', 'mxnet', 'kaldi', 'onnx'])