bigdl-core-npu 2.5.0__cp311-cp311-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,189 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
4
|
+
|
5
|
+
# mypy: ignore-errors
|
6
|
+
|
7
|
+
from copy import deepcopy
|
8
|
+
from dataclasses import dataclass
|
9
|
+
from functools import lru_cache
|
10
|
+
from types import MappingProxyType
|
11
|
+
from warnings import warn
|
12
|
+
|
13
|
+
import torch
|
14
|
+
import torch.overrides
|
15
|
+
|
16
|
+
from torch.fx import GraphModule
|
17
|
+
from torch.utils._pytree import tree_flatten, tree_map, tree_unflatten
|
18
|
+
|
19
|
+
from openvino.frontend import FrontEndManager
|
20
|
+
from openvino.frontend.pytorch.fx_decoder import TorchFXPythonDecoder
|
21
|
+
from openvino.frontend.pytorch.torchdynamo.partition import Partitioner
|
22
|
+
from openvino.frontend.pytorch.torchdynamo.compile import openvino_compile
|
23
|
+
from openvino.runtime import Core, Type, PartialShape
|
24
|
+
from openvino.frontend.pytorch.torchdynamo.backend_utils import _get_cache_dir, _get_device, _get_aot_autograd
|
25
|
+
|
26
|
+
from typing import Callable, Optional, Any
|
27
|
+
|
28
|
+
from torch.fx.experimental.proxy_tensor import make_fx, wrapper_and_args_for_make_fx
|
29
|
+
|
30
|
+
import logging
|
31
|
+
logger = logging.getLogger(__name__)
|
32
|
+
logger.setLevel(logging.WARNING)
|
33
|
+
|
34
|
+
|
35
|
+
DEFAULT_OPENVINO_PYTHON_CONFIG = MappingProxyType(
|
36
|
+
{
|
37
|
+
"use_python_fusion_cache": True,
|
38
|
+
"allow_single_op_fusion": True,
|
39
|
+
},
|
40
|
+
)
|
41
|
+
|
42
|
+
compiled_cache = {}
|
43
|
+
req_cache = {}
|
44
|
+
max_openvino_partitions = 0
|
45
|
+
partitioned_modules = {}
|
46
|
+
|
47
|
+
|
48
|
+
def execute(
|
49
|
+
gm: GraphModule,
|
50
|
+
*args,
|
51
|
+
executor: str = "openvino",
|
52
|
+
executor_parameters: Optional[dict] = None,
|
53
|
+
options: Optional[Any] = None,
|
54
|
+
):
|
55
|
+
if executor == "openvino":
|
56
|
+
return openvino_execute_partitioned(gm, *args, executor_parameters=executor_parameters, options=options)
|
57
|
+
elif executor == "strictly_openvino":
|
58
|
+
return openvino_execute(gm, *args, executor_parameters=executor_parameters)
|
59
|
+
|
60
|
+
msg = "Received unexpected value for 'executor': {0}. Allowed values are: openvino, strictly_openvino.".format(executor)
|
61
|
+
raise ValueError(msg)
|
62
|
+
|
63
|
+
|
64
|
+
import numpy as np
|
65
|
+
|
66
|
+
|
67
|
+
def execute_cached(compiled_model, *args):
|
68
|
+
ov_inputs = [a.detach().cpu().numpy() for a in args]
|
69
|
+
ov_inputs.reverse()
|
70
|
+
res = compiled_model(ov_inputs)
|
71
|
+
result = [torch.from_numpy(res[out]) for out in compiled_model.outputs]
|
72
|
+
return result
|
73
|
+
|
74
|
+
|
75
|
+
def openvino_execute(gm: GraphModule, *args, executor_parameters=None, partition_id, options):
|
76
|
+
|
77
|
+
executor_parameters = executor_parameters or DEFAULT_OPENVINO_PYTHON_CONFIG
|
78
|
+
|
79
|
+
use_cache = executor_parameters.get(
|
80
|
+
"use_python_fusion_cache",
|
81
|
+
DEFAULT_OPENVINO_PYTHON_CONFIG["use_python_fusion_cache"],
|
82
|
+
)
|
83
|
+
global compiled_cache
|
84
|
+
|
85
|
+
model_hash_str = executor_parameters.get("model_hash_str", None)
|
86
|
+
if model_hash_str is not None:
|
87
|
+
fully_supported = False
|
88
|
+
if len(model_hash_str) > 3 and model_hash_str[-3:] == "_fs":
|
89
|
+
fully_supported = True
|
90
|
+
if not fully_supported:
|
91
|
+
model_hash_str = model_hash_str + "_p" + str(partition_id)
|
92
|
+
|
93
|
+
if use_cache and (partition_id in compiled_cache):
|
94
|
+
compiled = compiled_cache[partition_id]
|
95
|
+
req = req_cache[partition_id]
|
96
|
+
else:
|
97
|
+
compiled = openvino_compile(gm, *args, model_hash_str=model_hash_str, options=options)
|
98
|
+
compiled_cache[partition_id] = compiled
|
99
|
+
req = compiled.create_infer_request()
|
100
|
+
req_cache[partition_id] = req
|
101
|
+
|
102
|
+
flat_args, _ = tree_flatten(args)
|
103
|
+
ov_inputs = []
|
104
|
+
for arg in flat_args:
|
105
|
+
ov_inputs.append((arg if isinstance(arg, int) else arg.detach().cpu().numpy()))
|
106
|
+
|
107
|
+
res = req.infer(ov_inputs, share_inputs=True, share_outputs=True)
|
108
|
+
|
109
|
+
results1 = [torch.from_numpy(res[out]) for out in compiled.outputs]
|
110
|
+
if len(results1) == 1:
|
111
|
+
return results1[0]
|
112
|
+
return results1
|
113
|
+
|
114
|
+
|
115
|
+
class OpenVINOGraphModule(torch.nn.Module):
|
116
|
+
def __init__(self, gm, partition_id, use_python_fusion_cache, model_hash_str: str = None, options=None):
|
117
|
+
super().__init__()
|
118
|
+
self.gm = gm
|
119
|
+
self.partition_id = partition_id
|
120
|
+
self.executor_parameters = {"use_python_fusion_cache": use_python_fusion_cache,
|
121
|
+
"model_hash_str": model_hash_str}
|
122
|
+
self.perm_fallback = False
|
123
|
+
self.options = options
|
124
|
+
|
125
|
+
def __call__(self, *args):
|
126
|
+
if self.perm_fallback:
|
127
|
+
return self.gm(*args)
|
128
|
+
|
129
|
+
try:
|
130
|
+
result = openvino_execute(self.gm, *args, executor_parameters=self.executor_parameters, partition_id=self.partition_id, options=self.options)
|
131
|
+
except Exception:
|
132
|
+
logger.debug("OpenVINO execution failed. Falling back to native PyTorch execution.")
|
133
|
+
self.perm_fallback = True
|
134
|
+
return self.gm(*args)
|
135
|
+
|
136
|
+
return result
|
137
|
+
|
138
|
+
|
139
|
+
def partition_graph(gm: GraphModule, use_python_fusion_cache: bool, model_hash_str: str = None, options=None):
|
140
|
+
global max_openvino_partitions
|
141
|
+
partition_id = max_openvino_partitions
|
142
|
+
for node in gm.graph.nodes:
|
143
|
+
# TODO: use a better way to identify fused submodule
|
144
|
+
if node.op == "call_module" and "fused_" in node.name:
|
145
|
+
openvino_submodule = getattr(gm, node.name)
|
146
|
+
gm.delete_submodule(node.target)
|
147
|
+
gm.add_submodule(
|
148
|
+
node.target,
|
149
|
+
OpenVINOGraphModule(openvino_submodule, partition_id, use_python_fusion_cache,
|
150
|
+
model_hash_str=model_hash_str, options=options),
|
151
|
+
)
|
152
|
+
partition_id = partition_id + 1
|
153
|
+
|
154
|
+
max_openvino_partitions = partition_id
|
155
|
+
|
156
|
+
return gm
|
157
|
+
|
158
|
+
|
159
|
+
def openvino_execute_partitioned(gm: GraphModule, *args, executor_parameters=None, options=None):
|
160
|
+
executor_parameters = executor_parameters or DEFAULT_OPENVINO_PYTHON_CONFIG
|
161
|
+
|
162
|
+
global partitioned_modules
|
163
|
+
|
164
|
+
use_python_fusion_cache = executor_parameters.get(
|
165
|
+
"use_python_fusion_cache",
|
166
|
+
DEFAULT_OPENVINO_PYTHON_CONFIG["use_python_fusion_cache"],
|
167
|
+
)
|
168
|
+
model_hash_str = executor_parameters.get("model_hash_str", None)
|
169
|
+
|
170
|
+
signature = str(id(gm))
|
171
|
+
if (not _get_aot_autograd(options)):
|
172
|
+
for idx, input_data in enumerate(args):
|
173
|
+
if isinstance(input_data, torch.Tensor):
|
174
|
+
signature = signature + "_" + str(idx) + ":" + str(input_data.type())[6:] + ":" + str(input_data.size())[11:-1].replace(" ", "")
|
175
|
+
else:
|
176
|
+
signature = signature + "_" + str(idx) + ":" + type(input_data).__name__ + ":val(" + str(input_data) + ")"
|
177
|
+
|
178
|
+
if signature not in partitioned_modules:
|
179
|
+
partitioned_modules[signature] = partition_graph(gm, use_python_fusion_cache=use_python_fusion_cache,
|
180
|
+
model_hash_str=model_hash_str, options=options)
|
181
|
+
return partitioned_modules[signature](*args)
|
182
|
+
|
183
|
+
|
184
|
+
def clear_caches():
|
185
|
+
global partitioned_modules
|
186
|
+
global compiled_cache
|
187
|
+
|
188
|
+
compiled_cache.clear()
|
189
|
+
partitioned_modules.clear()
|
@@ -0,0 +1,289 @@
|
|
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 typing import Dict
|
8
|
+
|
9
|
+
import torch
|
10
|
+
from torch.nn import Module
|
11
|
+
from torch._ops import OpOverload
|
12
|
+
|
13
|
+
from torch.fx.node import Node, _get_qualified_name
|
14
|
+
from torch.fx.passes.operator_support import OperatorSupport
|
15
|
+
from torch.fx.passes.tools_common import CALLABLE_NODE_OPS
|
16
|
+
from openvino.frontend.pytorch.torchdynamo.backend_utils import _get_disabled_ops
|
17
|
+
|
18
|
+
import typing as t
|
19
|
+
import logging
|
20
|
+
|
21
|
+
logger = logging.getLogger(__name__)
|
22
|
+
logger.setLevel(logging.WARNING)
|
23
|
+
|
24
|
+
class OperatorSupport(OperatorSupport):
|
25
|
+
"""
|
26
|
+
Operator support for OpenVINO backend.
|
27
|
+
"""
|
28
|
+
|
29
|
+
def __init__(self, options):
|
30
|
+
support_dict = {
|
31
|
+
"_operator.add": None,
|
32
|
+
"_operator.floordiv": None,
|
33
|
+
"_operator.getitem": None,
|
34
|
+
"_operator.mul": None,
|
35
|
+
"_operator.sub": None,
|
36
|
+
"torch.ops.aten.sym_size.int": None,
|
37
|
+
"torch.ops.aten._adaptive_avg_pool1d.default": None,
|
38
|
+
"torch.ops.aten._adaptive_avg_pool2d.default": None,
|
39
|
+
"torch.ops.aten._adaptive_avg_pool3d.default": None,
|
40
|
+
"torch.ops.aten._convolution.default": None,
|
41
|
+
"torch.ops.aten._embedding_bag.default": None,
|
42
|
+
"torch.ops.aten._fake_quantize_per_tensor_affine_cachemask_tensor_qparams.default": None,
|
43
|
+
"torch.ops.aten._local_scalar_dense.default": None,
|
44
|
+
"torch.ops.aten._log_softmax.default": None,
|
45
|
+
"torch.ops.aten._native_batch_norm_legit.default": None,
|
46
|
+
"torch.ops.aten._native_batch_norm_legit.no_stats": None,
|
47
|
+
"torch.ops.aten._native_batch_norm_legit_functional.default": None,
|
48
|
+
"torch.ops.aten._native_batch_norm_legit_no_training.default": None,
|
49
|
+
"torch.ops.aten._scaled_dot_product_flash_attention.default": None,
|
50
|
+
"torch.ops.aten._scaled_dot_product_flash_attention_for_cpu.default": None,
|
51
|
+
"torch.ops.aten._softmax.default": None,
|
52
|
+
"torch.ops.aten._to_copy.default": None,
|
53
|
+
"torch.ops.aten._unsafe_view.default": None,
|
54
|
+
"torch.ops.aten.abs.default": None,
|
55
|
+
"torch.ops.aten.acos.default": None,
|
56
|
+
"torch.ops.aten.acosh.default": None,
|
57
|
+
"torch.ops.aten.adaptive_max_pool1d.default": None,
|
58
|
+
"torch.ops.aten.adaptive_max_pool2d.default": None,
|
59
|
+
"torch.ops.aten.adaptive_max_pool3d.default": None,
|
60
|
+
"torch.ops.aten.add.Scalar": None,
|
61
|
+
"torch.ops.aten.add.Tensor": None,
|
62
|
+
"torch.ops.aten.add_.Tensor": None,
|
63
|
+
"torch.ops.aten.addcmul.default": None,
|
64
|
+
"torch.ops.aten.addmm.default": None,
|
65
|
+
"torch.ops.aten.alias.default": None,
|
66
|
+
"torch.ops.aten.all.default": None,
|
67
|
+
"torch.ops.aten.amax.default": None,
|
68
|
+
"torch.ops.aten.amin.default": None,
|
69
|
+
"torch.ops.aten.any.default": None,
|
70
|
+
"torch.ops.aten.any.dim": None,
|
71
|
+
"torch.ops.aten.arange.default": None,
|
72
|
+
"torch.ops.aten.arange.start": None,
|
73
|
+
"torch.ops.aten.arange.start_step": None,
|
74
|
+
"torch.ops.aten.argmax.default": None,
|
75
|
+
"torch.ops.aten.argmin.default": None,
|
76
|
+
"torch.ops.aten.as_strided.default": None,
|
77
|
+
"torch.ops.aten.as_strided_.default": None,
|
78
|
+
"torch.ops.aten.asin.default": None,
|
79
|
+
"torch.ops.aten.asinh.default": None,
|
80
|
+
"torch.ops.aten.asinh.default": None,
|
81
|
+
"torch.ops.aten.atanh.default": None,
|
82
|
+
"torch.ops.aten.avg_pool2d.default": None,
|
83
|
+
"torch.ops.aten.avg_pool3d.default": None,
|
84
|
+
"torch.ops.aten.baddbmm.default": None,
|
85
|
+
"torch.ops.aten.bitwise_and.Scalar": None,
|
86
|
+
"torch.ops.aten.bitwise_and.Tensor": None,
|
87
|
+
"torch.ops.aten.bitwise_not.default": None,
|
88
|
+
"torch.ops.aten.bitwise_or.Tensor": None,
|
89
|
+
"torch.ops.aten.bitwise_xor.Tensor": None,
|
90
|
+
"torch.ops.aten.bmm.default": None,
|
91
|
+
"torch.ops.aten.cat.default": None,
|
92
|
+
"torch.ops.aten.ceil.default": None,
|
93
|
+
"torch.ops.aten.clamp.default": None,
|
94
|
+
"torch.ops.aten.clamp_max.default": None,
|
95
|
+
"torch.ops.aten.clamp_max.Tensor": None,
|
96
|
+
"torch.ops.aten.clamp_min.default": None,
|
97
|
+
"torch.ops.aten.clamp_min.Tensor": None,
|
98
|
+
"torch.ops.aten.clone.default": None,
|
99
|
+
"torch.ops.aten.constant_pad_nd.default": None,
|
100
|
+
"torch.ops.aten.convolution.default": None,
|
101
|
+
"torch.ops.aten.copy.default": None,
|
102
|
+
"torch.ops.aten.copy_.default": None,
|
103
|
+
"torch.ops.aten.cos.default": None,
|
104
|
+
"torch.ops.aten.cosh.default": None,
|
105
|
+
"torch.ops.aten.cumsum.default": None,
|
106
|
+
"torch.ops.aten.detach.default": None,
|
107
|
+
"torch.ops.aten.detach_.default": None,
|
108
|
+
"torch.ops.aten.div.Scalar": None,
|
109
|
+
"torch.ops.aten.div.Tensor": None,
|
110
|
+
"torch.ops.aten.div.Tensor_mode": None,
|
111
|
+
"torch.ops.aten.div_.Tensor": None,
|
112
|
+
"torch.ops.aten.elu.default": None,
|
113
|
+
"torch.ops.aten.elu_.default": None,
|
114
|
+
"torch.ops.aten.embedding.default": None,
|
115
|
+
"torch.ops.aten.empty.memory_format": None,
|
116
|
+
"torch.ops.aten.eq.Scalar": None,
|
117
|
+
"torch.ops.aten.eq.Tensor": None,
|
118
|
+
"torch.ops.aten.erf.default": None,
|
119
|
+
"torch.ops.aten.exp.default": None,
|
120
|
+
"torch.ops.aten.expand.default": None,
|
121
|
+
"torch.ops.aten.fake_quantize_per_channel_affine_cachemask.default": None,
|
122
|
+
"torch.ops.aten.fill.Scalar": None,
|
123
|
+
"torch.ops.aten.fill_.Scalar": None,
|
124
|
+
"torch.ops.aten.fill.Tensor": None,
|
125
|
+
"torch.ops.aten.fill_.Tensor": None,
|
126
|
+
"torch.ops.aten.flip.default": None,
|
127
|
+
"torch.ops.aten.floor.default": None,
|
128
|
+
"torch.ops.aten.floor.default": None,
|
129
|
+
"torch.ops.aten.fmod.Scalar": None,
|
130
|
+
"torch.ops.aten.fmod.Tensor": None,
|
131
|
+
"torch.ops.aten.full.default": None,
|
132
|
+
"torch.ops.aten.full.names": None,
|
133
|
+
"torch.ops.aten.full_like.default": None,
|
134
|
+
"torch.ops.aten.gather.default": None,
|
135
|
+
"torch.ops.aten.ge.Scalar": None,
|
136
|
+
"torch.ops.aten.ge.Tensor": None,
|
137
|
+
"torch.ops.aten.gelu.default": None,
|
138
|
+
"torch.ops.aten.glu.default": None,
|
139
|
+
"torch.ops.aten.grid_sampler_2d.default": None,
|
140
|
+
"torch.ops.aten.gt.Scalar": None,
|
141
|
+
"torch.ops.aten.gt.Tensor": None,
|
142
|
+
"torch.ops.aten.hardsigmoid.default": None,
|
143
|
+
"torch.ops.aten.hardswish.default": None,
|
144
|
+
"torch.ops.aten.hardswish_.default": None,
|
145
|
+
"torch.ops.aten.hardtanh.default": None,
|
146
|
+
"torch.ops.aten.hardtanh_.default": None,
|
147
|
+
"torch.ops.aten.index.Tensor": None,
|
148
|
+
"torch.ops.aten.index_select.default": None,
|
149
|
+
"torch.ops.aten.isfinite.default": None,
|
150
|
+
"torch.ops.aten.isinf.default": None,
|
151
|
+
"torch.ops.aten.isnan.default": None,
|
152
|
+
"torch.ops.aten.le.Scalar": None,
|
153
|
+
"torch.ops.aten.le.Tensor": None,
|
154
|
+
"torch.ops.aten.leaky_relu.default": None,
|
155
|
+
"torch.ops.aten.leaky_relu_.default": None,
|
156
|
+
"torch.ops.aten.lift_fresh_copy.default": None,
|
157
|
+
"torch.ops.aten.linalg_vector_norm.default": None,
|
158
|
+
"torch.ops.aten.log.default": None,
|
159
|
+
"torch.ops.aten.log_sigmoid_forward.default": None,
|
160
|
+
"torch.ops.aten.log10.default": None,
|
161
|
+
"torch.ops.aten.log1p.default": None,
|
162
|
+
"torch.ops.aten.log2.default": None,
|
163
|
+
"torch.ops.aten.logical_not.default": None,
|
164
|
+
"torch.ops.aten.logsumexp.default": None,
|
165
|
+
"torch.ops.aten.lt.Scalar": None,
|
166
|
+
"torch.ops.aten.lt.Tensor": None,
|
167
|
+
"torch.ops.aten.masked_fill.Scalar": None,
|
168
|
+
"torch.ops.aten.masked_fill.Tensor": None,
|
169
|
+
"torch.ops.aten.masked_fill_.Scalar": None,
|
170
|
+
"torch.ops.aten.masked_fill_.Tensor": None,
|
171
|
+
"torch.ops.aten.max.default": None,
|
172
|
+
"torch.ops.aten.max.dim": None,
|
173
|
+
"torch.ops.aten.max_pool2d_with_indices.default": None,
|
174
|
+
"torch.ops.aten.max_pool3d_with_indices.default": None,
|
175
|
+
"torch.ops.aten.maximum.default": None,
|
176
|
+
"torch.ops.aten.mean.default": None,
|
177
|
+
"torch.ops.aten.mean.dim": None,
|
178
|
+
"torch.ops.aten.min.default": None,
|
179
|
+
"torch.ops.aten.min.dim": None,
|
180
|
+
"torch.ops.aten.minimum.default": None,
|
181
|
+
"torch.ops.aten.mm.default": None,
|
182
|
+
"torch.ops.aten.mul.Scalar": None,
|
183
|
+
"torch.ops.aten.mul.Tensor": None,
|
184
|
+
"torch.ops.aten.mul_.Tensor": None,
|
185
|
+
"torch.ops.aten.native_batch_norm.default": None,
|
186
|
+
"torch.ops.aten.native_dropout.default": None,
|
187
|
+
"torch.ops.aten.native_group_norm.default": None,
|
188
|
+
"torch.ops.aten.native_layer_norm.default": None,
|
189
|
+
"torch.ops.aten.ne.Scalar": None,
|
190
|
+
"torch.ops.aten.ne.Tensor": None,
|
191
|
+
"torch.ops.aten.neg.default": None,
|
192
|
+
"torch.ops.aten.new_full.default": None,
|
193
|
+
"torch.ops.aten.new_ones.default": None,
|
194
|
+
"torch.ops.aten.ones_like.default": None,
|
195
|
+
"torch.ops.aten.new_zeros.default": None,
|
196
|
+
"torch.ops.aten.ones.default": None,
|
197
|
+
"torch.ops.aten.permute.default": None,
|
198
|
+
"torch.ops.aten.pow.Scalar": None,
|
199
|
+
"torch.ops.aten.pow.Tensor_Scalar": None,
|
200
|
+
"torch.ops.aten.pow.Tensor_Tensor": None,
|
201
|
+
"torch.ops.aten.rand.default": None,
|
202
|
+
"torch.ops.aten.reflection_pad2d.default": None,
|
203
|
+
"torch.ops.aten.reciprocal.default": None,
|
204
|
+
"torch.ops.aten.relu.default": None,
|
205
|
+
"torch.ops.aten.relu_.default": None,
|
206
|
+
"torch.ops.aten.repeat.default": None,
|
207
|
+
"torch.ops.aten.roll.default": None,
|
208
|
+
"torch.ops.aten.rsqrt.default": None,
|
209
|
+
"torch.ops.aten.rsub.Scalar": None,
|
210
|
+
"torch.ops.aten.rsub.Tensor": None,
|
211
|
+
"torch.ops.aten.scalar_tensor.default": None,
|
212
|
+
"torch.ops.aten.scatter.src": None,
|
213
|
+
"torch.ops.aten.scatter.value": None,
|
214
|
+
"torch.ops.aten.select.int": None,
|
215
|
+
"torch.ops.aten.select_scatter.default": None,
|
216
|
+
"torch.ops.aten.sigmoid.default": None,
|
217
|
+
"torch.ops.aten.sigmoid_.default": None,
|
218
|
+
"torch.ops.aten.sign.default": None,
|
219
|
+
"torch.ops.aten.silu.default": None,
|
220
|
+
"torch.ops.aten.silu_.default": None,
|
221
|
+
"torch.ops.aten.sin.default": None,
|
222
|
+
"torch.ops.aten.sinh.default": None,
|
223
|
+
"torch.ops.aten.slice.Tensor": None,
|
224
|
+
"torch.ops.aten.slice_scatter.default": None,
|
225
|
+
"torch.ops.aten.sort.default": None,
|
226
|
+
"torch.ops.aten.split.Tensor": None,
|
227
|
+
"torch.ops.aten.split_with_sizes.default": None,
|
228
|
+
"torch.ops.aten.sqrt.default": None,
|
229
|
+
"torch.ops.aten.squeeze.dim": None,
|
230
|
+
"torch.ops.aten.squeeze.dims": None,
|
231
|
+
"torch.ops.aten.stack.default": None,
|
232
|
+
"torch.ops.aten.std.correction": None,
|
233
|
+
"torch.ops.aten.sub.default": None,
|
234
|
+
"torch.ops.aten.sub.Tensor": None,
|
235
|
+
"torch.ops.aten.sum.default": None,
|
236
|
+
"torch.ops.aten.sum.dim_IntList": None,
|
237
|
+
"torch.ops.aten.t.default": None,
|
238
|
+
"torch.ops.aten.tan.default": None,
|
239
|
+
"torch.ops.aten.tanh.default": None,
|
240
|
+
"torch.ops.aten.topk.default": None,
|
241
|
+
"torch.ops.aten.transpose.int": None,
|
242
|
+
"torch.ops.aten.tril.default": None,
|
243
|
+
"torch.ops.aten.tril_.default": None,
|
244
|
+
"torch.ops.aten.unbind.int": None,
|
245
|
+
"torch.ops.aten.unfold.default": None,
|
246
|
+
"torch.ops.aten.unsqueeze.default": None,
|
247
|
+
"torch.ops.aten.upsample_nearest2d.default": None,
|
248
|
+
"torch.ops.aten.var.correction": None,
|
249
|
+
"torch.ops.aten.var_mean.correction": None,
|
250
|
+
"torch.ops.aten.view.default": None,
|
251
|
+
"torch.ops.aten.where.self": None,
|
252
|
+
"torch.ops.aten.zeros.default": None,
|
253
|
+
"torch.ops.aten.zeros_like.default": None,
|
254
|
+
"torch.ops.torchvision.deform_conv2d.default": None,
|
255
|
+
"torch.ops.torchvision.roi_align.default": None,
|
256
|
+
"torch.ops.quantized_decomposed.quantize_per_tensor.default": None,
|
257
|
+
"torch.ops.quantized_decomposed.quantize_per_channel.default": None,
|
258
|
+
"torch.ops.quantized_decomposed.dequantize_per_tensor.default": None,
|
259
|
+
"torch.ops.quantized_decomposed.dequantize_per_channel.default": None
|
260
|
+
|
261
|
+
}
|
262
|
+
|
263
|
+
self.enabled_op_names = []
|
264
|
+
|
265
|
+
for op in _get_disabled_ops(options):
|
266
|
+
del support_dict[op]
|
267
|
+
|
268
|
+
super().__init__(support_dict)
|
269
|
+
|
270
|
+
def enable_by_name(self, node: Node):
|
271
|
+
self.enabled_op_names.append(node.name)
|
272
|
+
|
273
|
+
def is_node_supported(self, submodules: t.Mapping[str, Module], node: Node) -> bool:
|
274
|
+
# OpenVINO FX subgraph should be purely functional
|
275
|
+
if node.op not in CALLABLE_NODE_OPS:
|
276
|
+
return False
|
277
|
+
|
278
|
+
# ops in supported_dict doesn't have overload name
|
279
|
+
# use overloadpacket's qualified_name for OpOverload
|
280
|
+
if isinstance(node.target, OpOverload):
|
281
|
+
target = _get_qualified_name(node.target.overloadpacket)
|
282
|
+
|
283
|
+
if target in self._support_dict:
|
284
|
+
return True
|
285
|
+
|
286
|
+
if node.name in self.enabled_op_names:
|
287
|
+
return True
|
288
|
+
|
289
|
+
return super().is_node_supported(submodules, node)
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2018-2024 Intel Corporation
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
4
|
+
|
5
|
+
# mypy: ignore-errors
|
6
|
+
|
7
|
+
from typing import Dict
|
8
|
+
|
9
|
+
import torch
|
10
|
+
from torch.nn import Module
|
11
|
+
from torch.fx import GraphModule, Node
|
12
|
+
from torch.fx.passes.infra.partitioner import CapabilityBasedPartitioner, Partition
|
13
|
+
|
14
|
+
from torch.fx.experimental.proxy_tensor import DecompositionInterpreter
|
15
|
+
from torch._decomp import decomposition_table
|
16
|
+
from torch.fx.experimental.proxy_tensor import make_fx
|
17
|
+
from torch.utils._pytree import tree_flatten, tree_map, tree_unflatten
|
18
|
+
from openvino.frontend.pytorch.torchdynamo.op_support import OperatorSupport
|
19
|
+
from openvino.frontend.pytorch.torchdynamo.backend_utils import _is_testing
|
20
|
+
|
21
|
+
import typing as t
|
22
|
+
import logging
|
23
|
+
|
24
|
+
logger = logging.getLogger(__name__)
|
25
|
+
logger.setLevel(logging.WARNING)
|
26
|
+
|
27
|
+
|
28
|
+
class Partitioner:
|
29
|
+
def __init__(self, options):
|
30
|
+
self.supported_ops = OperatorSupport(options)
|
31
|
+
|
32
|
+
def fx_serialize(self, graph_module: GraphModule, *args, **kwargs):
|
33
|
+
fx_gm = make_fx(graph_module)(*args)
|
34
|
+
return fx_gm
|
35
|
+
|
36
|
+
def add_get_attr_inputs(self, partitions: t.List[Partition]):
|
37
|
+
# TODO: Find a more efficient way to include input
|
38
|
+
# "get_attr" nodes to the partitions.
|
39
|
+
getattr_to_merge: Dict[Node, Node] = {}
|
40
|
+
for partition in partitions:
|
41
|
+
for pnode in partition.nodes:
|
42
|
+
for pnode_input in pnode.all_input_nodes:
|
43
|
+
if pnode_input.op in ["get_attr"] and pnode_input.op not in getattr_to_merge:
|
44
|
+
getattr_to_merge[pnode_input] = partition
|
45
|
+
for getattr_node, getattr_part in getattr_to_merge.items():
|
46
|
+
getattr_part.add_node(getattr_node)
|
47
|
+
|
48
|
+
def check_fully_supported(self, graph_module: GraphModule) -> bool:
|
49
|
+
num_fused = 0
|
50
|
+
for node in graph_module.graph.nodes:
|
51
|
+
if node.op == "call_module" and "fused_" in node.name:
|
52
|
+
num_fused += 1
|
53
|
+
elif node.op != "placeholder" and node.op != "output":
|
54
|
+
return False
|
55
|
+
if num_fused == 1:
|
56
|
+
return True
|
57
|
+
return False
|
58
|
+
|
59
|
+
def capture_gptq_patterns(self, graph_module: GraphModule) -> bool:
|
60
|
+
for node in graph_module.graph.nodes:
|
61
|
+
if str(node.op) == "call_function" and str(node.target) == "aten.bitwise_and.Scalar":
|
62
|
+
bitwise_and_in_nodes = node.all_input_nodes
|
63
|
+
if len(bitwise_and_in_nodes) != 1:
|
64
|
+
continue
|
65
|
+
to_copy_node = bitwise_and_in_nodes[0]
|
66
|
+
if str(to_copy_node.op) != "call_function" or str(to_copy_node.target) != "aten._to_copy.default":
|
67
|
+
continue
|
68
|
+
to_copy_in_nodes = to_copy_node.all_input_nodes
|
69
|
+
if len(to_copy_in_nodes) != 1:
|
70
|
+
continue
|
71
|
+
bitwise_right_shift_node = to_copy_in_nodes[0]
|
72
|
+
if str(bitwise_right_shift_node.op) != "call_function" or str(bitwise_right_shift_node.target) != "aten.bitwise_right_shift.Tensor":
|
73
|
+
continue
|
74
|
+
bitwise_right_shift_in_nodes = bitwise_right_shift_node.all_input_nodes
|
75
|
+
if len(bitwise_right_shift_in_nodes) != 2:
|
76
|
+
continue
|
77
|
+
expand_node = bitwise_right_shift_in_nodes[0]
|
78
|
+
if str(expand_node.op) != "call_function" or str(expand_node.target) != "aten.expand.default":
|
79
|
+
continue
|
80
|
+
expand_in_nodes = expand_node.all_input_nodes
|
81
|
+
if len(expand_in_nodes) != 1:
|
82
|
+
continue
|
83
|
+
unsqueeze_0_node = expand_in_nodes[0]
|
84
|
+
if str(unsqueeze_0_node.op) != "call_function" or str(unsqueeze_0_node.target) != "aten.unsqueeze.default":
|
85
|
+
continue
|
86
|
+
unsqueeze_0_in_nodes = unsqueeze_0_node.all_input_nodes
|
87
|
+
if len(unsqueeze_0_in_nodes) != 1:
|
88
|
+
continue
|
89
|
+
const_0_node = unsqueeze_0_in_nodes[0]
|
90
|
+
if str(const_0_node.op) != "get_attr":
|
91
|
+
continue
|
92
|
+
unsqueeze_1_node = bitwise_right_shift_in_nodes[1]
|
93
|
+
if str(unsqueeze_1_node.op) != "call_function" or str(unsqueeze_1_node.target) != "aten.unsqueeze.default":
|
94
|
+
continue
|
95
|
+
unsqueeze_1_in_nodes = unsqueeze_1_node.all_input_nodes
|
96
|
+
if len(unsqueeze_1_in_nodes) != 1:
|
97
|
+
continue
|
98
|
+
const_1_node = unsqueeze_1_in_nodes[0]
|
99
|
+
if str(const_1_node.op) != "get_attr":
|
100
|
+
continue
|
101
|
+
|
102
|
+
self.supported_ops.enable_by_name(node)
|
103
|
+
self.supported_ops.enable_by_name(to_copy_node)
|
104
|
+
self.supported_ops.enable_by_name(bitwise_right_shift_node)
|
105
|
+
self.supported_ops.enable_by_name(expand_node)
|
106
|
+
self.supported_ops.enable_by_name(unsqueeze_0_node)
|
107
|
+
self.supported_ops.enable_by_name(unsqueeze_1_node)
|
108
|
+
|
109
|
+
def make_partitions(self, graph_module: GraphModule, options) -> GraphModule:
|
110
|
+
allow_single_node_partition = _is_testing(options)
|
111
|
+
self.capture_gptq_patterns(graph_module)
|
112
|
+
partitioner = CapabilityBasedPartitioner(
|
113
|
+
graph_module, self.supported_ops, allows_single_node_partition=allow_single_node_partition)
|
114
|
+
partitions = partitioner.propose_partitions()
|
115
|
+
self.add_get_attr_inputs(partitions)
|
116
|
+
fused_graph_module = partitioner.fuse_partitions(partitions)
|
117
|
+
|
118
|
+
return fused_graph_module
|