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,34 @@
|
|
1
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
"""
|
5
|
+
Package: openvino
|
6
|
+
Low level wrappers for the FrontEnd C++ API.
|
7
|
+
"""
|
8
|
+
|
9
|
+
# flake8: noqa
|
10
|
+
|
11
|
+
from openvino._pyopenvino import get_version
|
12
|
+
|
13
|
+
__version__ = get_version()
|
14
|
+
|
15
|
+
# main classes
|
16
|
+
from openvino.frontend.frontend import FrontEndManager
|
17
|
+
from openvino.frontend.frontend import FrontEnd
|
18
|
+
from openvino._pyopenvino import InputModel
|
19
|
+
from openvino._pyopenvino import NodeContext
|
20
|
+
from openvino._pyopenvino import Place
|
21
|
+
|
22
|
+
# extensions
|
23
|
+
from openvino._pyopenvino import DecoderTransformationExtension
|
24
|
+
from openvino._pyopenvino import ConversionExtension
|
25
|
+
from openvino._pyopenvino import OpExtension
|
26
|
+
from openvino._pyopenvino import ProgressReporterExtension
|
27
|
+
from openvino._pyopenvino import TelemetryExtension
|
28
|
+
|
29
|
+
# exceptions
|
30
|
+
from openvino._pyopenvino import NotImplementedFailure
|
31
|
+
from openvino._pyopenvino import InitializationFailure
|
32
|
+
from openvino._pyopenvino import OpConversionFailure
|
33
|
+
from openvino._pyopenvino import OpValidationFailure
|
34
|
+
from openvino._pyopenvino import GeneralFailure
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
4
|
+
|
5
|
+
from typing import Union
|
6
|
+
|
7
|
+
from openvino._pyopenvino import FrontEnd as FrontEndBase
|
8
|
+
from openvino._pyopenvino import FrontEndManager as FrontEndManagerBase
|
9
|
+
from openvino._pyopenvino import InputModel
|
10
|
+
from openvino.runtime import Model
|
11
|
+
|
12
|
+
|
13
|
+
class FrontEnd(FrontEndBase):
|
14
|
+
def __init__(self, fe: FrontEndBase) -> None:
|
15
|
+
super().__init__(fe)
|
16
|
+
|
17
|
+
def convert(self, model: Union[Model, InputModel]) -> Model:
|
18
|
+
converted_model = super().convert(model)
|
19
|
+
if isinstance(model, InputModel):
|
20
|
+
return Model(converted_model)
|
21
|
+
return converted_model
|
22
|
+
|
23
|
+
def convert_partially(self, model: InputModel) -> Model:
|
24
|
+
return Model(super().convert_partially(model))
|
25
|
+
|
26
|
+
def decode(self, model: InputModel) -> Model:
|
27
|
+
return Model(super().decode(model))
|
28
|
+
|
29
|
+
def normalize(self, model: Model) -> None:
|
30
|
+
super().normalize(model)
|
31
|
+
|
32
|
+
|
33
|
+
class FrontEndManager(FrontEndManagerBase):
|
34
|
+
def load_by_framework(self, framework: str) -> Union[FrontEnd, None]:
|
35
|
+
fe = super().load_by_framework(framework)
|
36
|
+
if fe is not None:
|
37
|
+
return FrontEnd(fe)
|
38
|
+
return fe
|
39
|
+
|
40
|
+
def load_by_model(self, model: str) -> Union[FrontEnd, None]:
|
41
|
+
fe = super().load_by_model(model)
|
42
|
+
if fe is not None:
|
43
|
+
return FrontEnd(fe)
|
44
|
+
return fe
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
"""
|
5
|
+
Package: openvino
|
6
|
+
Low level wrappers for the FrontEnd C++ API.
|
7
|
+
"""
|
8
|
+
|
9
|
+
# flake8: noqa
|
10
|
+
|
11
|
+
try:
|
12
|
+
from openvino.frontend.onnx.py_onnx_frontend import ConversionExtensionONNX as ConversionExtension
|
13
|
+
from openvino.frontend.onnx.py_onnx_frontend import OpExtensionONNX as OpExtension
|
14
|
+
except ImportError as err:
|
15
|
+
raise ImportError("OpenVINO ONNX frontend is not available, please make sure the frontend is built. " "{}".format(err))
|
intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp310-win_amd64.pyd
ADDED
Binary file
|
intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp311-win_amd64.pyd
ADDED
Binary file
|
intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp312-win_amd64.pyd
ADDED
Binary file
|
intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp38-win_amd64.pyd
ADDED
Binary file
|
intel_npu_acceleration_library/external/openvino/frontend/onnx/py_onnx_frontend.cp39-win_amd64.pyd
ADDED
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
"""
|
5
|
+
Package: openvino
|
6
|
+
Low level wrappers for the FrontEnd C++ API.
|
7
|
+
"""
|
8
|
+
|
9
|
+
# flake8: noqa
|
10
|
+
|
11
|
+
try:
|
12
|
+
from openvino.frontend.paddle.py_paddle_frontend import ConversionExtensionPaddle as ConversionExtension
|
13
|
+
from openvino.frontend.paddle.py_paddle_frontend import OpExtensionPaddle as OpExtension
|
14
|
+
except ImportError as err:
|
15
|
+
raise ImportError("OpenVINO Paddle frontend is not available, please make sure the frontend is built." "{}".format(err))
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
"""
|
5
|
+
Package: openvino
|
6
|
+
Low level wrappers for the FrontEnd C++ API.
|
7
|
+
"""
|
8
|
+
|
9
|
+
# flake8: noqa
|
10
|
+
|
11
|
+
try:
|
12
|
+
from openvino.frontend.pytorch.py_pytorch_frontend import _FrontEndPytorchDecoder as Decoder
|
13
|
+
from openvino.frontend.pytorch.py_pytorch_frontend import _Type as DecoderType
|
14
|
+
from openvino.frontend.pytorch.py_pytorch_frontend import ConversionExtensionPytorch as ConversionExtension
|
15
|
+
from openvino.frontend.pytorch.py_pytorch_frontend import OpExtensionPytorch as OpExtension
|
16
|
+
from openvino.frontend.pytorch.module_extension import ModuleExtension
|
17
|
+
except ImportError as err:
|
18
|
+
raise ImportError("OpenVINO PyTorch frontend is not available, please make sure the frontend is built."
|
19
|
+
"{}".format(err))
|
@@ -0,0 +1,352 @@
|
|
1
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
# flake8: noqa
|
5
|
+
# mypy: ignore-errors
|
6
|
+
|
7
|
+
from openvino.frontend.pytorch.py_pytorch_frontend import _FrontEndPytorchDecoder as Decoder
|
8
|
+
from openvino.frontend.pytorch.py_pytorch_frontend import _Type as DecoderType
|
9
|
+
from openvino.runtime import op, PartialShape, Type as OVType, OVAny, Shape
|
10
|
+
from openvino.frontend.pytorch.utils import make_constant, fetch_attr, pt_to_ov_type_map, torch_tensor_to_ov_const
|
11
|
+
|
12
|
+
import torch
|
13
|
+
|
14
|
+
import logging
|
15
|
+
logger = logging.getLogger(__name__)
|
16
|
+
logger.setLevel(logging.WARNING)
|
17
|
+
|
18
|
+
|
19
|
+
class TorchFXPythonDecoder (Decoder):
|
20
|
+
|
21
|
+
def __init__(self, pt_module, fx_gm=None, nodes=None, mark_node_callback=None, input_shapes=[], input_types=[]):
|
22
|
+
Decoder.__init__(self)
|
23
|
+
self.mark_node_callback = mark_node_callback
|
24
|
+
# We store every decoder created by this decoder so that all them are not deleted until the first decoder is deleted
|
25
|
+
self.m_decoders = []
|
26
|
+
self.pt_module = pt_module
|
27
|
+
self.fx_gm = fx_gm if fx_gm is not None else pt_module
|
28
|
+
self.input_types = [OVAny(pt_to_ov_type_map[str(t)])
|
29
|
+
for t in input_types]
|
30
|
+
self.input_shapes = input_shapes
|
31
|
+
|
32
|
+
self._input_signature = []
|
33
|
+
|
34
|
+
if issubclass(type(pt_module), torch.fx.graph_module.GraphModule):
|
35
|
+
|
36
|
+
self._input_is_list = None
|
37
|
+
self._nodes = list(pt_module.graph.nodes)
|
38
|
+
self._inputs = []
|
39
|
+
self._outputs = []
|
40
|
+
found_types = []
|
41
|
+
found_shapes = []
|
42
|
+
for i in range(len(self._nodes)):
|
43
|
+
if self._nodes[i].op == 'placeholder':
|
44
|
+
self._inputs.append(i)
|
45
|
+
value = self._nodes[i]
|
46
|
+
self._input_signature.append(value.name)
|
47
|
+
if hasattr(value, "meta") and ('tensor_meta' in value.meta.keys()) and value.meta['tensor_meta']:
|
48
|
+
found_shapes.append(value.meta['tensor_meta'].shape)
|
49
|
+
found_types.append(
|
50
|
+
OVAny(pt_to_ov_type_map[str(value.meta['tensor_meta'].dtype)]))
|
51
|
+
else:
|
52
|
+
found_shapes.append(None)
|
53
|
+
found_types.append(None)
|
54
|
+
elif self._nodes[i].op == 'output':
|
55
|
+
# Instead of putting output index, refer to its target
|
56
|
+
uargs = self.unpack_containers(self._nodes[i].args)
|
57
|
+
self._outputs = [(arg[0], self._nodes.index(arg[1]))
|
58
|
+
for arg in uargs if arg[1] is not None]
|
59
|
+
for idx, shape in enumerate(found_shapes):
|
60
|
+
if shape is not None:
|
61
|
+
new_shape=[]
|
62
|
+
for dim in range(0, len(shape)):
|
63
|
+
if (type(shape[dim]).__name__ == "SymInt"):
|
64
|
+
new_shape.append(-1)
|
65
|
+
else:
|
66
|
+
new_shape.append(shape[dim])
|
67
|
+
found_shapes[idx] = torch.Size(new_shape)
|
68
|
+
|
69
|
+
if not input_shapes or len(input_shapes) == 0:
|
70
|
+
self.input_shapes = found_shapes
|
71
|
+
if not input_types or len(input_types) == 0:
|
72
|
+
self.input_types = found_types
|
73
|
+
|
74
|
+
elif issubclass(type(pt_module), torch.fx.Node):
|
75
|
+
|
76
|
+
self._nodes = nodes # passed from outer context
|
77
|
+
|
78
|
+
# FIXME: Quadratic complexity nodes*nodes considering the outer loop over all nodes
|
79
|
+
self._outputs = [("", self._nodes.index(pt_module))]
|
80
|
+
|
81
|
+
# None in inputs mean the input is inlined or None (also considered inlined)
|
82
|
+
self._inputs = [self._nodes.index(
|
83
|
+
arg) if arg in self._nodes else (arg,) for arg in pt_module.args]
|
84
|
+
|
85
|
+
# FIXME: Find a better way to pass nested tuples to OV frontend. This is a temporary solution to flatten arguments.
|
86
|
+
new_inputs = []
|
87
|
+
self.input_types = []
|
88
|
+
for i in range(len(pt_module.args)):
|
89
|
+
if isinstance(pt_module.args[i], (list, tuple)) and any([isinstance(a, torch.fx.Node) for a in pt_module.args[i]]):
|
90
|
+
for arg in pt_module.args[i]:
|
91
|
+
if arg in self._nodes:
|
92
|
+
new_inputs.append(self._nodes.index(arg))
|
93
|
+
else:
|
94
|
+
new_inputs.append((arg,))
|
95
|
+
self.input_types.append(OVAny(DecoderType.List(
|
96
|
+
TorchFXPythonDecoder.get_type_for_value(arg))))
|
97
|
+
else:
|
98
|
+
v = self._inputs[i]
|
99
|
+
new_inputs.append(v)
|
100
|
+
self.input_types.append(
|
101
|
+
TorchFXPythonDecoder.get_type_for_value(v[0] if isinstance(v, tuple) else self._nodes[v]))
|
102
|
+
self._inputs = new_inputs
|
103
|
+
|
104
|
+
def inputs(self):
|
105
|
+
# Consider 0 a special case which may mean the input is inlined, but not guaranteed
|
106
|
+
return [x if not isinstance(x, tuple) else 0 for x in self._inputs]
|
107
|
+
|
108
|
+
def is_input_inlined(self, index):
|
109
|
+
return isinstance(self._inputs[index], tuple)
|
110
|
+
|
111
|
+
@staticmethod
|
112
|
+
def unpack_containers(arg):
|
113
|
+
if isinstance(arg, (tuple, list)):
|
114
|
+
res = []
|
115
|
+
for e in arg:
|
116
|
+
res.extend(TorchFXPythonDecoder.unpack_containers(e))
|
117
|
+
return res
|
118
|
+
elif isinstance(arg, dict):
|
119
|
+
res = []
|
120
|
+
for k, e in arg.items():
|
121
|
+
unpacked = TorchFXPythonDecoder.unpack_containers(e)
|
122
|
+
if len(unpacked) == 1:
|
123
|
+
unpacked[0] = (k, unpacked[0][1])
|
124
|
+
res.extend(unpacked)
|
125
|
+
return res
|
126
|
+
else:
|
127
|
+
return [("", arg)]
|
128
|
+
|
129
|
+
@staticmethod
|
130
|
+
def arg_to_constant(arg):
|
131
|
+
if isinstance(arg, list):
|
132
|
+
if len(arg) > 0:
|
133
|
+
return make_constant(pt_to_ov_type_map[type(
|
134
|
+
arg[0]).__name__], Shape([len(arg)]), arg)
|
135
|
+
else:
|
136
|
+
# TODO: which type should we use if list is empty? Need a signaling value here
|
137
|
+
return make_constant(OVType.i32, Shape([0]), [])
|
138
|
+
elif isinstance(arg, bool):
|
139
|
+
return make_constant(OVType.boolean, Shape([]), [arg])
|
140
|
+
elif isinstance(arg, int):
|
141
|
+
return make_constant(OVType.i64, Shape([]), [arg])
|
142
|
+
elif isinstance(arg, float):
|
143
|
+
return make_constant(OVType.f32, Shape([]), [arg])
|
144
|
+
return None
|
145
|
+
|
146
|
+
def inlined_input(self, index):
|
147
|
+
assert index < len(self._inputs), "Requested input doesn't exist"
|
148
|
+
assert isinstance(
|
149
|
+
self._inputs[index], tuple), "Requested input which is not inlined"
|
150
|
+
assert self._inputs[index][0] is not None, "Requested None inlined input"
|
151
|
+
constant = None
|
152
|
+
arg = self._inputs[index][0]
|
153
|
+
constant = self.arg_to_constant(arg)
|
154
|
+
|
155
|
+
assert constant is not None, f"Constant wasn't created for inlined input {index}"
|
156
|
+
return constant.outputs()
|
157
|
+
|
158
|
+
def input(self, index): # TODO: remove
|
159
|
+
return self.inputs()[index] # TODO: find specialized method
|
160
|
+
|
161
|
+
def get_input_debug_name(self, index):
|
162
|
+
return "input"+str(index)
|
163
|
+
|
164
|
+
def get_input_signature_name(self, index: int) -> str:
|
165
|
+
if self._input_signature is not None and index < len(self._input_signature):
|
166
|
+
return self._input_signature[index]
|
167
|
+
return self.get_input_debug_name(index)
|
168
|
+
|
169
|
+
def get_input_shape(self, index):
|
170
|
+
if index < len(self.input_shapes) and self.input_shapes[index] is not None:
|
171
|
+
return PartialShape(self.input_shapes[index])
|
172
|
+
input = self._raw_input(index)
|
173
|
+
return self.get_shape_for_value(input)
|
174
|
+
|
175
|
+
def get_input_strides(self, index: int) -> list:
|
176
|
+
raw_input = self._raw_input(index)
|
177
|
+
if isinstance(raw_input, torch.fx.node.Node) and hasattr(raw_input, "meta"):
|
178
|
+
meta = raw_input.meta
|
179
|
+
if "tensor_meta" in meta and hasattr(meta["tensor_meta"], "stride"):
|
180
|
+
strides = list(meta["tensor_meta"].stride)
|
181
|
+
if strides:
|
182
|
+
return strides
|
183
|
+
return []
|
184
|
+
|
185
|
+
def get_input_type(self, index):
|
186
|
+
if index < len(self.input_types) and self.input_types[index] is not None:
|
187
|
+
return self.input_types[index]
|
188
|
+
input = self._raw_input(index)
|
189
|
+
return self.get_type_for_value(input)
|
190
|
+
|
191
|
+
def get_output_debug_name(self, index):
|
192
|
+
if self._outputs is not None and index < len(self._outputs) and self._outputs[index][0]:
|
193
|
+
return self._outputs[index][0]
|
194
|
+
name = getattr(self.pt_module, "name", "output")
|
195
|
+
return name + ":" + str(index)
|
196
|
+
|
197
|
+
def get_output_shape(self, index):
|
198
|
+
output = self._raw_output(index)
|
199
|
+
return self.get_shape_for_value(output)
|
200
|
+
|
201
|
+
def get_output_type(self, index):
|
202
|
+
output = self._raw_output(index)
|
203
|
+
return self.get_type_for_value(output)
|
204
|
+
|
205
|
+
def get_shape_for_value(self, value):
|
206
|
+
if value and hasattr(value, "meta") and ('tensor_meta' in value.meta.keys()):
|
207
|
+
if value.meta['tensor_meta']:
|
208
|
+
return PartialShape(len(value.meta['tensor_meta'].shape) * [-1])
|
209
|
+
return PartialShape.dynamic()
|
210
|
+
|
211
|
+
@staticmethod
|
212
|
+
def get_type_for_value(value):
|
213
|
+
if issubclass(type(value), torch.fx.Node):
|
214
|
+
if ('tensor_meta' in value.meta.keys()):
|
215
|
+
if value.meta['tensor_meta'] and isinstance(value.meta['tensor_meta'], torch.Tensor):
|
216
|
+
pt_type = value.meta['tensor_meta'].dtype
|
217
|
+
if str(pt_type) in pt_to_ov_type_map:
|
218
|
+
ov_type = pt_to_ov_type_map[str(pt_type)]
|
219
|
+
return OVAny(ov_type)
|
220
|
+
return OVAny(OVType.dynamic)
|
221
|
+
elif isinstance(value, int):
|
222
|
+
return OVAny(DecoderType.PyScalar(OVAny(OVType.i64)))
|
223
|
+
elif isinstance(value, float):
|
224
|
+
return OVAny(DecoderType.PyScalar(OVAny(OVType.f32)))
|
225
|
+
elif isinstance(value, bool):
|
226
|
+
return OVAny(DecoderType.PyScalar(OVAny(OVType.boolean)))
|
227
|
+
return OVAny(OVType.dynamic)
|
228
|
+
|
229
|
+
def get_attribute(self, name):
|
230
|
+
if name in self.pt_module.kwargs:
|
231
|
+
attr = self.pt_module.kwargs[name]
|
232
|
+
if isinstance(attr, torch.dtype):
|
233
|
+
return OVAny(pt_to_ov_type_map[str(attr)])
|
234
|
+
if isinstance(attr, torch.device):
|
235
|
+
return OVAny(attr.type)
|
236
|
+
if isinstance(attr, str):
|
237
|
+
return OVAny(attr)
|
238
|
+
# Numeric attrs convert to Constant
|
239
|
+
constant = self.arg_to_constant(attr)
|
240
|
+
if constant is not None:
|
241
|
+
return OVAny(constant.output(0))
|
242
|
+
# so that has_attribute return True if attribute exist
|
243
|
+
return OVAny(DecoderType.PyNone())
|
244
|
+
return OVAny(None)
|
245
|
+
|
246
|
+
def get_named_input(self, name):
|
247
|
+
"""
|
248
|
+
Returns id of kwargs input. Such input can be Node or a constant value,
|
249
|
+
this function is only used for to return node index. If the input is
|
250
|
+
constant, get_attribute should be used.
|
251
|
+
"""
|
252
|
+
if name in self.pt_module.kwargs:
|
253
|
+
arg = self.pt_module.kwargs[name]
|
254
|
+
if isinstance(arg, torch.fx.Node):
|
255
|
+
return self._nodes.index(arg)
|
256
|
+
raise RuntimeError("This input is not a Node")
|
257
|
+
|
258
|
+
def get_subgraph_size(self):
|
259
|
+
if issubclass(type(self.pt_module), torch.fx.Node):
|
260
|
+
return 0
|
261
|
+
return len(self.get_subgraphs()) if hasattr(self.pt_module, 'blocks') else 1
|
262
|
+
|
263
|
+
def decoder_type_name(self) -> str:
|
264
|
+
return "fx"
|
265
|
+
|
266
|
+
def visit_subgraph(self, node_visitor):
|
267
|
+
# make sure topological order is satisfied
|
268
|
+
for node in self._nodes:
|
269
|
+
if node.op == 'placeholder' or node.op == 'output':
|
270
|
+
continue # skipping non-operational nodes
|
271
|
+
if node.op == 'call_function' and str(node.target) in ["aten._assert_async.msg"]:
|
272
|
+
continue
|
273
|
+
decoder = TorchFXPythonDecoder(
|
274
|
+
node, self.fx_gm, self._nodes, mark_node_callback=self.mark_node_callback)
|
275
|
+
self.m_decoders.append(decoder)
|
276
|
+
node_visitor(decoder)
|
277
|
+
|
278
|
+
def get_subgraphs(self):
|
279
|
+
if issubclass(type(self.pt_module), torch.fx.Node):
|
280
|
+
return []
|
281
|
+
return list(self.pt_module.blocks())
|
282
|
+
|
283
|
+
def get_subgraph_decoder(self, index):
|
284
|
+
decoder = TorchFXPythonDecoder(self.get_subgraphs()[index],
|
285
|
+
self.fx_gm,
|
286
|
+
mark_node_callback=self.mark_node_callback)
|
287
|
+
self.m_decoders.append(decoder)
|
288
|
+
return decoder
|
289
|
+
|
290
|
+
def get_op_type(self):
|
291
|
+
if self.pt_module.op == 'call_function':
|
292
|
+
return str(self.pt_module.target)
|
293
|
+
elif self.pt_module.op == 'get_attr':
|
294
|
+
return 'get_attr' # FIXME should be aligned with get_attr from TS implementation
|
295
|
+
else:
|
296
|
+
return 'UNKNOWN_TYPE_' + str(self.pt_module.op)
|
297
|
+
|
298
|
+
def get_schema(self):
|
299
|
+
return 'NONE'
|
300
|
+
|
301
|
+
def outputs(self):
|
302
|
+
return [o[1] for o in self._outputs]
|
303
|
+
|
304
|
+
def _raw_outputs(self):
|
305
|
+
return [self._nodes[x[1]] for x in self._outputs]
|
306
|
+
|
307
|
+
def _raw_output(self, index):
|
308
|
+
return self._raw_outputs()[index]
|
309
|
+
|
310
|
+
def _raw_inputs(self):
|
311
|
+
return [self._nodes[x] if not isinstance(x, tuple) and x < len(self._nodes) else x[0] for x in self._inputs]
|
312
|
+
|
313
|
+
def _raw_input(self, index):
|
314
|
+
return self._raw_inputs()[index]
|
315
|
+
|
316
|
+
def num_of_outputs(self):
|
317
|
+
return len(self.outputs())
|
318
|
+
|
319
|
+
def output(self, index):
|
320
|
+
return self.outputs()[index]
|
321
|
+
|
322
|
+
def mark_node(self, node):
|
323
|
+
name = self.get_op_type()
|
324
|
+
if "FrameworkNode" not in node.get_type_name():
|
325
|
+
name += "/" + node.get_type_name()
|
326
|
+
node.set_friendly_name(self.pt_module.name + "/" + name)
|
327
|
+
if self.mark_node_callback is not None:
|
328
|
+
self.mark_node_callback(self, node)
|
329
|
+
return node
|
330
|
+
|
331
|
+
def as_constant(self):
|
332
|
+
assert self.pt_module.op == 'get_attr', "Only get_attr is supported"
|
333
|
+
# Extract Constant from FX module field
|
334
|
+
ret = fetch_attr(self.fx_gm, self.pt_module.target)
|
335
|
+
ov_const = torch_tensor_to_ov_const(ret, shared_memory=True)
|
336
|
+
return ov_const.outputs()
|
337
|
+
|
338
|
+
def as_string(self):
|
339
|
+
return None
|
340
|
+
|
341
|
+
def input_is_none(self, index):
|
342
|
+
if index >= len(self._inputs) or (isinstance(self._inputs[index], tuple) and self._inputs[index][0] is None):
|
343
|
+
return True
|
344
|
+
else:
|
345
|
+
r_input = self._raw_input(index)
|
346
|
+
return str(type(r_input)) in ['torch.NoneType', 'NoneType']
|
347
|
+
|
348
|
+
def debug(self):
|
349
|
+
self.pt_module.print()
|
350
|
+
|
351
|
+
def may_produce_alias(self, in_index: int, out_index: int) -> bool:
|
352
|
+
return False
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
# flake8: noqa
|
5
|
+
# mypy: ignore-errors
|
6
|
+
|
7
|
+
import torch
|
8
|
+
from functools import partial
|
9
|
+
|
10
|
+
# Wraps a single tensor to a module to prevent it from jit.freezing
|
11
|
+
# It depends on a tensor dtype whether it will be preserved from freezing. Refer to the decoder code to learn which types will be preserved.
|
12
|
+
class KeepWeight(torch.nn.Module):
|
13
|
+
|
14
|
+
def __init__(self, weight):
|
15
|
+
super().__init__()
|
16
|
+
self.weight = torch.nn.Parameter(weight, requires_grad=False)
|
17
|
+
|
18
|
+
def forward(self):
|
19
|
+
return self.weight
|
20
|
+
|
21
|
+
|
22
|
+
# Produces a pattern that can be captured later and represented as a single u4 constant node
|
23
|
+
def decompression_pattern(weights):
|
24
|
+
mask = torch.tensor(15, dtype=torch.uint8).to(weights.device)
|
25
|
+
return torch.stack((torch.bitwise_and(weights, mask), torch.bitwise_right_shift(weights, 4)), dim=-1)
|
26
|
+
|
27
|
+
|
28
|
+
def patched_forward(self, *args, **kwargs):
|
29
|
+
if hasattr(self, '_hf_hook'):
|
30
|
+
args, kwargs = self._hf_hook.pre_forward(self, *args, **kwargs)
|
31
|
+
|
32
|
+
x = args[0]
|
33
|
+
dtype = x.dtype
|
34
|
+
outshape = x.shape[:-1] + (self.width,)
|
35
|
+
x = x.view(-1, x.shape[-1])
|
36
|
+
groups = self.qzeros.shape[0]
|
37
|
+
height = self.qweight.shape[0]
|
38
|
+
|
39
|
+
unpacked_weights = decompression_pattern(
|
40
|
+
self._openvino_u4_compression_submodule_qweights()).contiguous().view(height, -1, 8)
|
41
|
+
unpacked_weights = torch.transpose(
|
42
|
+
unpacked_weights, 1, 2).contiguous().view(-1, self.group_size, self.width)
|
43
|
+
unpacked_zp = decompression_pattern(
|
44
|
+
self._openvino_u4_compression_submodule_qzeros()).contiguous().view(groups, 1, -1)
|
45
|
+
|
46
|
+
unpacked_zp = unpacked_zp.to(dtype) + 1
|
47
|
+
|
48
|
+
unpacked_weights = (unpacked_weights.to(dtype) - unpacked_zp) * self.scales
|
49
|
+
unpacked_weights = unpacked_weights.view(-1, self.width)
|
50
|
+
|
51
|
+
out = x @ unpacked_weights
|
52
|
+
|
53
|
+
out = out.view(outshape)
|
54
|
+
if self.bias is not None:
|
55
|
+
out.add_(self.bias)
|
56
|
+
|
57
|
+
if hasattr(self, '_hf_hook'):
|
58
|
+
out = self._hf_hook.post_forward(self, out)
|
59
|
+
return out
|
60
|
+
|
61
|
+
|
62
|
+
# All the following AutoGPTQ's quant types are supposed to have the same weights packing schema
|
63
|
+
supported_quant_types = ['triton', 'exllama', 'cuda', 'exllamav2', 'cuda-old']
|
64
|
+
|
65
|
+
|
66
|
+
def patch_model(model):
|
67
|
+
for name, m in model.named_modules():
|
68
|
+
if hasattr(m, '_openvino_patch_orig_forward'):
|
69
|
+
# already patched, skipping
|
70
|
+
continue
|
71
|
+
# TODO: Check module type
|
72
|
+
is_quantized = getattr(m, 'is_quantized', None)
|
73
|
+
if is_quantized is not None:
|
74
|
+
m.is_quantized = False
|
75
|
+
m.float() # enables tracing on CPU, applied for all modules
|
76
|
+
if hasattr(m, 'QUANT_TYPE'):
|
77
|
+
if m.QUANT_TYPE not in supported_quant_types:
|
78
|
+
raise ValueError(
|
79
|
+
f'Unsupported QUANT_TYPE == {m.QUANT_TYPE} is discovered for AutoGPTQ model, only the following types are supported: {supported_quant_types}')
|
80
|
+
if m.bits != 4:
|
81
|
+
raise ValueError(
|
82
|
+
f'Unsupported bits == {m.bits} is discovered in module {name} in AutoGPTQ model, only bits == 4 is supported.')
|
83
|
+
|
84
|
+
int4_in_int32 = 8
|
85
|
+
groups = m.qzeros.shape[0]
|
86
|
+
m.width = m.qweight.shape[1]
|
87
|
+
assert m.group_size == m.qweight.shape[0] * int4_in_int32 // groups
|
88
|
+
|
89
|
+
m._openvino_patch_orig_forward = m.forward
|
90
|
+
m.forward = partial(patched_forward, m)
|
91
|
+
|
92
|
+
# Keep original field properties to be used when model is returned back to its original state
|
93
|
+
m._openvino_patch_orig_qweights_type = m.qweight.dtype
|
94
|
+
m._openvino_patch_orig_qzeros_type = m.qzeros.dtype
|
95
|
+
m._openvino_patch_orig_scale_shape = m.scales.shape
|
96
|
+
|
97
|
+
m.qweight = m.qweight.view(dtype=torch.uint8)
|
98
|
+
m.qzeros = m.qzeros.view(dtype=torch.uint8)
|
99
|
+
|
100
|
+
# TODO: Redundant tensor copy? Try to remove m.qweigh and m.qzeros after keeping modified values as submodules
|
101
|
+
m.add_module(
|
102
|
+
'_openvino_u4_compression_submodule_qweights', KeepWeight(m.qweight))
|
103
|
+
m.add_module('_openvino_u4_compression_submodule_qzeros',
|
104
|
+
KeepWeight(m.qzeros))
|
105
|
+
|
106
|
+
m.scales = m.scales.view(-1, 1, m.width)
|
107
|
+
|
108
|
+
|
109
|
+
def unpatch_model(model):
|
110
|
+
for _, m in model.named_modules():
|
111
|
+
if hasattr(m, '_openvino_patch_orig_forward'):
|
112
|
+
try:
|
113
|
+
m.forward = m._openvino_patch_orig_forward
|
114
|
+
del m._openvino_patch_orig_forward
|
115
|
+
|
116
|
+
m.qweight = m.qweight.view(
|
117
|
+
dtype=m._openvino_patch_orig_qweights_type)
|
118
|
+
del m._openvino_patch_orig_qweights_type
|
119
|
+
|
120
|
+
m.qzeros = m.qzeros.view(
|
121
|
+
dtype=m._openvino_patch_orig_qzeros_type)
|
122
|
+
del m._openvino_patch_orig_qzeros_type
|
123
|
+
|
124
|
+
m.scales = m.scales.view(m._openvino_patch_orig_scale_shape)
|
125
|
+
del m._openvino_patch_orig_scale_shape
|
126
|
+
|
127
|
+
del m._openvino_u4_compression_submodule_qweights
|
128
|
+
del m._openvino_u4_compression_submodule_qzeros
|
129
|
+
except Exception as error:
|
130
|
+
print('[ WARNING ] Exception raised during GPTQ model unpatching. Depending on the exact issue it may lead to broken original model')
|
131
|
+
print(error)
|
132
|
+
|
133
|
+
|
134
|
+
def detect_gptq_model_raw(model):
|
135
|
+
return model and getattr(model, 'config', None) and getattr(model.config, 'quantization_config', None) and model.config.quantization_config.quant_method == 'gptq'
|
136
|
+
|
137
|
+
|
138
|
+
def detect_gptq_model(model):
|
139
|
+
return detect_gptq_model_raw(model) or getattr(model, 'model', None) and detect_gptq_model_raw(model.model)
|