bigdl-core-npu 2.5.0__cp310-cp310-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bigdl_core_npu-2.5.0.dist-info/METADATA +35 -0
- bigdl_core_npu-2.5.0.dist-info/RECORD +223 -0
- bigdl_core_npu-2.5.0.dist-info/WHEEL +5 -0
- bigdl_core_npu-2.5.0.dist-info/top_level.txt +1 -0
- intel_npu_acceleration_library/__init__.py +24 -0
- intel_npu_acceleration_library/_version.py +6 -0
- intel_npu_acceleration_library/backend/__init__.py +37 -0
- intel_npu_acceleration_library/backend/base.py +215 -0
- intel_npu_acceleration_library/backend/bindings.py +279 -0
- intel_npu_acceleration_library/backend/compression.py +24 -0
- intel_npu_acceleration_library/backend/convolution.py +58 -0
- intel_npu_acceleration_library/backend/factory.py +944 -0
- intel_npu_acceleration_library/backend/linear.py +60 -0
- intel_npu_acceleration_library/backend/matmul.py +59 -0
- intel_npu_acceleration_library/backend/mlp.py +58 -0
- intel_npu_acceleration_library/backend/ops.py +141 -0
- intel_npu_acceleration_library/backend/qlinear.py +71 -0
- intel_npu_acceleration_library/backend/qmatmul.py +66 -0
- intel_npu_acceleration_library/backend/runtime.py +210 -0
- intel_npu_acceleration_library/backend/sdpa.py +107 -0
- intel_npu_acceleration_library/backend/tensor.py +1050 -0
- intel_npu_acceleration_library/backend/utils.py +70 -0
- intel_npu_acceleration_library/compiler.py +194 -0
- intel_npu_acceleration_library/device.py +230 -0
- intel_npu_acceleration_library/dtypes.py +122 -0
- intel_npu_acceleration_library/external/openvino/__init__.py +71 -0
- intel_npu_acceleration_library/external/openvino/_offline_transformations/__init__.py +20 -0
- intel_npu_acceleration_library/external/openvino/_pyopenvino.cp310-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/_pyopenvino.cp311-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/_pyopenvino.cp312-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/_pyopenvino.cp38-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/_pyopenvino.cp39-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/__init__.py +34 -0
- intel_npu_acceleration_library/external/openvino/frontend/frontend.py +44 -0
- intel_npu_acceleration_library/external/openvino/frontend/onnx/__init__.py +15 -0
- intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp310-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp311-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp312-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp38-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp39-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/paddle/__init__.py +15 -0
- intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp310-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp311-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp312-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp38-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp39-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/__init__.py +19 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/fx_decoder.py +352 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/gptq.py +139 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/module_extension.py +39 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/patch_model.py +98 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp310-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp311-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp312-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp38-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp39-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/backend.py +119 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/backend_utils.py +85 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/compile.py +141 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/decompositions.py +116 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/execute.py +189 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/op_support.py +289 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/partition.py +118 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/ts_decoder.py +536 -0
- intel_npu_acceleration_library/external/openvino/frontend/pytorch/utils.py +256 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/__init__.py +16 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/graph_iterator.py +116 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/node_decoder.py +219 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp310-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp311-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp312-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp38-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp39-win_amd64.pyd +0 -0
- intel_npu_acceleration_library/external/openvino/frontend/tensorflow/utils.py +460 -0
- intel_npu_acceleration_library/external/openvino/helpers/__init__.py +6 -0
- intel_npu_acceleration_library/external/openvino/helpers/packing.py +87 -0
- intel_npu_acceleration_library/external/openvino/preprocess/README.md +60 -0
- intel_npu_acceleration_library/external/openvino/preprocess/__init__.py +26 -0
- intel_npu_acceleration_library/external/openvino/preprocess/torchvision/__init__.py +15 -0
- intel_npu_acceleration_library/external/openvino/preprocess/torchvision/preprocess_converter.py +47 -0
- intel_npu_acceleration_library/external/openvino/preprocess/torchvision/requirements.txt +4 -0
- intel_npu_acceleration_library/external/openvino/preprocess/torchvision/torchvision_preprocessing.py +347 -0
- intel_npu_acceleration_library/external/openvino/properties/__init__.py +21 -0
- intel_npu_acceleration_library/external/openvino/properties/_properties.py +55 -0
- intel_npu_acceleration_library/external/openvino/properties/device/__init__.py +14 -0
- intel_npu_acceleration_library/external/openvino/properties/hint/__init__.py +15 -0
- intel_npu_acceleration_library/external/openvino/properties/intel_auto/__init__.py +12 -0
- intel_npu_acceleration_library/external/openvino/properties/intel_cpu/__init__.py +8 -0
- intel_npu_acceleration_library/external/openvino/properties/intel_gpu/__init__.py +12 -0
- intel_npu_acceleration_library/external/openvino/properties/intel_gpu/hint/__init__.py +11 -0
- intel_npu_acceleration_library/external/openvino/properties/log/__init__.py +11 -0
- intel_npu_acceleration_library/external/openvino/properties/streams/__init__.py +11 -0
- intel_npu_acceleration_library/external/openvino/runtime/__init__.py +85 -0
- intel_npu_acceleration_library/external/openvino/runtime/exceptions.py +17 -0
- intel_npu_acceleration_library/external/openvino/runtime/ie_api.py +631 -0
- intel_npu_acceleration_library/external/openvino/runtime/op/__init__.py +18 -0
- intel_npu_acceleration_library/external/openvino/runtime/op/util/__init__.py +22 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset1/__init__.py +112 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset1/ops.py +3067 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset10/__init__.py +179 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset10/ops.py +173 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset11/__init__.py +179 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset11/ops.py +107 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset12/__init__.py +180 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset12/ops.py +120 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset13/__init__.py +188 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset13/ops.py +399 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset14/__init__.py +190 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset14/ops.py +171 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset15/__init__.py +10 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset15/ops.py +85 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset2/__init__.py +118 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset2/ops.py +216 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset3/__init__.py +134 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset3/ops.py +638 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset4/__init__.py +145 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset4/ops.py +464 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset5/__init__.py +152 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset5/ops.py +372 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset6/__init__.py +154 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset6/ops.py +189 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset7/__init__.py +158 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset7/ops.py +169 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset8/__init__.py +169 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset8/ops.py +783 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset9/__init__.py +175 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset9/ops.py +341 -0
- intel_npu_acceleration_library/external/openvino/runtime/opset_utils.py +22 -0
- intel_npu_acceleration_library/external/openvino/runtime/passes/__init__.py +19 -0
- intel_npu_acceleration_library/external/openvino/runtime/passes/graph_rewrite.py +33 -0
- intel_npu_acceleration_library/external/openvino/runtime/passes/manager.py +26 -0
- intel_npu_acceleration_library/external/openvino/runtime/properties/__init__.py +38 -0
- intel_npu_acceleration_library/external/openvino/runtime/properties/hint/__init__.py +25 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/__init__.py +7 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/broadcasting.py +44 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/data_helpers/__init__.py +8 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/data_helpers/data_dispatcher.py +429 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/data_helpers/wrappers.py +148 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/decorators.py +70 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/input_validation.py +133 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/node_factory.py +127 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/reduction.py +25 -0
- intel_npu_acceleration_library/external/openvino/runtime/utils/types.py +175 -0
- intel_npu_acceleration_library/external/openvino/tools/__init__.py +4 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/__init__.py +3 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/benchmark.py +186 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/main.py +695 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/parameters.py +199 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/__init__.py +3 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/constants.py +26 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/inputs_filling.py +482 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/logging.py +8 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/statistics_report.py +296 -0
- intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/utils.py +836 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/__init__.py +20 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/__main__.py +10 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/cli_parser.py +633 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/convert.py +102 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/convert_data_type.py +82 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/convert_impl.py +536 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/environment_setup_utils.py +50 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/error.py +49 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/get_ov_update_message.py +16 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/help.py +45 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/logger.py +91 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/main.py +35 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/__init__.py +2 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/analysis.py +46 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/check_config.py +57 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/extractor.py +447 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/layout_utils.py +73 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/moc_emit_ir.py +32 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/offline_transformations.py +107 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/paddle_frontend_utils.py +83 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/pipeline.py +246 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/preprocessing.py +220 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/pytorch_frontend_utils.py +205 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/shape_utils.py +109 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/type_utils.py +82 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/ovc.py +13 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/telemetry_params.py +6 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/telemetry_stub.py +28 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/telemetry_utils.py +118 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/utils.py +109 -0
- intel_npu_acceleration_library/external/openvino/tools/ovc/version.py +80 -0
- intel_npu_acceleration_library/external/openvino/torch/__init__.py +5 -0
- intel_npu_acceleration_library/external/openvino/utils.py +98 -0
- intel_npu_acceleration_library/functional/__init__.py +8 -0
- intel_npu_acceleration_library/functional/scaled_dot_product_attention.py +47 -0
- intel_npu_acceleration_library/lib/Release/cache.json +113732 -0
- intel_npu_acceleration_library/lib/Release/intel_npu_acceleration_library.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_auto_batch_plugin.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_auto_plugin.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_c.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_hetero_plugin.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_intel_cpu_plugin.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_intel_gpu_plugin.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_intel_npu_plugin.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_ir_frontend.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_onnx_frontend.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_paddle_frontend.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_pytorch_frontend.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_tensorflow_frontend.dll +0 -0
- intel_npu_acceleration_library/lib/Release/openvino_tensorflow_lite_frontend.dll +0 -0
- intel_npu_acceleration_library/lib/Release/tbb12.dll +0 -0
- intel_npu_acceleration_library/lib/Release/tbb12_debug.dll +0 -0
- intel_npu_acceleration_library/lib/Release/tbbbind_2_5.dll +0 -0
- intel_npu_acceleration_library/lib/Release/tbbbind_2_5_debug.dll +0 -0
- intel_npu_acceleration_library/lib/Release/tbbmalloc.dll +0 -0
- intel_npu_acceleration_library/lib/Release/tbbmalloc_debug.dll +0 -0
- intel_npu_acceleration_library/lib/Release/tbbmalloc_proxy.dll +0 -0
- intel_npu_acceleration_library/lib/Release/tbbmalloc_proxy_debug.dll +0 -0
- intel_npu_acceleration_library/modelling.py +150 -0
- intel_npu_acceleration_library/nn/__init__.py +20 -0
- intel_npu_acceleration_library/nn/autograd.py +68 -0
- intel_npu_acceleration_library/nn/conv.py +257 -0
- intel_npu_acceleration_library/nn/functional.py +1207 -0
- intel_npu_acceleration_library/nn/linear.py +162 -0
- intel_npu_acceleration_library/nn/llm.py +417 -0
- intel_npu_acceleration_library/nn/module.py +393 -0
- intel_npu_acceleration_library/optimizations.py +157 -0
- intel_npu_acceleration_library/quantization.py +174 -0
@@ -0,0 +1,836 @@
|
|
1
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
from collections import defaultdict
|
5
|
+
from datetime import timedelta
|
6
|
+
import enum
|
7
|
+
from openvino.runtime import Core, Model, PartialShape, Dimension, Layout, Type, serialize, properties, OVAny
|
8
|
+
from openvino.preprocess import PrePostProcessor
|
9
|
+
|
10
|
+
from .constants import DEVICE_DURATION_IN_SECS, UNKNOWN_DEVICE_TYPE, \
|
11
|
+
AUTO_DEVICE_NAME, MULTI_DEVICE_NAME, HETERO_DEVICE_NAME
|
12
|
+
from .logging import logger
|
13
|
+
|
14
|
+
import json
|
15
|
+
import re
|
16
|
+
import numpy as np
|
17
|
+
|
18
|
+
def static_vars(**kwargs):
|
19
|
+
def decorate(func):
|
20
|
+
for k in kwargs:
|
21
|
+
setattr(func, k, kwargs[k])
|
22
|
+
return func
|
23
|
+
|
24
|
+
return decorate
|
25
|
+
|
26
|
+
|
27
|
+
@static_vars(step_id=0)
|
28
|
+
def next_step(additional_info='', step_id=0):
|
29
|
+
step_names = {
|
30
|
+
1: "Parsing and validating input arguments",
|
31
|
+
2: "Loading OpenVINO Runtime",
|
32
|
+
3: "Setting device configuration",
|
33
|
+
4: "Reading model files",
|
34
|
+
5: "Resizing model to match image sizes and given batch",
|
35
|
+
6: "Configuring input of the model",
|
36
|
+
7: "Loading the model to the device",
|
37
|
+
8: "Querying optimal runtime parameters",
|
38
|
+
9: "Creating infer requests and preparing input tensors",
|
39
|
+
10: "Measuring performance",
|
40
|
+
11: "Dumping statistics report",
|
41
|
+
}
|
42
|
+
if step_id != 0:
|
43
|
+
next_step.step_id = step_id
|
44
|
+
else:
|
45
|
+
next_step.step_id += 1
|
46
|
+
|
47
|
+
if next_step.step_id not in step_names.keys():
|
48
|
+
raise Exception(f'Step ID {next_step.step_id} is out of total steps number {str(len(step_names))}')
|
49
|
+
|
50
|
+
step_info_template = '[Step {}/{}] {}'
|
51
|
+
step_name = step_names[next_step.step_id] + (f' ({additional_info})' if additional_info else '')
|
52
|
+
step_info_template = step_info_template.format(next_step.step_id, len(step_names), step_name)
|
53
|
+
print(step_info_template)
|
54
|
+
|
55
|
+
|
56
|
+
def get_element_type(precision):
|
57
|
+
format_map = {
|
58
|
+
'bool' : Type.boolean,
|
59
|
+
|
60
|
+
'f16' : Type.f16,
|
61
|
+
'f32' : Type.f32,
|
62
|
+
'f64' : Type.f64,
|
63
|
+
|
64
|
+
'i8' : Type.i8,
|
65
|
+
'i16' : Type.i16,
|
66
|
+
'i32' : Type.i32,
|
67
|
+
'i64' : Type.i64,
|
68
|
+
|
69
|
+
'u8' : Type.u8,
|
70
|
+
'u16' : Type.u16,
|
71
|
+
'u32' : Type.u32,
|
72
|
+
'u64' : Type.u64,
|
73
|
+
}
|
74
|
+
if precision in format_map.keys():
|
75
|
+
return format_map[precision]
|
76
|
+
|
77
|
+
raise Exception(f"Undefined precision: '{precision}' !")
|
78
|
+
|
79
|
+
|
80
|
+
def fuse_mean_scale(preproc: PrePostProcessor, app_inputs_info):
|
81
|
+
# TODO: remove warning after 23.3 release
|
82
|
+
warned = False
|
83
|
+
warn_msg = 'Mean/scale values are fused into the model. This slows down performance compared to --imean and --iscale which existed before'
|
84
|
+
for input_info in app_inputs_info:
|
85
|
+
if input_info.mean.size:
|
86
|
+
if not warned:
|
87
|
+
logger.warning(warn_msg)
|
88
|
+
warned = True
|
89
|
+
preproc.input(input_info.name).preprocess().convert_element_type(Type.f32).mean(input_info.mean)
|
90
|
+
if input_info.scale.size:
|
91
|
+
if not warned:
|
92
|
+
logger.warning(warn_msg)
|
93
|
+
warned = True
|
94
|
+
preproc.input(input_info.name).preprocess().convert_element_type(Type.f32).scale(input_info.scale)
|
95
|
+
|
96
|
+
|
97
|
+
def pre_post_processing(model: Model, app_inputs_info, input_precision: str, output_precision: str, input_output_precision: str):
|
98
|
+
pre_post_processor = PrePostProcessor(model)
|
99
|
+
if input_precision:
|
100
|
+
element_type = get_element_type(input_precision)
|
101
|
+
for i in range(len(model.inputs)):
|
102
|
+
pre_post_processor.input(i).tensor().set_element_type(element_type)
|
103
|
+
app_inputs_info[i].element_type = element_type
|
104
|
+
if output_precision:
|
105
|
+
element_type = get_element_type(output_precision)
|
106
|
+
for i in range(len(model.outputs)):
|
107
|
+
pre_post_processor.output(i).tensor().set_element_type(element_type)
|
108
|
+
user_precision_map = {}
|
109
|
+
if input_output_precision:
|
110
|
+
user_precision_map = parse_input_output_precision(input_output_precision)
|
111
|
+
input_names = get_input_output_names(model.inputs)
|
112
|
+
input_node_names = get_node_names(model.inputs)
|
113
|
+
output_names = get_input_output_names(model.outputs)
|
114
|
+
output_node_names = get_node_names(model.outputs)
|
115
|
+
for node_name, precision in user_precision_map.items():
|
116
|
+
user_precision_map[node_name] = get_element_type(precision)
|
117
|
+
for name, element_type in user_precision_map.items():
|
118
|
+
if name in input_names or name in input_node_names:
|
119
|
+
input_index = input_names.index(name) if name in input_names else input_node_names.index(name)
|
120
|
+
app_inputs_info[input_index].element_type = element_type
|
121
|
+
pre_post_processor.input(input_index).tensor().set_element_type(element_type)
|
122
|
+
elif name in output_names or name in output_node_names:
|
123
|
+
if name in output_names:
|
124
|
+
pre_post_processor.output(name).tensor().set_element_type(element_type)
|
125
|
+
else:
|
126
|
+
pre_post_processor.output(output_node_names.index(name)).tensor().set_element_type(element_type)
|
127
|
+
else:
|
128
|
+
raise Exception(f"Node '{name}' does not exist in model")
|
129
|
+
|
130
|
+
# update app_inputs_info
|
131
|
+
if not input_precision:
|
132
|
+
inputs = model.inputs
|
133
|
+
input_node_names = get_node_names(model.inputs)
|
134
|
+
for i in range(len(inputs)):
|
135
|
+
if app_inputs_info[i].name in user_precision_map:
|
136
|
+
app_inputs_info[i].element_type = user_precision_map[app_inputs_info[i].name]
|
137
|
+
elif input_node_names[i] in user_precision_map:
|
138
|
+
app_inputs_info[i].element_type = user_precision_map[input_node_names[i]]
|
139
|
+
elif app_inputs_info[i].is_image:
|
140
|
+
app_inputs_info[i].element_type = Type.u8
|
141
|
+
pre_post_processor.input(i).tensor().set_element_type(Type.u8)
|
142
|
+
|
143
|
+
fuse_mean_scale(pre_post_processor, app_inputs_info)
|
144
|
+
|
145
|
+
# set layout for model input
|
146
|
+
for info in app_inputs_info:
|
147
|
+
pre_post_processor.input(info.name).model().set_layout(info.layout)
|
148
|
+
|
149
|
+
model = pre_post_processor.build()
|
150
|
+
|
151
|
+
|
152
|
+
def parse_input_output_precision(arg_map: str):
|
153
|
+
arg_map = arg_map.replace(" ", "")
|
154
|
+
pairs = [x.strip() for x in arg_map.split(',')]
|
155
|
+
|
156
|
+
parsed_map = {}
|
157
|
+
for pair in pairs:
|
158
|
+
key_value = [x.strip() for x in pair.split(':')]
|
159
|
+
name, precision = key_value[0], key_value[1]
|
160
|
+
# input's name can contain ':'
|
161
|
+
if len(key_value) == 3:
|
162
|
+
name = key_value[0] + ':' + key_value[1]
|
163
|
+
precision = key_value[2]
|
164
|
+
parsed_map.update({name:precision})
|
165
|
+
|
166
|
+
return parsed_map
|
167
|
+
|
168
|
+
|
169
|
+
def print_inputs_and_outputs_info(model: Model):
|
170
|
+
inputs = model.inputs
|
171
|
+
logger.info("Model inputs:")
|
172
|
+
for input in inputs:
|
173
|
+
in_name = " , ".join(input.get_names())
|
174
|
+
node_name = input.node.get_friendly_name()
|
175
|
+
|
176
|
+
if in_name=="": in_name = "***NO_NAME***"
|
177
|
+
if node_name=="": node_name = "***NO_NAME***"
|
178
|
+
|
179
|
+
logger.info(f" {in_name} (node: {node_name}) : {input.element_type.get_type_name()} / "
|
180
|
+
f"{str(input.node.layout)} / {input.partial_shape}")
|
181
|
+
|
182
|
+
outputs = model.outputs
|
183
|
+
logger.info("Model outputs:")
|
184
|
+
for output in outputs:
|
185
|
+
out_name = " , ".join(output.get_names())
|
186
|
+
node_name = output.get_node().input(0).get_source_output().get_node().get_friendly_name()
|
187
|
+
|
188
|
+
if out_name=="": out_name = "***NO_NAME***"
|
189
|
+
if node_name=="": node_name = "***NO_NAME***"
|
190
|
+
|
191
|
+
logger.info(f" {out_name} (node: {node_name}) : {output.element_type.get_type_name()} / "
|
192
|
+
f"{str(output.node.layout)} / {output.partial_shape}")
|
193
|
+
|
194
|
+
|
195
|
+
def get_number_iterations(number_iterations: int, nireq: int, num_shapes: int, api_type: str):
|
196
|
+
niter = number_iterations
|
197
|
+
|
198
|
+
if api_type == 'async' and niter:
|
199
|
+
if num_shapes > nireq:
|
200
|
+
niter = int(((niter + num_shapes -1) / num_shapes) * num_shapes)
|
201
|
+
if number_iterations != niter:
|
202
|
+
logger.warning('Number of iterations was aligned by number of input shapes '
|
203
|
+
f'from {number_iterations} to {niter} using number of possible input shapes {num_shapes}')
|
204
|
+
else:
|
205
|
+
niter = int((niter + nireq - 1) / nireq) * nireq
|
206
|
+
if number_iterations != niter:
|
207
|
+
logger.warning('Number of iterations was aligned by request number '
|
208
|
+
f'from {number_iterations} to {niter} using number of requests {nireq}')
|
209
|
+
|
210
|
+
return niter
|
211
|
+
|
212
|
+
def get_duration_seconds(time, number_iterations, device):
|
213
|
+
if time:
|
214
|
+
# time limit
|
215
|
+
return time
|
216
|
+
|
217
|
+
if not number_iterations:
|
218
|
+
return get_duration_in_secs(device)
|
219
|
+
return 0
|
220
|
+
|
221
|
+
|
222
|
+
class LatencyGroup:
|
223
|
+
def __init__(self, input_names, input_shapes):
|
224
|
+
self.input_names = input_names
|
225
|
+
self.input_shapes = input_shapes
|
226
|
+
self.times = list()
|
227
|
+
self.median = 0.
|
228
|
+
self.avg = 0.
|
229
|
+
self.min = 0.
|
230
|
+
self.max = 0.
|
231
|
+
|
232
|
+
def __str__(self):
|
233
|
+
return str().join(f" {name}: {str(shape)}" for name, shape in zip(self.input_names, self.input_shapes))
|
234
|
+
|
235
|
+
|
236
|
+
def get_latency_groups(app_input_info):
|
237
|
+
num_groups = max(len(info.shapes) for info in app_input_info)
|
238
|
+
latency_groups = []
|
239
|
+
for i in range(num_groups):
|
240
|
+
names = list()
|
241
|
+
shapes = list()
|
242
|
+
for info in app_input_info:
|
243
|
+
names.append(info.name)
|
244
|
+
shapes.append(info.shapes[i % len(info.shapes)])
|
245
|
+
latency_groups.append(LatencyGroup(names, shapes))
|
246
|
+
return latency_groups
|
247
|
+
|
248
|
+
|
249
|
+
def get_duration_in_milliseconds(duration):
|
250
|
+
return duration * 1000
|
251
|
+
|
252
|
+
|
253
|
+
def get_duration_in_secs(target_device):
|
254
|
+
duration = 0
|
255
|
+
for device in DEVICE_DURATION_IN_SECS:
|
256
|
+
if device in target_device:
|
257
|
+
duration = max(duration, DEVICE_DURATION_IN_SECS[device])
|
258
|
+
|
259
|
+
if duration == 0:
|
260
|
+
duration = DEVICE_DURATION_IN_SECS[UNKNOWN_DEVICE_TYPE]
|
261
|
+
logger.warning(f'Default duration {duration} seconds is used for unknown device {target_device}')
|
262
|
+
|
263
|
+
return duration
|
264
|
+
|
265
|
+
|
266
|
+
def check_for_static(app_input_info):
|
267
|
+
for info in app_input_info:
|
268
|
+
if info.is_dynamic:
|
269
|
+
return False
|
270
|
+
return True
|
271
|
+
|
272
|
+
|
273
|
+
def can_measure_as_static(app_input_info):
|
274
|
+
for info in app_input_info:
|
275
|
+
if len(info.shapes) > 1:
|
276
|
+
return False
|
277
|
+
return True
|
278
|
+
|
279
|
+
meta_plugins = [ MULTI_DEVICE_NAME, HETERO_DEVICE_NAME, AUTO_DEVICE_NAME ]
|
280
|
+
def is_virtual_device(device_name) -> bool:
|
281
|
+
return device_name in meta_plugins
|
282
|
+
|
283
|
+
def is_virtual_device_found(device_names) -> bool:
|
284
|
+
return any(is_virtual_device(device_name) for device_name in device_names)
|
285
|
+
|
286
|
+
def parse_devices(device_string):
|
287
|
+
result = []
|
288
|
+
target_device = device_string.partition(":")[0]
|
289
|
+
result.append(target_device)
|
290
|
+
if device_string.find(":") != -1:
|
291
|
+
hw_devices_str = device_string.partition(":")[-1]
|
292
|
+
for hw_device in hw_devices_str.split(','):
|
293
|
+
if hw_device[0] == '-':
|
294
|
+
hw_device = hw_device[1:]
|
295
|
+
result.append(hw_device)
|
296
|
+
return result
|
297
|
+
|
298
|
+
def parse_value_per_device(devices, values_string, value_type):
|
299
|
+
# Format: <device1>:<value1>,<device2>:<value2> or just <value>
|
300
|
+
result = {}
|
301
|
+
if not values_string:
|
302
|
+
return result
|
303
|
+
device_value_strings = values_string.split(',')
|
304
|
+
for device_value_string in device_value_strings:
|
305
|
+
device_value_vec = device_value_string.split(':')
|
306
|
+
if len(device_value_vec) == 2:
|
307
|
+
device_name = device_value_vec[0]
|
308
|
+
value = device_value_vec[1]
|
309
|
+
if device_name in devices:
|
310
|
+
result[device_name] = value
|
311
|
+
else:
|
312
|
+
devices_str = ""
|
313
|
+
for device in devices:
|
314
|
+
devices_str += device + " "
|
315
|
+
devices_str = devices_str.strip()
|
316
|
+
raise Exception(f"Failed to set property to '{device_name}' " \
|
317
|
+
f"which is not found in the target devices list '{devices_str}'!")
|
318
|
+
elif len(device_value_vec) == 1:
|
319
|
+
value = device_value_vec[0]
|
320
|
+
for device in devices:
|
321
|
+
result[device] = value
|
322
|
+
elif not device_value_vec:
|
323
|
+
raise Exception('Unknown string format: ' + values_string)
|
324
|
+
return result
|
325
|
+
|
326
|
+
def parse_value_for_virtual_device(device, values_string):
|
327
|
+
isExist = device in values_string.keys()
|
328
|
+
if isExist and len(values_string) > 1:
|
329
|
+
if device == MULTI_DEVICE_NAME:
|
330
|
+
# Remove the element that the key is virtual device MULTI
|
331
|
+
# e.g. MULTI:xxx -nstreams 2 will set nstreams 2 to xxx.
|
332
|
+
values_string.pop(device)
|
333
|
+
elif device == AUTO_DEVICE_NAME or device == HETERO_DEVICE_NAME:
|
334
|
+
# Just keep the element that the key is virtual device AUTO/HETERO
|
335
|
+
# e.g. AUTO:xxx,xxx -nstreams 2 will trigger exception that AUTO plugin didn't support nstream property.
|
336
|
+
value = values_string.get(device)
|
337
|
+
values_string.clear()
|
338
|
+
values_string[device] = value
|
339
|
+
keys = values_string.keys()
|
340
|
+
for key in list(values_string):
|
341
|
+
if device not in list(values_string):
|
342
|
+
values_string[device] = '{'
|
343
|
+
else:
|
344
|
+
values_string[device] += ','
|
345
|
+
values_string[device] += key + ":" + values_string.get(key)
|
346
|
+
del values_string[key]
|
347
|
+
if device in values_string.keys():
|
348
|
+
values_string[device] = values_string[device].strip()
|
349
|
+
if values_string[device] != '':
|
350
|
+
values_string[device] += '}'
|
351
|
+
return
|
352
|
+
|
353
|
+
def process_help_inference_string(benchmark_app, device_number_streams):
|
354
|
+
output_string = f'Start inference {benchmark_app.api_type}hronously'
|
355
|
+
if benchmark_app.api_type == 'async':
|
356
|
+
output_string += f', {benchmark_app.nireq} inference requests'
|
357
|
+
|
358
|
+
device_ss = ''
|
359
|
+
for device, streams in device_number_streams.items():
|
360
|
+
device_ss += ', ' if device_ss else ''
|
361
|
+
device_ss += f'{streams} streams for {device}'
|
362
|
+
|
363
|
+
if device_ss:
|
364
|
+
output_string += ' using ' + device_ss
|
365
|
+
|
366
|
+
output_string += ', limits: '
|
367
|
+
|
368
|
+
if benchmark_app.duration_seconds:
|
369
|
+
output_string += f'{get_duration_in_milliseconds(benchmark_app.duration_seconds)} ms duration'
|
370
|
+
if benchmark_app.niter:
|
371
|
+
if benchmark_app.duration_seconds > 0:
|
372
|
+
output_string += ', '
|
373
|
+
output_string += f'{benchmark_app.niter} iterations'
|
374
|
+
|
375
|
+
return output_string
|
376
|
+
|
377
|
+
|
378
|
+
def dump_exec_graph(compiled_model, model_path):
|
379
|
+
serialize(compiled_model.get_runtime_model(), model_path)
|
380
|
+
|
381
|
+
def print_perf_counters_sort(perf_counts_list,sort_flag="sort"):
|
382
|
+
""" Print opts time cost and can be sorted according by each opts time cost
|
383
|
+
"""
|
384
|
+
for ni in range(len(perf_counts_list)):
|
385
|
+
perf_counts = perf_counts_list[ni]
|
386
|
+
total_time = timedelta()
|
387
|
+
total_time_cpu = timedelta()
|
388
|
+
logger.info(f"Performance counts sorted for {ni}-th infer request")
|
389
|
+
for pi in perf_counts:
|
390
|
+
total_time += pi.real_time
|
391
|
+
total_time_cpu += pi.cpu_time
|
392
|
+
|
393
|
+
total_time = total_time.microseconds
|
394
|
+
total_time_cpu = total_time_cpu.microseconds
|
395
|
+
total_real_time_proportion = 0
|
396
|
+
total_detail_data=[]
|
397
|
+
for pi in perf_counts:
|
398
|
+
node_name = pi.node_name
|
399
|
+
layerStatus = pi.status
|
400
|
+
layerType = pi.node_type
|
401
|
+
real_time = pi.real_time.microseconds
|
402
|
+
cpu_time = pi.cpu_time.microseconds
|
403
|
+
real_proportion = round(real_time/total_time,4)
|
404
|
+
execType = pi.exec_type
|
405
|
+
tmp_data=[node_name,layerStatus,layerType,real_time,cpu_time,real_proportion,execType]
|
406
|
+
total_detail_data.append(tmp_data)
|
407
|
+
total_real_time_proportion += real_proportion
|
408
|
+
total_detail_data = np.array(total_detail_data)
|
409
|
+
if sort_flag=="sort":
|
410
|
+
total_detail_data = sorted(total_detail_data,key=lambda tmp_data:tmp_data[-4],reverse=True)
|
411
|
+
elif sort_flag=="no_sort":
|
412
|
+
total_detail_data = total_detail_data
|
413
|
+
elif sort_flag=="simple_sort":
|
414
|
+
total_detail_data = sorted(total_detail_data,key=lambda tmp_data:tmp_data[-4],reverse=True)
|
415
|
+
total_detail_data = [tmp_data for tmp_data in total_detail_data if str(tmp_data[1])!="Status.NOT_RUN"]
|
416
|
+
print_detail_result(total_detail_data)
|
417
|
+
print(f'Total time: {total_time / 1000:.3f} milliseconds')
|
418
|
+
print(f'Total CPU time: {total_time_cpu / 1000:.3f} milliseconds')
|
419
|
+
print(f'Total proportion: {"%.2f"%(round(total_real_time_proportion)*100)} % \n')
|
420
|
+
return total_detail_data
|
421
|
+
|
422
|
+
def print_detail_result(result_list):
|
423
|
+
""" Print_perf_counters_sort result
|
424
|
+
"""
|
425
|
+
max_print_length = 20
|
426
|
+
for tmp_result in result_list:
|
427
|
+
node_name = tmp_result[0]
|
428
|
+
layerStatus = tmp_result[1]
|
429
|
+
layerType = tmp_result[2]
|
430
|
+
real_time = tmp_result[3]
|
431
|
+
cpu_time = tmp_result[4]
|
432
|
+
real_proportion = "%.2f" % (tmp_result[5] * 100)
|
433
|
+
if real_proportion == "0.00":
|
434
|
+
real_proportion = "N/A"
|
435
|
+
execType = tmp_result[6]
|
436
|
+
print(f"{node_name[:max_print_length - 4] + '...' if (len(node_name) >= max_print_length) else node_name:<20} "
|
437
|
+
f"{str(layerStatus):<20} "
|
438
|
+
f"layerType: {layerType[:max_print_length - 4] + '...' if (len(layerType) >= max_print_length) else layerType:<20} "
|
439
|
+
f"execType: {execType:<20} "
|
440
|
+
f"realTime (ms): {real_time / 1000:<10.3f} "
|
441
|
+
f"cpuTime (ms): {cpu_time / 1000:<10.3f}"
|
442
|
+
f"proportion: {str(real_proportion +'%'):<8}")
|
443
|
+
|
444
|
+
def print_perf_counters(perf_counts_list):
|
445
|
+
max_print_length = 20
|
446
|
+
for ni in range(len(perf_counts_list)):
|
447
|
+
perf_counts = perf_counts_list[ni]
|
448
|
+
total_time = timedelta()
|
449
|
+
total_time_cpu = timedelta()
|
450
|
+
logger.info(f"Performance counts for {ni}-th infer request")
|
451
|
+
for pi in perf_counts:
|
452
|
+
print(f"{pi.node_name[:max_print_length - 4] + '...' if (len(pi.node_name) >= max_print_length) else pi.node_name:<20} "
|
453
|
+
f"{str(pi.status):<20} "
|
454
|
+
f"layerType: {pi.node_type[:max_print_length - 4] + '...' if (len(pi.node_type) >= max_print_length) else pi.node_type:<20} "
|
455
|
+
f"execType: {pi.exec_type:<20} "
|
456
|
+
f"realTime (ms): {pi.real_time / timedelta(milliseconds=1):<10.3f} "
|
457
|
+
f"cpuTime (ms): {pi.cpu_time / timedelta(milliseconds=1):<10.3f}")
|
458
|
+
|
459
|
+
total_time += pi.real_time
|
460
|
+
total_time_cpu += pi.cpu_time
|
461
|
+
print(f'Total time: {total_time / timedelta(milliseconds=1)} milliseconds')
|
462
|
+
print(f'Total CPU time: {total_time_cpu / timedelta(milliseconds=1)} milliseconds\n')
|
463
|
+
|
464
|
+
|
465
|
+
def get_command_line_arguments(argv):
|
466
|
+
parameters = []
|
467
|
+
arg_name = ''
|
468
|
+
arg_value = ''
|
469
|
+
for arg in argv[1:]:
|
470
|
+
if '=' in arg:
|
471
|
+
if arg_name != '':
|
472
|
+
parameters.append((arg_name, arg_value))
|
473
|
+
arg_name, arg_value = arg.split('=')
|
474
|
+
parameters.append((arg_name, arg_value))
|
475
|
+
arg_name = ''
|
476
|
+
arg_value = ''
|
477
|
+
else:
|
478
|
+
if arg[0] == '-':
|
479
|
+
if arg_name != '':
|
480
|
+
parameters.append((arg_name, arg_value))
|
481
|
+
arg_value = ''
|
482
|
+
arg_name = arg
|
483
|
+
else:
|
484
|
+
arg_value = arg
|
485
|
+
if arg_name != '':
|
486
|
+
parameters.append((arg_name, arg_value))
|
487
|
+
return parameters
|
488
|
+
|
489
|
+
|
490
|
+
def get_input_output_names(ports):
|
491
|
+
return [port.any_name for port in ports]
|
492
|
+
|
493
|
+
def get_node_names(ports):
|
494
|
+
return [port.node.friendly_name for port in ports]
|
495
|
+
|
496
|
+
def get_data_shapes_map(data_shape_string, input_names):
|
497
|
+
# Parse parameter string like "input0[shape1][shape2],input1[shape1]" or "[shape1][shape2]" (applied to all inputs)
|
498
|
+
return_value = {}
|
499
|
+
if data_shape_string:
|
500
|
+
data_shape_string += ','
|
501
|
+
matches = re.findall(r'(.*?\[.*?\]),', data_shape_string)
|
502
|
+
if matches:
|
503
|
+
for match in matches:
|
504
|
+
input_name = match[:match.find('[')]
|
505
|
+
shapes = re.findall(r'\[(.*?)\]', match[len(input_name):])
|
506
|
+
if input_name:
|
507
|
+
return_value[input_name] = list(PartialShape(shape_str) for shape_str in shapes)
|
508
|
+
else:
|
509
|
+
data_shapes = list(PartialShape(shape_str) for shape_str in shapes)
|
510
|
+
num_inputs, num_shapes = len(input_names), len(data_shapes)
|
511
|
+
if num_shapes != 1 and num_shapes % num_inputs != 0:
|
512
|
+
raise Exception(f"Number of provided data_shapes is not a multiple of the number of model inputs!")
|
513
|
+
return_value = defaultdict(list)
|
514
|
+
for i in range(max(num_shapes, num_inputs)):
|
515
|
+
return_value[input_names[i % num_inputs]].append(data_shapes[i % num_shapes])
|
516
|
+
return return_value
|
517
|
+
else:
|
518
|
+
raise Exception(f"Can't parse input parameter: {data_shape_string}")
|
519
|
+
return return_value
|
520
|
+
|
521
|
+
|
522
|
+
|
523
|
+
def parse_input_parameters(parameter_string, input_names):
|
524
|
+
# Parse parameter string like "input0[value0],input1[value1]" or "[value]" (applied to all inputs)
|
525
|
+
return_value = {}
|
526
|
+
if parameter_string:
|
527
|
+
matches = re.findall(r'(.*?)\[(.*?)\],?', parameter_string)
|
528
|
+
if matches:
|
529
|
+
for match in matches:
|
530
|
+
input_name, value = match
|
531
|
+
if input_name != '':
|
532
|
+
return_value[input_name] = value
|
533
|
+
else:
|
534
|
+
return_value = { k:value for k in input_names }
|
535
|
+
break
|
536
|
+
else:
|
537
|
+
raise Exception(f"Can't parse input parameter: {parameter_string}")
|
538
|
+
return return_value
|
539
|
+
|
540
|
+
|
541
|
+
def parse_scale_or_mean(parameter_string, input_info):
|
542
|
+
# Parse parameter string like "input0[value0],input1[value1]" or "[value]" (applied to all inputs)
|
543
|
+
return_value = {}
|
544
|
+
if parameter_string:
|
545
|
+
matches = re.findall(r'(.*?)\[(.*?)\],?', parameter_string)
|
546
|
+
if matches:
|
547
|
+
for match in matches:
|
548
|
+
input_name, value = match
|
549
|
+
f_value = np.array(value.split(",")).astype(float)
|
550
|
+
if input_name != '':
|
551
|
+
return_value[input_name] = f_value
|
552
|
+
else:
|
553
|
+
for input in input_info:
|
554
|
+
if input.is_image:
|
555
|
+
return_value[input.name] = f_value
|
556
|
+
else:
|
557
|
+
raise Exception(f"Can't parse input parameter: {parameter_string}")
|
558
|
+
return return_value
|
559
|
+
|
560
|
+
class AppInputInfo:
|
561
|
+
def __init__(self):
|
562
|
+
self.element_type = None
|
563
|
+
self.layout = Layout()
|
564
|
+
self.partial_shape = None
|
565
|
+
self.data_shapes = []
|
566
|
+
self.scale = np.empty([0])
|
567
|
+
self.mean = np.empty([0])
|
568
|
+
self.name = None
|
569
|
+
self.node_name = None
|
570
|
+
|
571
|
+
@property
|
572
|
+
def is_image(self):
|
573
|
+
if str(self.layout) not in [ "[N,C,H,W]", "[N,H,W,C]", "[C,H,W]", "[H,W,C]" ]:
|
574
|
+
return False
|
575
|
+
return self.channels == 3
|
576
|
+
|
577
|
+
@property
|
578
|
+
def is_image_info(self):
|
579
|
+
if str(self.layout) != "[N,C]":
|
580
|
+
return False
|
581
|
+
return len(self.channels) >= 2 if self.channels.is_static else self.channels.relaxes(Dimension(2))
|
582
|
+
|
583
|
+
def getDimensionByLayout(self, character):
|
584
|
+
if self.layout.has_name(character):
|
585
|
+
return self.partial_shape[self.layout.get_index_by_name(character)]
|
586
|
+
else:
|
587
|
+
return Dimension(0)
|
588
|
+
|
589
|
+
def getDimensionsByLayout(self, character):
|
590
|
+
if self.layout.has_name(character):
|
591
|
+
d_index = self.layout.get_index_by_name(character)
|
592
|
+
dims = []
|
593
|
+
for shape in self.data_shapes:
|
594
|
+
dims.append(shape[d_index])
|
595
|
+
return dims
|
596
|
+
else:
|
597
|
+
return [0] * len(self.data_shapes)
|
598
|
+
|
599
|
+
@property
|
600
|
+
def shapes(self):
|
601
|
+
if self.is_static:
|
602
|
+
return [self.partial_shape.to_shape()]
|
603
|
+
else:
|
604
|
+
return self.data_shapes
|
605
|
+
|
606
|
+
@property
|
607
|
+
def width(self):
|
608
|
+
return len(self.getDimensionByLayout("W"))
|
609
|
+
|
610
|
+
@property
|
611
|
+
def widths(self):
|
612
|
+
return self.getDimensionsByLayout("W")
|
613
|
+
|
614
|
+
@property
|
615
|
+
def height(self):
|
616
|
+
return len(self.getDimensionByLayout("H"))
|
617
|
+
|
618
|
+
@property
|
619
|
+
def heights(self):
|
620
|
+
return self.getDimensionsByLayout("H")
|
621
|
+
|
622
|
+
@property
|
623
|
+
def channels(self):
|
624
|
+
return self.getDimensionByLayout("C")
|
625
|
+
|
626
|
+
@property
|
627
|
+
def is_static(self):
|
628
|
+
return self.partial_shape.is_static
|
629
|
+
|
630
|
+
@property
|
631
|
+
def is_dynamic(self):
|
632
|
+
return self.partial_shape.is_dynamic
|
633
|
+
|
634
|
+
|
635
|
+
def get_inputs_info(shape_string, data_shape_string, layout_string, batch_size, scale_string, mean_string, inputs):
|
636
|
+
input_names = get_input_output_names(inputs)
|
637
|
+
input_node_names = get_node_names(inputs)
|
638
|
+
shape_map = parse_input_parameters(shape_string, input_names)
|
639
|
+
data_shape_map = get_data_shapes_map(data_shape_string, input_names)
|
640
|
+
layout_map = parse_input_parameters(layout_string, input_names)
|
641
|
+
batch_size = Dimension(batch_size)
|
642
|
+
reshape = False
|
643
|
+
batch_found = False
|
644
|
+
input_info = []
|
645
|
+
for i in range(len(inputs)):
|
646
|
+
info = AppInputInfo()
|
647
|
+
# Input name
|
648
|
+
info.name = input_names[i]
|
649
|
+
# Input node name
|
650
|
+
info.node_name = input_node_names[i]
|
651
|
+
# Input precision
|
652
|
+
info.element_type = inputs[i].element_type
|
653
|
+
# Shape
|
654
|
+
if info.name in shape_map:
|
655
|
+
info.partial_shape = PartialShape(shape_map[info.name])
|
656
|
+
reshape = True
|
657
|
+
elif info.node_name in shape_map:
|
658
|
+
info.partial_shape = PartialShape(shape_map[info.node_name])
|
659
|
+
reshape = True
|
660
|
+
else:
|
661
|
+
info.partial_shape = inputs[i].partial_shape
|
662
|
+
|
663
|
+
# Layout
|
664
|
+
if info.name in layout_map:
|
665
|
+
info.layout = Layout(layout_map[info.name])
|
666
|
+
elif info.node_name in layout_map:
|
667
|
+
info.layout = Layout(layout_map[info.node_name])
|
668
|
+
elif inputs[i].node.layout != Layout():
|
669
|
+
info.layout = inputs[i].node.layout
|
670
|
+
else:
|
671
|
+
image_colors_dim_max = 4
|
672
|
+
shape = info.partial_shape
|
673
|
+
num_dims = len(shape)
|
674
|
+
if num_dims == 4:
|
675
|
+
if shape[1].get_max_length() <= image_colors_dim_max and shape[3].get_max_length() > image_colors_dim_max:
|
676
|
+
info.layout = Layout("NCHW")
|
677
|
+
elif shape[3].get_max_length() <= image_colors_dim_max and shape[1].get_max_length() > image_colors_dim_max:
|
678
|
+
info.layout = Layout("NHWC")
|
679
|
+
elif num_dims == 3:
|
680
|
+
if shape[0].get_max_length() <= image_colors_dim_max and shape[2].get_max_length() > image_colors_dim_max:
|
681
|
+
info.layout = Layout("CHW")
|
682
|
+
elif shape[2].get_max_length() <= image_colors_dim_max and shape[0].get_max_length() > image_colors_dim_max:
|
683
|
+
info.layout = Layout("HWC")
|
684
|
+
|
685
|
+
# Update shape with batch if needed
|
686
|
+
if batch_size != 0:
|
687
|
+
if batch_size.is_static and data_shape_map:
|
688
|
+
logger.warning(f"Batch size will be ignored. Provide batch deminsion in data_shape parameter.")
|
689
|
+
else:
|
690
|
+
batch_index = -1
|
691
|
+
if info.layout.has_name('N'):
|
692
|
+
batch_index = info.layout.get_index_by_name('N')
|
693
|
+
elif info.layout == Layout():
|
694
|
+
supposed_batch = info.partial_shape[0]
|
695
|
+
if supposed_batch.is_dynamic or supposed_batch in [0, 1]:
|
696
|
+
logger.warning(f"Batch dimension is not specified for input '{info.name}'. "
|
697
|
+
"The first dimension will be interpreted as batch size.")
|
698
|
+
batch_index = 0
|
699
|
+
info.layout = Layout("N...")
|
700
|
+
if batch_index != -1 and info.partial_shape[batch_index] != batch_size:
|
701
|
+
info.partial_shape[batch_index] = batch_size
|
702
|
+
reshape = True
|
703
|
+
batch_found = True
|
704
|
+
elif batch_index == -1 and not batch_found and i == len(inputs) - 1:
|
705
|
+
raise RuntimeError("-b option is provided in command line, but there's no inputs with batch(B) " \
|
706
|
+
"dimension in input layout, so batch cannot be set. " \
|
707
|
+
"You may specify layout explicitly using -layout option.")
|
708
|
+
|
709
|
+
# Data shape
|
710
|
+
if (info.name in data_shape_map or info.node_name in data_shape_map) and info.is_dynamic:
|
711
|
+
used_name = info.name if info.name in data_shape_map else info.node_name
|
712
|
+
for p_shape in data_shape_map[used_name]:
|
713
|
+
if p_shape.is_dynamic:
|
714
|
+
raise Exception(f"Data shape always should be static, {str(p_shape)} is dynamic.")
|
715
|
+
elif info.partial_shape.compatible(p_shape):
|
716
|
+
info.data_shapes.append(p_shape.to_shape())
|
717
|
+
else:
|
718
|
+
raise Exception(f"Data shape '{str(p_shape)}' provided for input '{info.name}' "
|
719
|
+
f"is not compatible with partial shape '{str(info.partial_shape)}' for this input.")
|
720
|
+
elif info.name in data_shape_map or input_node_names[i] in data_shape_map:
|
721
|
+
logger.warning(f"Input '{info.name}' has static shape. Provided data shapes for this input will be ignored.")
|
722
|
+
|
723
|
+
input_info.append(info)
|
724
|
+
|
725
|
+
# Update scale and mean
|
726
|
+
scale_map = parse_scale_or_mean(scale_string, input_info)
|
727
|
+
mean_map = parse_scale_or_mean(mean_string, input_info)
|
728
|
+
|
729
|
+
for input in input_info:
|
730
|
+
if input.name in scale_map:
|
731
|
+
input.scale = scale_map[input.name]
|
732
|
+
elif input.node_name in scale_map:
|
733
|
+
input.scale = scale_map[input.node_name]
|
734
|
+
if input.name in mean_map:
|
735
|
+
input.mean = mean_map[input.name]
|
736
|
+
elif input.node_name in mean_map:
|
737
|
+
input.mean = mean_map[input.node_name]
|
738
|
+
|
739
|
+
return input_info, reshape
|
740
|
+
|
741
|
+
|
742
|
+
def get_network_batch_size(inputs_info):
|
743
|
+
null_dimension = Dimension(0)
|
744
|
+
batch_size = null_dimension
|
745
|
+
for info in inputs_info:
|
746
|
+
batch_index = info.layout.get_index_by_name('N') if info.layout.has_name('N') else -1
|
747
|
+
if batch_index != -1:
|
748
|
+
if batch_size == null_dimension:
|
749
|
+
batch_size = info.partial_shape[batch_index]
|
750
|
+
elif batch_size != info.partial_shape[batch_index]:
|
751
|
+
raise Exception("Can't deterimine batch size: batch is different for different inputs!")
|
752
|
+
if batch_size == null_dimension:
|
753
|
+
batch_size = Dimension(1)
|
754
|
+
return batch_size
|
755
|
+
|
756
|
+
|
757
|
+
def show_available_devices():
|
758
|
+
print("\nAvailable target devices: ", (" ".join(Core().available_devices)))
|
759
|
+
|
760
|
+
|
761
|
+
def device_properties_to_string(config):
|
762
|
+
ret = "{"
|
763
|
+
for k, v in config.items():
|
764
|
+
if isinstance(v, dict):
|
765
|
+
sub_str = "{"
|
766
|
+
for sk, sv in v.items():
|
767
|
+
if isinstance(sv, bool):
|
768
|
+
sv = "YES" if sv else "NO"
|
769
|
+
if isinstance(sv, properties.Affinity):
|
770
|
+
sv = sv.name
|
771
|
+
sub_str += "{0}:{1},".format(sk, sv)
|
772
|
+
sub_str = sub_str[:-1]
|
773
|
+
sub_str += "}"
|
774
|
+
ret += "{0}:{1},".format(k, sub_str)
|
775
|
+
else:
|
776
|
+
ret += "{0}:{1},".format(k, v)
|
777
|
+
ret = ret[:-1]
|
778
|
+
ret += "}"
|
779
|
+
return ret
|
780
|
+
|
781
|
+
|
782
|
+
def string_to_device_properties(device_properties_str):
|
783
|
+
ret = {}
|
784
|
+
if not device_properties_str:
|
785
|
+
return ret
|
786
|
+
if not device_properties_str.startswith("{") or not device_properties_str.endswith("}"):
|
787
|
+
raise Exception(
|
788
|
+
"Failed to parse device properties. Value of device properties should be started with '{' and ended with '}'."
|
789
|
+
"They are actually {} and {}".format(device_properties_str[0], device_properties_str[-1]))
|
790
|
+
pattern = r'(\w+):({.+?}|[^,}]+)'
|
791
|
+
pairs = re.findall(pattern, device_properties_str)
|
792
|
+
for key, value in pairs:
|
793
|
+
if value.startswith("{") and value.endswith("}"):
|
794
|
+
value = value[1:-1]
|
795
|
+
nested_pairs = re.findall(pattern, value)
|
796
|
+
nested_dict = {}
|
797
|
+
for nested_key, nested_value in nested_pairs:
|
798
|
+
nested_dict[nested_key] = nested_value
|
799
|
+
value = nested_dict
|
800
|
+
ret[key] = value
|
801
|
+
return ret
|
802
|
+
|
803
|
+
|
804
|
+
def dump_config(filename, config):
|
805
|
+
json_config = {}
|
806
|
+
for device_name, device_config in config.items():
|
807
|
+
json_config[device_name] = {}
|
808
|
+
for key, value in device_config.items():
|
809
|
+
if isinstance(value, OVAny) and (isinstance(value.value, dict)):
|
810
|
+
value_string = device_properties_to_string(value.get())
|
811
|
+
elif isinstance(value, (properties.hint.PerformanceMode, properties.Affinity)):
|
812
|
+
value_string = value.name
|
813
|
+
elif isinstance(value, OVAny):
|
814
|
+
value_string = str(value.value)
|
815
|
+
else:
|
816
|
+
value_string = str(value)
|
817
|
+
if isinstance(value, bool):
|
818
|
+
value_string = "YES" if value else "NO"
|
819
|
+
json_config[device_name][key] = value_string
|
820
|
+
|
821
|
+
with open(filename, 'w') as f:
|
822
|
+
json.dump(json_config, f, indent=4)
|
823
|
+
|
824
|
+
|
825
|
+
def load_config(filename, config):
|
826
|
+
with open(filename) as f:
|
827
|
+
original_config = json.load(f)
|
828
|
+
for device in original_config:
|
829
|
+
config[device] = {}
|
830
|
+
for property_name in original_config[device]:
|
831
|
+
property_value = original_config[device][property_name]
|
832
|
+
if property_name == properties.device.properties():
|
833
|
+
property_value = string_to_device_properties(property_value)
|
834
|
+
elif property_value in ("YES", "NO"):
|
835
|
+
property_value = True if property_value == "YES" else False
|
836
|
+
config[device][property_name] = OVAny(property_value)
|