198 lines
7.5 KiB
Python
198 lines
7.5 KiB
Python
# Copyright (C) 2018-2025 Intel Corporation
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import importlib.util
|
|
import logging as log
|
|
import numpy as np
|
|
import os
|
|
import sys
|
|
from openvino.tools.ovc.error import Error
|
|
from collections.abc import Iterable
|
|
from typing import Union
|
|
|
|
try:
|
|
import openvino_telemetry as tm
|
|
from openvino_telemetry.backend import backend_ga4
|
|
except ImportError:
|
|
import openvino.tools.ovc.telemetry_stub as tm
|
|
|
|
if sys.version_info < (3, 8):
|
|
import importlib_metadata
|
|
else:
|
|
import importlib.metadata as importlib_metadata
|
|
|
|
dynamic_dimension = np.ma.masked
|
|
|
|
|
|
def refer_to_faq_msg(question_num: int):
|
|
try:
|
|
t = tm.Telemetry()
|
|
t.send_event('ovc', 'error_info', "faq:" + str(question_num))
|
|
except Exception:
|
|
# Telemetry can be not initialized if it is used in MO IR Reader
|
|
pass
|
|
|
|
return '\n For more information please refer to Model Conversion API FAQ, question #{0}. ' \
|
|
'(https://docs.openvino.ai/2023.0/openvino_docs_MO_DG_prepare_model_Model_Optimizer_FAQ.html' \
|
|
'?question={0}#question-{0})'.format(question_num)
|
|
|
|
|
|
def get_mo_root_dir():
|
|
"""
|
|
Return the absolute path to the Model Conversion API root directory (where mo folder is located)
|
|
:return: path to the MO root directory
|
|
"""
|
|
return os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(os.path.realpath(__file__))), os.pardir))
|
|
|
|
|
|
def check_values_equal(val1, val2):
|
|
# This method is needed to check equality of values where some values can be None
|
|
if val1 is None and val2 is None:
|
|
return True
|
|
if val1 is None:
|
|
return False
|
|
if val2 is None:
|
|
return False
|
|
return val1 == val2
|
|
|
|
|
|
np_map_cast = {bool: lambda x: bool_cast(x),
|
|
np.int8: lambda x: np.int8(x),
|
|
np.int16: lambda x: np.int16(x),
|
|
np.int32: lambda x: np.int32(x),
|
|
np.int64: lambda x: np.int64(x),
|
|
np.uint8: lambda x: np.uint8(x),
|
|
np.uint16: lambda x: np.uint16(x),
|
|
np.uint32: lambda x: np.uint32(x),
|
|
np.uint64: lambda x: np.uint64(x),
|
|
np.float16: lambda x: np.float16(x),
|
|
np.float32: lambda x: np.float32(x),
|
|
np.double: lambda x: np.double(x),
|
|
str: lambda x: str(x)}
|
|
|
|
|
|
def bool_cast(x):
|
|
if isinstance(x, str):
|
|
return False if x.lower() in ['false', '0'] else True if x.lower() in ['true', '1'] else 'unknown_boolean_cast'
|
|
else:
|
|
return bool(x)
|
|
|
|
|
|
def mo_array(value: Union[Iterable[Union[float, int]], float, int], dtype=None) -> np.ndarray:
|
|
"""
|
|
This function acts in a same way as np.array except for the case when dtype is not provided
|
|
and np.array return fp64 array this function returns fp32 array
|
|
"""
|
|
x = np.array(value, dtype=dtype)
|
|
if not isinstance(value, np.ndarray) and x.dtype == np.float64 and dtype != np.float64:
|
|
x = x.astype(np.float32)
|
|
return x
|
|
|
|
|
|
def validate_batch_in_shape(shape, layer_name: str):
|
|
"""
|
|
Raises Error #39 if shape is not valid for setting batch size
|
|
Parameters
|
|
----------
|
|
shape: current shape of layer under validation
|
|
layer_name: name of layer under validation
|
|
"""
|
|
if len(shape) == 0 or (shape[0] is not dynamic_dimension and shape[0] not in (-1, 0, 1)):
|
|
raise Error(('The input layer {} has a shape {} defined in the model. \n\n' +
|
|
'When you use "batch" option, Model Conversion API applies its value to the first ' +
|
|
'element of the shape if it is equal to -1, 0 or 1. Otherwise, this is the ambiguous ' +
|
|
'situation - it is not known in advance whether the layer has the batch ' +
|
|
'dimension or not.\n\n For example, you want to set batch dimension equals 100 ' +
|
|
'for the input layer "data" with shape (10,34). Although you can not use "batch", ' +
|
|
'you should pass "input_shape=[100,34]" instead of "batch=100". \n\n' +
|
|
'You can also specify batch dimension by setting "layout". \n\n')
|
|
.format(layer_name, shape))
|
|
|
|
|
|
def get_ir_version():
|
|
"""
|
|
Default IR version.
|
|
:return: the IR version
|
|
"""
|
|
return 11
|
|
|
|
|
|
def import_openvino_tokenizers():
|
|
# extract openvino version
|
|
if importlib.util.find_spec("openvino") is None:
|
|
return False
|
|
try:
|
|
from openvino import get_version
|
|
openvino_version = get_version()
|
|
openvino_available = True
|
|
except ImportError:
|
|
openvino_available = False
|
|
if not openvino_available:
|
|
return False
|
|
|
|
if importlib.util.find_spec("openvino_tokenizers") is None:
|
|
return False
|
|
|
|
try:
|
|
pip_metadata_version = importlib_metadata.version("openvino")
|
|
except importlib_metadata.PackageNotFoundError:
|
|
pip_metadata_version = False
|
|
try:
|
|
pip_metadata_version = importlib_metadata.version("openvino-nightly")
|
|
is_nightly = True
|
|
except importlib_metadata.PackageNotFoundError:
|
|
is_nightly = False
|
|
|
|
try:
|
|
import openvino_tokenizers # pylint: disable=no-name-in-module,import-error
|
|
|
|
openvino_tokenizers._get_factory()
|
|
except RuntimeError:
|
|
tokenizers_version = openvino_tokenizers.__version__
|
|
|
|
if tokenizers_version == "0.0.0.0":
|
|
try:
|
|
tokenizers_version = importlib_metadata.version("openvino_tokenizers") or tokenizers_version
|
|
except importlib_metadata.PackageNotFoundError:
|
|
pass
|
|
message = (
|
|
"OpenVINO and OpenVINO Tokenizers versions are not binary compatible.\n"
|
|
f"OpenVINO version: {openvino_version}\n"
|
|
f"OpenVINO Tokenizers version: {tokenizers_version}\n"
|
|
"First 3 numbers should be the same. Update OpenVINO Tokenizers to compatible version. "
|
|
)
|
|
if not pip_metadata_version:
|
|
message += (
|
|
"For archive installation of OpenVINO try to build OpenVINO Tokenizers from source: "
|
|
"https://github.com/openvinotoolkit/openvino_tokenizers/tree/master?tab=readme-ov-file"
|
|
"#build-and-install-from-source"
|
|
)
|
|
if sys.platform == "linux":
|
|
message += (
|
|
"\nThe PyPI version of OpenVINO Tokenizers is built on CentOS and may not be compatible with other "
|
|
"Linux distributions; rebuild OpenVINO Tokenizers from source."
|
|
)
|
|
else:
|
|
message += (
|
|
"It is recommended to use the same day builds for pre-release version. "
|
|
"To install both OpenVINO and OpenVINO Tokenizers release version perform:\n"
|
|
)
|
|
if is_nightly:
|
|
message += "pip uninstall -y openvino-nightly && "
|
|
message += "pip install --force-reinstall openvino openvino-tokenizers\n"
|
|
if is_nightly:
|
|
message += (
|
|
"openvino-nightly package will be deprecated in the future - use pre-release drops instead. "
|
|
)
|
|
message += "To update both OpenVINO and OpenVINO Tokenizers to the latest pre-release version perform:\n"
|
|
if is_nightly:
|
|
message += "pip uninstall -y openvino-nightly && "
|
|
message += (
|
|
"pip install --pre -U openvino openvino-tokenizers "
|
|
"--extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly"
|
|
)
|
|
log.warning(message)
|
|
return False
|
|
|
|
return True
|