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.
Files changed (223) hide show
  1. bigdl_core_npu-2.5.0.dist-info/METADATA +35 -0
  2. bigdl_core_npu-2.5.0.dist-info/RECORD +223 -0
  3. bigdl_core_npu-2.5.0.dist-info/WHEEL +5 -0
  4. bigdl_core_npu-2.5.0.dist-info/top_level.txt +1 -0
  5. intel_npu_acceleration_library/__init__.py +24 -0
  6. intel_npu_acceleration_library/_version.py +6 -0
  7. intel_npu_acceleration_library/backend/__init__.py +37 -0
  8. intel_npu_acceleration_library/backend/base.py +215 -0
  9. intel_npu_acceleration_library/backend/bindings.py +279 -0
  10. intel_npu_acceleration_library/backend/compression.py +24 -0
  11. intel_npu_acceleration_library/backend/convolution.py +58 -0
  12. intel_npu_acceleration_library/backend/factory.py +944 -0
  13. intel_npu_acceleration_library/backend/linear.py +60 -0
  14. intel_npu_acceleration_library/backend/matmul.py +59 -0
  15. intel_npu_acceleration_library/backend/mlp.py +58 -0
  16. intel_npu_acceleration_library/backend/ops.py +141 -0
  17. intel_npu_acceleration_library/backend/qlinear.py +71 -0
  18. intel_npu_acceleration_library/backend/qmatmul.py +66 -0
  19. intel_npu_acceleration_library/backend/runtime.py +210 -0
  20. intel_npu_acceleration_library/backend/sdpa.py +107 -0
  21. intel_npu_acceleration_library/backend/tensor.py +1050 -0
  22. intel_npu_acceleration_library/backend/utils.py +70 -0
  23. intel_npu_acceleration_library/compiler.py +194 -0
  24. intel_npu_acceleration_library/device.py +230 -0
  25. intel_npu_acceleration_library/dtypes.py +122 -0
  26. intel_npu_acceleration_library/external/openvino/__init__.py +71 -0
  27. intel_npu_acceleration_library/external/openvino/_offline_transformations/__init__.py +20 -0
  28. intel_npu_acceleration_library/external/openvino/_pyopenvino.cp310-win_amd64.pyd +0 -0
  29. intel_npu_acceleration_library/external/openvino/_pyopenvino.cp311-win_amd64.pyd +0 -0
  30. intel_npu_acceleration_library/external/openvino/_pyopenvino.cp312-win_amd64.pyd +0 -0
  31. intel_npu_acceleration_library/external/openvino/_pyopenvino.cp38-win_amd64.pyd +0 -0
  32. intel_npu_acceleration_library/external/openvino/_pyopenvino.cp39-win_amd64.pyd +0 -0
  33. intel_npu_acceleration_library/external/openvino/frontend/__init__.py +34 -0
  34. intel_npu_acceleration_library/external/openvino/frontend/frontend.py +44 -0
  35. intel_npu_acceleration_library/external/openvino/frontend/onnx/__init__.py +15 -0
  36. intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp310-win_amd64.pyd +0 -0
  37. intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp311-win_amd64.pyd +0 -0
  38. intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp312-win_amd64.pyd +0 -0
  39. intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp38-win_amd64.pyd +0 -0
  40. intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp39-win_amd64.pyd +0 -0
  41. intel_npu_acceleration_library/external/openvino/frontend/paddle/__init__.py +15 -0
  42. intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp310-win_amd64.pyd +0 -0
  43. intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp311-win_amd64.pyd +0 -0
  44. intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp312-win_amd64.pyd +0 -0
  45. intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp38-win_amd64.pyd +0 -0
  46. intel_npu_acceleration_library/external/openvino/frontend/paddle/py_paddle_frontend.cp39-win_amd64.pyd +0 -0
  47. intel_npu_acceleration_library/external/openvino/frontend/pytorch/__init__.py +19 -0
  48. intel_npu_acceleration_library/external/openvino/frontend/pytorch/fx_decoder.py +352 -0
  49. intel_npu_acceleration_library/external/openvino/frontend/pytorch/gptq.py +139 -0
  50. intel_npu_acceleration_library/external/openvino/frontend/pytorch/module_extension.py +39 -0
  51. intel_npu_acceleration_library/external/openvino/frontend/pytorch/patch_model.py +98 -0
  52. intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp310-win_amd64.pyd +0 -0
  53. intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp311-win_amd64.pyd +0 -0
  54. intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp312-win_amd64.pyd +0 -0
  55. intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp38-win_amd64.pyd +0 -0
  56. intel_npu_acceleration_library/external/openvino/frontend/pytorch/py_pytorch_frontend.cp39-win_amd64.pyd +0 -0
  57. intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/backend.py +119 -0
  58. intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/backend_utils.py +85 -0
  59. intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/compile.py +141 -0
  60. intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/decompositions.py +116 -0
  61. intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/execute.py +189 -0
  62. intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/op_support.py +289 -0
  63. intel_npu_acceleration_library/external/openvino/frontend/pytorch/torchdynamo/partition.py +118 -0
  64. intel_npu_acceleration_library/external/openvino/frontend/pytorch/ts_decoder.py +536 -0
  65. intel_npu_acceleration_library/external/openvino/frontend/pytorch/utils.py +256 -0
  66. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/__init__.py +16 -0
  67. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/graph_iterator.py +116 -0
  68. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/node_decoder.py +219 -0
  69. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp310-win_amd64.pyd +0 -0
  70. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp311-win_amd64.pyd +0 -0
  71. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp312-win_amd64.pyd +0 -0
  72. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp38-win_amd64.pyd +0 -0
  73. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/py_tensorflow_frontend.cp39-win_amd64.pyd +0 -0
  74. intel_npu_acceleration_library/external/openvino/frontend/tensorflow/utils.py +460 -0
  75. intel_npu_acceleration_library/external/openvino/helpers/__init__.py +6 -0
  76. intel_npu_acceleration_library/external/openvino/helpers/packing.py +87 -0
  77. intel_npu_acceleration_library/external/openvino/preprocess/README.md +60 -0
  78. intel_npu_acceleration_library/external/openvino/preprocess/__init__.py +26 -0
  79. intel_npu_acceleration_library/external/openvino/preprocess/torchvision/__init__.py +15 -0
  80. intel_npu_acceleration_library/external/openvino/preprocess/torchvision/preprocess_converter.py +47 -0
  81. intel_npu_acceleration_library/external/openvino/preprocess/torchvision/requirements.txt +4 -0
  82. intel_npu_acceleration_library/external/openvino/preprocess/torchvision/torchvision_preprocessing.py +347 -0
  83. intel_npu_acceleration_library/external/openvino/properties/__init__.py +21 -0
  84. intel_npu_acceleration_library/external/openvino/properties/_properties.py +55 -0
  85. intel_npu_acceleration_library/external/openvino/properties/device/__init__.py +14 -0
  86. intel_npu_acceleration_library/external/openvino/properties/hint/__init__.py +15 -0
  87. intel_npu_acceleration_library/external/openvino/properties/intel_auto/__init__.py +12 -0
  88. intel_npu_acceleration_library/external/openvino/properties/intel_cpu/__init__.py +8 -0
  89. intel_npu_acceleration_library/external/openvino/properties/intel_gpu/__init__.py +12 -0
  90. intel_npu_acceleration_library/external/openvino/properties/intel_gpu/hint/__init__.py +11 -0
  91. intel_npu_acceleration_library/external/openvino/properties/log/__init__.py +11 -0
  92. intel_npu_acceleration_library/external/openvino/properties/streams/__init__.py +11 -0
  93. intel_npu_acceleration_library/external/openvino/runtime/__init__.py +85 -0
  94. intel_npu_acceleration_library/external/openvino/runtime/exceptions.py +17 -0
  95. intel_npu_acceleration_library/external/openvino/runtime/ie_api.py +631 -0
  96. intel_npu_acceleration_library/external/openvino/runtime/op/__init__.py +18 -0
  97. intel_npu_acceleration_library/external/openvino/runtime/op/util/__init__.py +22 -0
  98. intel_npu_acceleration_library/external/openvino/runtime/opset1/__init__.py +112 -0
  99. intel_npu_acceleration_library/external/openvino/runtime/opset1/ops.py +3067 -0
  100. intel_npu_acceleration_library/external/openvino/runtime/opset10/__init__.py +179 -0
  101. intel_npu_acceleration_library/external/openvino/runtime/opset10/ops.py +173 -0
  102. intel_npu_acceleration_library/external/openvino/runtime/opset11/__init__.py +179 -0
  103. intel_npu_acceleration_library/external/openvino/runtime/opset11/ops.py +107 -0
  104. intel_npu_acceleration_library/external/openvino/runtime/opset12/__init__.py +180 -0
  105. intel_npu_acceleration_library/external/openvino/runtime/opset12/ops.py +120 -0
  106. intel_npu_acceleration_library/external/openvino/runtime/opset13/__init__.py +188 -0
  107. intel_npu_acceleration_library/external/openvino/runtime/opset13/ops.py +399 -0
  108. intel_npu_acceleration_library/external/openvino/runtime/opset14/__init__.py +190 -0
  109. intel_npu_acceleration_library/external/openvino/runtime/opset14/ops.py +171 -0
  110. intel_npu_acceleration_library/external/openvino/runtime/opset15/__init__.py +10 -0
  111. intel_npu_acceleration_library/external/openvino/runtime/opset15/ops.py +85 -0
  112. intel_npu_acceleration_library/external/openvino/runtime/opset2/__init__.py +118 -0
  113. intel_npu_acceleration_library/external/openvino/runtime/opset2/ops.py +216 -0
  114. intel_npu_acceleration_library/external/openvino/runtime/opset3/__init__.py +134 -0
  115. intel_npu_acceleration_library/external/openvino/runtime/opset3/ops.py +638 -0
  116. intel_npu_acceleration_library/external/openvino/runtime/opset4/__init__.py +145 -0
  117. intel_npu_acceleration_library/external/openvino/runtime/opset4/ops.py +464 -0
  118. intel_npu_acceleration_library/external/openvino/runtime/opset5/__init__.py +152 -0
  119. intel_npu_acceleration_library/external/openvino/runtime/opset5/ops.py +372 -0
  120. intel_npu_acceleration_library/external/openvino/runtime/opset6/__init__.py +154 -0
  121. intel_npu_acceleration_library/external/openvino/runtime/opset6/ops.py +189 -0
  122. intel_npu_acceleration_library/external/openvino/runtime/opset7/__init__.py +158 -0
  123. intel_npu_acceleration_library/external/openvino/runtime/opset7/ops.py +169 -0
  124. intel_npu_acceleration_library/external/openvino/runtime/opset8/__init__.py +169 -0
  125. intel_npu_acceleration_library/external/openvino/runtime/opset8/ops.py +783 -0
  126. intel_npu_acceleration_library/external/openvino/runtime/opset9/__init__.py +175 -0
  127. intel_npu_acceleration_library/external/openvino/runtime/opset9/ops.py +341 -0
  128. intel_npu_acceleration_library/external/openvino/runtime/opset_utils.py +22 -0
  129. intel_npu_acceleration_library/external/openvino/runtime/passes/__init__.py +19 -0
  130. intel_npu_acceleration_library/external/openvino/runtime/passes/graph_rewrite.py +33 -0
  131. intel_npu_acceleration_library/external/openvino/runtime/passes/manager.py +26 -0
  132. intel_npu_acceleration_library/external/openvino/runtime/properties/__init__.py +38 -0
  133. intel_npu_acceleration_library/external/openvino/runtime/properties/hint/__init__.py +25 -0
  134. intel_npu_acceleration_library/external/openvino/runtime/utils/__init__.py +7 -0
  135. intel_npu_acceleration_library/external/openvino/runtime/utils/broadcasting.py +44 -0
  136. intel_npu_acceleration_library/external/openvino/runtime/utils/data_helpers/__init__.py +8 -0
  137. intel_npu_acceleration_library/external/openvino/runtime/utils/data_helpers/data_dispatcher.py +429 -0
  138. intel_npu_acceleration_library/external/openvino/runtime/utils/data_helpers/wrappers.py +148 -0
  139. intel_npu_acceleration_library/external/openvino/runtime/utils/decorators.py +70 -0
  140. intel_npu_acceleration_library/external/openvino/runtime/utils/input_validation.py +133 -0
  141. intel_npu_acceleration_library/external/openvino/runtime/utils/node_factory.py +127 -0
  142. intel_npu_acceleration_library/external/openvino/runtime/utils/reduction.py +25 -0
  143. intel_npu_acceleration_library/external/openvino/runtime/utils/types.py +175 -0
  144. intel_npu_acceleration_library/external/openvino/tools/__init__.py +4 -0
  145. intel_npu_acceleration_library/external/openvino/tools/benchmark/__init__.py +3 -0
  146. intel_npu_acceleration_library/external/openvino/tools/benchmark/benchmark.py +186 -0
  147. intel_npu_acceleration_library/external/openvino/tools/benchmark/main.py +695 -0
  148. intel_npu_acceleration_library/external/openvino/tools/benchmark/parameters.py +199 -0
  149. intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/__init__.py +3 -0
  150. intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/constants.py +26 -0
  151. intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/inputs_filling.py +482 -0
  152. intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/logging.py +8 -0
  153. intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/statistics_report.py +296 -0
  154. intel_npu_acceleration_library/external/openvino/tools/benchmark/utils/utils.py +836 -0
  155. intel_npu_acceleration_library/external/openvino/tools/ovc/__init__.py +20 -0
  156. intel_npu_acceleration_library/external/openvino/tools/ovc/__main__.py +10 -0
  157. intel_npu_acceleration_library/external/openvino/tools/ovc/cli_parser.py +633 -0
  158. intel_npu_acceleration_library/external/openvino/tools/ovc/convert.py +102 -0
  159. intel_npu_acceleration_library/external/openvino/tools/ovc/convert_data_type.py +82 -0
  160. intel_npu_acceleration_library/external/openvino/tools/ovc/convert_impl.py +536 -0
  161. intel_npu_acceleration_library/external/openvino/tools/ovc/environment_setup_utils.py +50 -0
  162. intel_npu_acceleration_library/external/openvino/tools/ovc/error.py +49 -0
  163. intel_npu_acceleration_library/external/openvino/tools/ovc/get_ov_update_message.py +16 -0
  164. intel_npu_acceleration_library/external/openvino/tools/ovc/help.py +45 -0
  165. intel_npu_acceleration_library/external/openvino/tools/ovc/logger.py +91 -0
  166. intel_npu_acceleration_library/external/openvino/tools/ovc/main.py +35 -0
  167. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/__init__.py +2 -0
  168. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/analysis.py +46 -0
  169. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/check_config.py +57 -0
  170. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/extractor.py +447 -0
  171. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/layout_utils.py +73 -0
  172. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/moc_emit_ir.py +32 -0
  173. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/offline_transformations.py +107 -0
  174. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/paddle_frontend_utils.py +83 -0
  175. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/pipeline.py +246 -0
  176. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/preprocessing.py +220 -0
  177. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/pytorch_frontend_utils.py +205 -0
  178. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/shape_utils.py +109 -0
  179. intel_npu_acceleration_library/external/openvino/tools/ovc/moc_frontend/type_utils.py +82 -0
  180. intel_npu_acceleration_library/external/openvino/tools/ovc/ovc.py +13 -0
  181. intel_npu_acceleration_library/external/openvino/tools/ovc/telemetry_params.py +6 -0
  182. intel_npu_acceleration_library/external/openvino/tools/ovc/telemetry_stub.py +28 -0
  183. intel_npu_acceleration_library/external/openvino/tools/ovc/telemetry_utils.py +118 -0
  184. intel_npu_acceleration_library/external/openvino/tools/ovc/utils.py +109 -0
  185. intel_npu_acceleration_library/external/openvino/tools/ovc/version.py +80 -0
  186. intel_npu_acceleration_library/external/openvino/torch/__init__.py +5 -0
  187. intel_npu_acceleration_library/external/openvino/utils.py +98 -0
  188. intel_npu_acceleration_library/functional/__init__.py +8 -0
  189. intel_npu_acceleration_library/functional/scaled_dot_product_attention.py +47 -0
  190. intel_npu_acceleration_library/lib/Release/cache.json +113732 -0
  191. intel_npu_acceleration_library/lib/Release/intel_npu_acceleration_library.dll +0 -0
  192. intel_npu_acceleration_library/lib/Release/openvino.dll +0 -0
  193. intel_npu_acceleration_library/lib/Release/openvino_auto_batch_plugin.dll +0 -0
  194. intel_npu_acceleration_library/lib/Release/openvino_auto_plugin.dll +0 -0
  195. intel_npu_acceleration_library/lib/Release/openvino_c.dll +0 -0
  196. intel_npu_acceleration_library/lib/Release/openvino_hetero_plugin.dll +0 -0
  197. intel_npu_acceleration_library/lib/Release/openvino_intel_cpu_plugin.dll +0 -0
  198. intel_npu_acceleration_library/lib/Release/openvino_intel_gpu_plugin.dll +0 -0
  199. intel_npu_acceleration_library/lib/Release/openvino_intel_npu_plugin.dll +0 -0
  200. intel_npu_acceleration_library/lib/Release/openvino_ir_frontend.dll +0 -0
  201. intel_npu_acceleration_library/lib/Release/openvino_onnx_frontend.dll +0 -0
  202. intel_npu_acceleration_library/lib/Release/openvino_paddle_frontend.dll +0 -0
  203. intel_npu_acceleration_library/lib/Release/openvino_pytorch_frontend.dll +0 -0
  204. intel_npu_acceleration_library/lib/Release/openvino_tensorflow_frontend.dll +0 -0
  205. intel_npu_acceleration_library/lib/Release/openvino_tensorflow_lite_frontend.dll +0 -0
  206. intel_npu_acceleration_library/lib/Release/tbb12.dll +0 -0
  207. intel_npu_acceleration_library/lib/Release/tbb12_debug.dll +0 -0
  208. intel_npu_acceleration_library/lib/Release/tbbbind_2_5.dll +0 -0
  209. intel_npu_acceleration_library/lib/Release/tbbbind_2_5_debug.dll +0 -0
  210. intel_npu_acceleration_library/lib/Release/tbbmalloc.dll +0 -0
  211. intel_npu_acceleration_library/lib/Release/tbbmalloc_debug.dll +0 -0
  212. intel_npu_acceleration_library/lib/Release/tbbmalloc_proxy.dll +0 -0
  213. intel_npu_acceleration_library/lib/Release/tbbmalloc_proxy_debug.dll +0 -0
  214. intel_npu_acceleration_library/modelling.py +150 -0
  215. intel_npu_acceleration_library/nn/__init__.py +20 -0
  216. intel_npu_acceleration_library/nn/autograd.py +68 -0
  217. intel_npu_acceleration_library/nn/conv.py +257 -0
  218. intel_npu_acceleration_library/nn/functional.py +1207 -0
  219. intel_npu_acceleration_library/nn/linear.py +162 -0
  220. intel_npu_acceleration_library/nn/llm.py +417 -0
  221. intel_npu_acceleration_library/nn/module.py +393 -0
  222. intel_npu_acceleration_library/optimizations.py +157 -0
  223. 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)