Skip to content

Commit c19c8bb

Browse files
committed
NXP backend: Propagate flag from executorch_pipeline to model_builder, to delegate format related transpositions of input/output tensors.
1 parent 211176d commit c19c8bb

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed

backends/nxp/backend/ir/conversion_config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def __init__(self, args: dict | None = None):
1313
1414
:param args: Optional dictionary with conversion arguments. Unknown arguments are ignored.
1515
"""
16+
self.use_neutron_for_format_conversion: bool = False
1617
self.keep_io_format: bool = False
1718
self.allow_inputs_stripping: bool = True
1819
self.qdq_aware_conversion: bool = True

backends/nxp/backend/ir/converter/builder/model_builder.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ def finish(self) -> tflite_model.Model:
444444
:return: The final TFLite model.
445445
"""
446446

447-
if self.conversion_config.keep_io_format:
447+
if self.conversion_config.use_neutron_for_format_conversion:
448448
# If the input or output is channels last, add a Transpose operator, to make is channels first.
449449
self._make_inputs_channels_first()
450450
self._make_outputs_channels_first()

backends/nxp/nxp_backend.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from executorch.backends.nxp.backend.edge_program_converter import (
2020
EdgeProgramToIRConverter,
2121
)
22+
from executorch.backends.nxp.backend.ir.conversion_config import ConversionConfig
2223
from executorch.backends.nxp.backend.ir.tensor_formatting import TensorFormat
2324
from executorch.backends.nxp.backend.neutron_converter_manager import (
2425
NeutronConverterManager,
@@ -44,6 +45,7 @@ def __init__(self):
4445
self.output_format = None
4546
self.operators_not_to_delegate: List[str] = []
4647
self.neutron_converter_flavor = None
48+
self.use_neutron_for_format_conversion = False
4749

4850
def _replace_colons(self, operator: str) -> str:
4951
"""
@@ -57,6 +59,7 @@ def neutron_compile_spec(
5759
neutron_converter_flavor: str,
5860
extra_flags: Optional[str] = None,
5961
operators_not_to_delegate: Optional[List[str]] = None,
62+
use_neutron_for_format_conversion: bool = False,
6063
):
6164
"""
6265
Generate compile spec for Neutron NPU
@@ -67,6 +70,9 @@ def neutron_compile_spec(
6770
"'neutron_converter_SDK_25_09' has flavor 'SDK_25_09'.
6871
extra_flags: Extra flags for the Neutron compiler
6972
operators_not_to_delegate: List of operators that should not be delegated
73+
use_neutron_for_format_conversion: If True, the EdgeProgramToIRConverter will insert `Transpose` ops to
74+
ensure that the IO matches the executorch partition, which will be
75+
delegated to Neutron.
7076
"""
7177

7278
self.neutron_converter_flavor = neutron_converter_flavor
@@ -86,6 +92,8 @@ def neutron_compile_spec(
8692
self._replace_colons(op) for op in operators_not_to_delegate
8793
]
8894

95+
self.use_neutron_for_format_conversion = use_neutron_for_format_conversion
96+
8997
return self
9098

9199
def build(self):
@@ -104,6 +112,10 @@ def build(self):
104112
"operators_not_to_delegate",
105113
",".join(self.operators_not_to_delegate).encode(),
106114
),
115+
CompileSpec(
116+
"use_neutron_for_format_conversion",
117+
f"{self.use_neutron_for_format_conversion}".encode(),
118+
),
107119
]
108120

109121
return self.compile_spec
@@ -115,6 +127,7 @@ def generate_neutron_compile_spec(
115127
system_config: Optional[str] = None,
116128
extra_flags: Optional[str] = None,
117129
operators_not_to_delegate: Optional[List[str]] = None,
130+
use_neutron_for_format_conversion: bool = False,
118131
) -> List[CompileSpec]:
119132
return (
120133
NeutronCompileSpecBuilder()
@@ -123,6 +136,7 @@ def generate_neutron_compile_spec(
123136
neutron_converter_flavor,
124137
extra_flags=extra_flags,
125138
operators_not_to_delegate=operators_not_to_delegate,
139+
use_neutron_for_format_conversion=use_neutron_for_format_conversion,
126140
)
127141
.build()
128142
)
@@ -145,6 +159,7 @@ def preprocess( # noqa C901
145159
binary = bytes()
146160
target = ""
147161
neutron_converter_flavor = ""
162+
use_neutron_for_format_conversion = None
148163
for spec in compile_spec:
149164
if spec.key == "output_format":
150165
output_format = spec.value.decode()
@@ -154,6 +169,8 @@ def preprocess( # noqa C901
154169
compile_flags.append(spec.value.decode())
155170
if spec.key == "neutron_converter_flavor":
156171
neutron_converter_flavor = spec.value.decode()
172+
if spec.key == "use_neutron_for_format_conversion":
173+
use_neutron_for_format_conversion = spec.value.decode() == "True"
157174

158175
# Check that the output format is set in the compile spec
159176
if not output_format:
@@ -180,9 +197,15 @@ def preprocess( # noqa C901
180197
).transform()
181198

182199
# Convert the edge program to TFLite.
200+
conversion_config = ConversionConfig(
201+
{"use_neutron_for_format_conversion": use_neutron_for_format_conversion}
202+
if use_neutron_for_format_conversion is not None
203+
else {}
204+
)
183205
tflite_model, io_formats = EdgeProgramToIRConverter().convert_program(
184206
edge_program,
185207
neutron_target_spec=NeutronTargetSpec(target, neutron_converter_flavor),
208+
conversion_config=conversion_config,
186209
)
187210

188211
neutron_model = NeutronConverterManager(neutron_converter_flavor).convert(

backends/nxp/tests/executorch_pipeline.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ def to_quantized_edge_program(
105105
remove_quant_io_ops=False,
106106
custom_delegation_options=CustomDelegationOptions(), # noqa B008
107107
get_quantizer_fn=None,
108+
use_neutron_for_format_conversion=False,
108109
) -> EdgeProgramManager:
109110
_neutron_target_spec = NeutronTargetSpec(target, neutron_converter_flavor)
110111
if get_quantizer_fn is None:
@@ -129,6 +130,7 @@ def to_quantized_edge_program(
129130
target,
130131
operators_not_to_delegate=operators_not_to_delegate,
131132
neutron_converter_flavor=neutron_converter_flavor,
133+
use_neutron_for_format_conversion=use_neutron_for_format_conversion,
132134
)
133135
partitioners = [
134136
NeutronPartitioner(

0 commit comments

Comments
 (0)