Skip to content

Commit 5867f97

Browse files
committed
NXP backend: Automatic application of RemoveIOQuantOpsPass in NeutronEdgePassManager
1 parent 2fbd13a commit 5867f97

File tree

3 files changed

+26
-25
lines changed

3 files changed

+26
-25
lines changed

backends/nxp/edge_passes/neutron_edge_pass_manager.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
import copy
77

8+
from executorch.backends.nxp.backend.ir.edge_passes.remove_io_quant_ops_pass import (
9+
RemoveIOQuantOpsPass,
10+
)
11+
812
from executorch.backends.nxp.edge_passes.move_auxiliary_operator_into_separate_qdq_cluster_pass import (
913
MoveLeadingAuxiliaryOperatorIntoSeparateQDQClusterPass,
1014
MoveTrailingAuxiliaryOperatorIntoSeparateQDQClusterPass,
@@ -24,7 +28,9 @@
2428

2529
class NeutronEdgePassManager(PassManager):
2630

27-
def __init__(self, passes: list[NeutronEdgePass] = None):
31+
def __init__(
32+
self, passes: list[NeutronEdgePass] = None, remove_io_quant_ops: bool = False
33+
):
2834
passes: list[NeutronEdgePass] = passes or [
2935
MoveLeadingAuxiliaryOperatorIntoSeparateQDQClusterPass(),
3036
MoveTrailingAuxiliaryOperatorIntoSeparateQDQClusterPass(),
@@ -35,6 +41,8 @@ def __init__(self, passes: list[NeutronEdgePass] = None):
3541
steps=10, # Empirical value. At most 10 cycles of passes will be run.
3642
)
3743

44+
self.remove_io_quant_ops = remove_io_quant_ops
45+
3846
def _transform_graph_module(self, module: nn.Module) -> PassResult:
3947
"""Apply the passes to a single graph module."""
4048
pass_result: PassResult = super().__call__(module)
@@ -78,12 +86,17 @@ def __call__(self, epm: EdgeProgramManager) -> EdgeProgramManager:
7886

7987
new_programs[name] = new_program
8088

81-
if len(new_programs) == 0:
82-
# No passes were run, return the old EdgeProgramManager.
83-
return epm
89+
result = epm
8490

85-
else:
86-
# Return a new EdgeProgramManager with the updated programs.
87-
return EdgeProgramManager(
91+
if len(new_programs) > 0:
92+
# Use a new EdgeProgramManager with the updated programs if any update was performed.
93+
result = EdgeProgramManager(
8894
new_programs, copy.deepcopy(epm._config_methods), epm.compile_config
8995
)
96+
97+
if self.remove_io_quant_ops:
98+
result = result.transform(
99+
[RemoveIOQuantOpsPass(edge_program_manager=result)]
100+
)
101+
102+
return result

backends/nxp/tests/executorch_pipeline.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
from executorch.backends.nxp.edge_passes.neutron_edge_pass_manager import (
1616
NeutronEdgePassManager,
1717
)
18-
from executorch.backends.nxp.edge_passes.remove_io_quant_ops_pass import (
19-
RemoveIOQuantOpsPass,
20-
)
2118
from executorch.backends.nxp.neutron_partitioner import NeutronPartitioner
2219
from executorch.backends.nxp.nxp_backend import generate_neutron_compile_spec
2320
from executorch.backends.nxp.quantizer.neutron_quantizer import NeutronQuantizer
@@ -115,12 +112,9 @@ def to_quantized_edge_program(
115112
edge_compile_config=edge_compile_config,
116113
)
117114

118-
edge_program_manager = NeutronEdgePassManager()(edge_program_manager)
119-
120-
if remove_quant_io_ops:
121-
edge_program_manager = edge_program_manager.transform(
122-
[RemoveIOQuantOpsPass(edge_program_manager=edge_program_manager)]
123-
)
115+
edge_program_manager = NeutronEdgePassManager(
116+
remove_io_quant_ops=remove_quant_io_ops
117+
)(edge_program_manager)
124118

125119
compile_spec = generate_neutron_compile_spec(
126120
target,

examples/nxp/aot_neutron_compile.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
import executorch.kernels.quantized # noqa F401
1616

1717
import torch
18-
from executorch.backends.nxp.edge_passes.remove_io_quant_ops_pass import (
19-
RemoveIOQuantOpsPass,
20-
)
2118
from executorch.backends.nxp.edge_passes.neutron_edge_pass_manager import (
2219
NeutronEdgePassManager,
2320
)
@@ -262,12 +259,9 @@ def _get_batch_size(data):
262259

263260
logging.debug(f"Exported graph:\n{edge_program_manager.exported_program().graph}")
264261

265-
edge_program_manager = NeutronEdgePassManager()(edge_program_manager)
266-
267-
if args.remove_quant_io_ops:
268-
edge_program_manager = edge_program_manager.transform(
269-
[RemoveIOQuantOpsPass(edge_program_manager=edge_program_manager)]
270-
)
262+
edge_program_manager = NeutronEdgePassManager(
263+
remove_io_quant_ops=args.remove_quant_io_ops
264+
)(edge_program_manager)
271265

272266
# 5. Delegate to Neutron
273267
if args.delegate:

0 commit comments

Comments
 (0)