Skip to content

Commit 5ddc399

Browse files
committed
NXP backend: Delegate input/output format transpositions by default.
1 parent 9bec4fe commit 5ddc399

22 files changed

+103
-35
lines changed

backends/nxp/backend/ir/conversion_config.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +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
17-
self.keep_io_format: bool = False
16+
self.use_neutron_for_format_conversion: bool = True
1817
self.allow_inputs_stripping: bool = True
1918
self.qdq_aware_conversion: bool = True
2019
self.symbolic_dimensions_mapping: dict[str, int] | None = None

backends/nxp/nxp_backend.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def __init__(self):
4545
self.output_format = None
4646
self.operators_not_to_delegate: List[str] = []
4747
self.neutron_converter_flavor = None
48-
self.use_neutron_for_format_conversion = False
48+
self.use_neutron_for_format_conversion = True
4949

5050
def _replace_colons(self, operator: str) -> str:
5151
"""
@@ -59,7 +59,7 @@ def neutron_compile_spec(
5959
neutron_converter_flavor: str,
6060
extra_flags: Optional[str] = None,
6161
operators_not_to_delegate: Optional[List[str]] = None,
62-
use_neutron_for_format_conversion: bool = False,
62+
use_neutron_for_format_conversion: bool = True,
6363
):
6464
"""
6565
Generate compile spec for Neutron NPU
@@ -127,7 +127,7 @@ def generate_neutron_compile_spec(
127127
system_config: Optional[str] = None,
128128
extra_flags: Optional[str] = None,
129129
operators_not_to_delegate: Optional[List[str]] = None,
130-
use_neutron_for_format_conversion: bool = False,
130+
use_neutron_for_format_conversion: bool = True,
131131
) -> List[CompileSpec]:
132132
return (
133133
NeutronCompileSpecBuilder()

backends/nxp/tests/executorch_pipeline.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +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,
108+
use_neutron_for_format_conversion=True,
109109
) -> EdgeProgramManager:
110110
_neutron_target_spec = NeutronTargetSpec(target, neutron_converter_flavor)
111111
if get_quantizer_fn is None:
@@ -156,8 +156,13 @@ def to_quantized_edge_program(
156156
def to_quantized_executorch_program(
157157
model: torch.nn.Module,
158158
input_spec: tuple[ModelInputSpec, ...] | tuple[int, ...] | list[tuple[int, ...]],
159+
use_neutron_for_format_conversion: bool = True,
159160
) -> ExecutorchProgramManager:
160-
edge_program_manager = to_quantized_edge_program(model, input_spec)
161+
edge_program_manager = to_quantized_edge_program(
162+
model,
163+
input_spec,
164+
use_neutron_for_format_conversion=use_neutron_for_format_conversion,
165+
)
161166

162167
return edge_program_manager.to_executorch(
163168
config=ExecutorchBackendConfig(extract_delegate_segments=False)

backends/nxp/tests/ir/converter/node_converter/test_abs_converter.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
from executorch.backends.nxp.tests.executors import (
1515
convert_run_compare,
1616
graph_contains_any_of_ops,
17-
ToNCHWPreprocess,
18-
ToNHWCPreprocess,
17+
ToChannelFirstPreprocess,
18+
ToChannelLastPreprocess,
1919
)
20+
2021
from executorch.exir.dialects._ops import ops as exir_ops
2122
from torch.export import ExportedProgram
2223

@@ -67,7 +68,9 @@ def test_conv_abs(mocker, input_shape: tuple[int] = (1, 3, 112, 112)):
6768

6869
converter_spy = mocker.spy(EdgeProgramToIRConverter, "convert_program")
6970

70-
quantized_program = to_quantized_edge_program(model, input_shape).exported_program()
71+
quantized_program = to_quantized_edge_program(
72+
model, input_shape, use_neutron_for_format_conversion=False
73+
).exported_program()
7174

7275
tflite_flatbuffers_model, io_formats = converter_spy.spy_return
7376
exported_program: ExportedProgram = converter_spy.call_args.args[1]
@@ -80,8 +83,8 @@ def test_conv_abs(mocker, input_shape: tuple[int] = (1, 3, 112, 112)):
8083
convert_run_compare(
8184
exported_program,
8285
tfl_model=tflite_flatbuffers_model,
83-
tflite_input_preprocess=ToNHWCPreprocess(),
84-
tflite_output_preprocess=ToNCHWPreprocess(),
86+
tflite_input_preprocess=ToChannelLastPreprocess(),
87+
tflite_output_preprocess=ToChannelFirstPreprocess(),
8588
input_data=input_data,
8689
atol=1.0,
8790
)

backends/nxp/tests/ir/converter/node_converter/test_adaptive_avg_pool2d_converter.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ def test_adaptive_avg_pool_2d_delegated_quant_conversion(
4747
converter_spy = mocker.spy(EdgeProgramToIRConverter, "convert_program")
4848

4949
# Run conversion
50-
edge_program = to_quantized_edge_program(model, input_shape).exported_program()
50+
edge_program = to_quantized_edge_program(
51+
model, input_shape, use_neutron_for_format_conversion=False
52+
).exported_program()
5153
nodes = [str(node) for node in edge_program.graph.nodes]
5254

5355
# Input size is a multiple of output size, can be converted to AveragePool, node is delegated
@@ -91,7 +93,9 @@ def test_adaptive_avg_pool_2d_non_delegated_quant_conversion(
9193
converter_spy = mocker.spy(EdgeProgramToIRConverter, "convert_program")
9294

9395
# Run conversion
94-
edge_program = to_quantized_edge_program(model, input_shape).exported_program()
96+
edge_program = to_quantized_edge_program(
97+
model, input_shape, use_neutron_for_format_conversion=False
98+
).exported_program()
9599
nodes = list(edge_program.graph.nodes)
96100

97101
# Input size is not a multiple of output size, cannot be converted to AveragePool, node is not delegated
@@ -122,7 +126,9 @@ def test_adaptive_avg_pool_2d_mean_dim_quant_conversion(mocker):
122126
converter_spy = mocker.spy(EdgeProgramToIRConverter, "convert_program")
123127

124128
# Run conversion
125-
_ = to_quantized_edge_program(model, input_shape)
129+
_ = to_quantized_edge_program(
130+
model, input_shape, use_neutron_for_format_conversion=False
131+
)
126132

127133
# Capture generated model
128134
tflite_flatbuffers_model, io_formats = converter_spy.spy_return

backends/nxp/tests/ir/converter/node_converter/test_add_tensor_converter.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ def test_add_tensor_w_conv_quant_conversion(mocker, input_shape):
103103
converter_spy = mocker.spy(EdgeProgramToIRConverter, "convert_program")
104104

105105
# Run conversion
106-
_ = to_quantized_edge_program(model, input_shape)
106+
_ = to_quantized_edge_program(
107+
model, input_shape, use_neutron_for_format_conversion=False
108+
)
107109

108110
# Capture generated model
109111
tflite_flatbuffers_model, io_formats = converter_spy.spy_return

backends/nxp/tests/ir/converter/node_converter/test_avg_pool2d_converter.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
import numpy as np
77
import pytest
88
import torch
9-
109
from executorch.backends.nxp.backend.edge_program_converter import (
1110
EdgeProgramToIRConverter,
1211
)
12+
13+
from executorch.backends.nxp.backend.ir.conversion_config import ConversionConfig
1314
from executorch.backends.nxp.backend.ir.converter.builder.model_builder import (
1415
ModelBuilder,
1516
)
@@ -91,6 +92,9 @@ def test_avg_pool_2d_conversion(input_shape, padding, count_include_pad):
9192
input_data,
9293
tflite_input_preprocess=ToNHWCPreprocess(),
9394
tflite_output_preprocess=ToNCHWPreprocess(),
95+
conversion_config=ConversionConfig(
96+
{"use_neutron_for_format_conversion": False}
97+
),
9498
)
9599

96100

@@ -145,7 +149,9 @@ def test_avg_pool_2d_quant_conversion(mocker, input_shape, padding, count_includ
145149
converter_spy = mocker.spy(EdgeProgramToIRConverter, "convert_program")
146150

147151
# Run conversion
148-
_ = to_quantized_edge_program(model, input_shape)
152+
_ = to_quantized_edge_program(
153+
model, input_shape, use_neutron_for_format_conversion=False
154+
)
149155

150156
# Capture generated model
151157
tflite_flatbuffers_model, io_formats = converter_spy.spy_return
@@ -172,7 +178,9 @@ def test_avg_pool_2d_quant_conversion__padded(mocker):
172178
ops_spy = mocker.spy(ModelBuilder, "finish")
173179

174180
# Run conversion
175-
_ = to_quantized_edge_program(model, input_shape)
181+
_ = to_quantized_edge_program(
182+
model, input_shape, use_neutron_for_format_conversion=False
183+
)
176184

177185
# Capture the converter operators.
178186
ops = ops_spy.spy_return.sub_graphs[0].operators.vector

backends/nxp/tests/ir/converter/node_converter/test_clone_converter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def test_conv_dropout_quant(self, inplace_dropout: bool, input_shape: tuple[int]
113113
owner=EdgeProgramToIRConverter,
114114
) as converter_spy:
115115
quantized_program = to_quantized_edge_program(
116-
model, input_shape
116+
model, input_shape, use_neutron_for_format_conversion=False
117117
).exported_program()
118118

119119
tflite_flatbuffers_model, _ = converter_spy.calls[-1].return_value

backends/nxp/tests/ir/converter/node_converter/test_constant_pad_nd_converter.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import pytest
88
import torch
99

10+
from executorch.backends.nxp.backend.ir.conversion_config import ConversionConfig
1011
from executorch.backends.nxp.tests.executorch_pipeline import (
1112
to_edge_program,
1213
to_quantized_edge_program,
@@ -101,6 +102,9 @@ def test_constant_pad_nd_conversion__channels_first(input_shape, paddings):
101102
input_data,
102103
tflite_input_preprocess=ToNHWCPreprocess(),
103104
tflite_output_preprocess=ToNCHWPreprocess(),
105+
conversion_config=ConversionConfig(
106+
{"use_neutron_for_format_conversion": False}
107+
),
104108
)
105109

106110

backends/nxp/tests/ir/converter/node_converter/test_conv_converter.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from executorch.backends.nxp.backend.edge_program_converter import (
1111
EdgeProgramToIRConverter,
1212
)
13+
from executorch.backends.nxp.backend.ir.conversion_config import ConversionConfig
1314
from executorch.backends.nxp.backend.ir.converter.builder.model_builder import (
1415
ModelBuilder,
1516
)
@@ -375,7 +376,9 @@ def test_conv2d_quant_conversion(mocker, model: torch.nn.Module, input_shape):
375376
converter_spy = mocker.spy(EdgeProgramToIRConverter, "convert_program")
376377

377378
# Run conversion
378-
_ = to_quantized_edge_program(model, input_shape)
379+
_ = to_quantized_edge_program(
380+
model, input_shape, use_neutron_for_format_conversion=False
381+
)
379382

380383
# Capture generated model
381384
tflite_flatbuffers_model, io_formats = converter_spy.spy_return
@@ -451,6 +454,7 @@ def test_conv2d_conversion__depthwise__quantized(
451454
kernel_size=kernel_shape,
452455
),
453456
tuple(input_shape),
457+
use_neutron_for_format_conversion=False,
454458
).exported_program()
455459

456460
ops = spy.spy_return.sub_graphs[0].operators.vector
@@ -485,6 +489,9 @@ def test_conv2d_conversion__depthwise__padded(padding, mocker):
485489
tflite_input_preprocess=ToChannelLastPreprocess(),
486490
tflite_output_preprocess=ToChannelFirstPreprocess(),
487491
atol=4e-7,
492+
conversion_config=ConversionConfig(
493+
{"use_neutron_for_format_conversion": False}
494+
),
488495
)
489496
conversion_result = spy.spy_return
490497
ops = conversion_result.sub_graphs[0].operators.vector
@@ -505,6 +512,7 @@ def test_conv2d_conversion__depthwise__padded__quantized(padding, mocker):
505512
group=group, in_channels=group, out_channels=group, padding=padding
506513
),
507514
tuple(input_shape),
515+
use_neutron_for_format_conversion=False,
508516
).exported_program()
509517

510518
ops = spy.spy_return.sub_graphs[0].operators.vector

0 commit comments

Comments
 (0)