Skip to content

Commit 69cd867

Browse files
qti-hungjuiwJaswanth51
authored andcommitted
[QNN-EP] Introduce Level1 Transformer into qnn.preprocess (microsoft#25883)
### Description - Introduce Level1 Transformer into qnn.preprocess to support various optimizations. ### Motivation and Context - This change brings in several useful optimizations such as `ConvBnFusion` and `ConstantFolding`, which are part of `TransformerLevel::Level1` and can benefit QNNEP. - The goal is to optimize the ONNX model before quantization by integrating these passes into the Python tooling workflow.
1 parent c7997c2 commit 69cd867

File tree

1 file changed

+21
-3
lines changed
  • onnxruntime/python/tools/quantization/execution_providers/qnn

1 file changed

+21
-3
lines changed

onnxruntime/python/tools/quantization/execution_providers/qnn/preprocess.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
from __future__ import annotations
77

88
import logging
9+
import tempfile
910
from pathlib import Path
1011

1112
import onnx
1213

13-
from ....tools.onnx_model_utils import fix_output_shapes, make_input_shape_fixed
14+
from ....tools.onnx_model_utils import fix_output_shapes, make_input_shape_fixed, optimize_model
1415
from ....tools.remove_initializer_from_input import remove_initializer_from_input
1516
from ...fusions import FusionGelu, FusionLayerNormalization
1617
from ...onnx_model import ONNXModel
17-
from ...quant_utils import save_and_reload_model_with_shape_infer
1818
from .fusion_lpnorm import FusionLpNormalization
1919
from .fusion_spacetodepth import FusionSpaceToDepth
2020

@@ -93,7 +93,7 @@ def qnn_preprocess_model(
9393
"""
9494
modified = False
9595
model = model_input if isinstance(model_input, onnx.ModelProto) else onnx.load_model(model_input)
96-
model = save_and_reload_model_with_shape_infer(model)
96+
model = save_and_reload_optimize_model(model, shape_infer=True)
9797
onnx_model = ONNXModel(model)
9898

9999
# Optionally, fix the dynamic input shapes.
@@ -178,6 +178,24 @@ def qnn_preprocess_model(
178178
return modified
179179

180180

181+
def save_and_reload_optimize_model(model: onnx.ModelProto, shape_infer: bool) -> onnx.ModelProto:
182+
with tempfile.TemporaryDirectory(prefix="ort.qnn_preproc.") as qnn_preproc_tmp_dir:
183+
model_in_path = Path(qnn_preproc_tmp_dir).joinpath("qnn_proc_input.onnx")
184+
onnx.save_model(model, model_in_path, save_as_external_data=True)
185+
if shape_infer:
186+
model_infer_path = Path(qnn_preproc_tmp_dir).joinpath("qnn_proc_infer.onnx")
187+
onnx.shape_inference.infer_shapes_path(str(model_in_path), str(model_infer_path))
188+
model_in_path = model_infer_path
189+
model_out_path = Path(qnn_preproc_tmp_dir).joinpath("qnn_proc_output.onnx")
190+
optimize_model(model_in_path, model_out_path)
191+
ret_model = onnx.load_model(model_out_path)
192+
ret_metaprops = {"onnx.infer": "onnxruntime.tools.qnn.preprocess"}
193+
if ret_model.metadata_props:
194+
ret_metaprops.update(ret_model.metadata_props)
195+
onnx.helper.set_model_props(ret_model, ret_metaprops)
196+
return ret_model
197+
198+
181199
class InputOutputNameMap:
182200
def __init__(
183201
self,

0 commit comments

Comments
 (0)