Skip to content

Commit 83b2c9f

Browse files
committed
NXP backend: Add use_new_neutron_c_flag to NeutronTargetSpec
1 parent b04cc65 commit 83b2c9f

5 files changed

Lines changed: 69 additions & 67 deletions

File tree

backends/nxp/backend/neutron_target_spec.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@
88
from enum import Enum
99

1010
import torch
11-
1211
from executorch.backends.nxp.backend.neutron_converter_manager import (
1312
NeutronConverterManager,
1413
)
1514
from executorch.exir.dialects._ops import ops as exir_ops
16-
1715
from torch.fx import Node
1816

1917

@@ -98,12 +96,13 @@ class NeutronTargetSpec:
9896
The functionality for probing the properties of Neutron Target.
9997
"""
10098

101-
def __init__(self, target: str):
99+
def __init__(self, target: str, use_new_flow_neutron_c: bool = False):
102100

103101
converter_manager = NeutronConverterManager()
104102
converter_manager.verify_target(target)
105103
neutron_converter = converter_manager.get_converter()
106104
self.neutron_target = neutron_converter.getNeutronTarget(target)
105+
self.use_new_flow_neutron_c = use_new_flow_neutron_c
107106

108107
if self.is_subsystem():
109108
raise ValueError(

backends/nxp/nxp_backend.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import numpy as np
1616
import torch
17-
1817
from executorch.backends.nxp.backend.custom_delegation_options import (
1918
CustomDelegationOptions,
2019
)
@@ -86,7 +85,9 @@ def neutron_compile_spec(
8685
:return: self for method chaining
8786
"""
8887

89-
self.config = NeutronTargetSpec(config)
88+
self.config = NeutronTargetSpec(
89+
config, use_new_flow_neutron_c=use_new_flow_neutron_c
90+
)
9091

9192
assert (
9293
self.output_format is None

backends/nxp/quantizer/neutron_quantizer.py

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
_get_default_passes,
1010
NeutronAtenPassManager,
1111
)
12-
1312
from executorch.backends.nxp.backend.neutron_target_spec import NeutronTargetSpec
1413
from executorch.backends.nxp.quantizer.patterns import (
1514
AbsPattern,
@@ -255,53 +254,63 @@ def __init__(self, neutron_target_spec: NeutronTargetSpec, is_qat: bool = False)
255254
OpQuantizer = NeutronAtenQuantizer
256255
super().__init__(
257256
[
258-
OpQuantizer(AbsPattern(is_qat=is_qat), static_qconfig),
259-
OpQuantizer(AdaptiveAvgPoolPattern(is_qat=is_qat), static_qconfig),
260-
OpQuantizer(AddTensorPattern(is_qat=is_qat), static_qconfig),
257+
OpQuantizer(AbsPattern(self, is_qat=is_qat), static_qconfig),
258+
OpQuantizer(
259+
AdaptiveAvgPoolPattern(self, is_qat=is_qat), static_qconfig
260+
),
261+
OpQuantizer(AddTensorPattern(self, is_qat=is_qat), static_qconfig),
261262
OpQuantizer(AddmmPattern(self, is_qat=is_qat), static_fc_qconfig),
262-
OpQuantizer(AvgPool1DPattern(is_qat=is_qat), static_qconfig),
263-
OpQuantizer(AvgPool2DPattern(is_qat=is_qat), static_qconfig),
264-
OpQuantizer(BatchNormPattern(is_qat=is_qat), static_qconfig),
265-
OpQuantizer(BMMPattern(is_qat=is_qat), static_qconfig),
266-
OpQuantizer(CatPattern(is_qat=is_qat), static_qconfig),
267-
OpQuantizer(ClampPattern(is_qat=is_qat), static_qconfig),
263+
OpQuantizer(AvgPool1DPattern(self, is_qat=is_qat), static_qconfig),
264+
OpQuantizer(AvgPool2DPattern(self, is_qat=is_qat), static_qconfig),
265+
OpQuantizer(BatchNormPattern(self, is_qat=is_qat), static_qconfig),
266+
OpQuantizer(BMMPattern(self, is_qat=is_qat), static_qconfig),
267+
OpQuantizer(CatPattern(self, is_qat=is_qat), static_qconfig),
268+
OpQuantizer(ClampPattern(self, is_qat=is_qat), static_qconfig),
268269
OpQuantizer(Conv2dPattern(self, is_qat=is_qat), static_qconfig),
269270
OpQuantizer(
270271
ConvTranspose2dPattern(self, is_qat=is_qat), static_qconfig
271272
),
272-
OpQuantizer(DropoutPattern(is_qat=is_qat), static_qconfig),
273-
OpQuantizer(FlattenPattern(is_qat=is_qat), static_qconfig),
274-
OpQuantizer(HardTanhPattern(is_qat=is_qat), static_qconfig),
275-
OpQuantizer(HardTanhInPlacePattern(is_qat=is_qat), static_qconfig),
276-
OpQuantizer(LeakyReluPattern(is_qat=is_qat), static_fc_qconfig),
277-
OpQuantizer(LeakyReluInPlacePattern(is_qat=is_qat), static_fc_qconfig),
273+
OpQuantizer(DropoutPattern(self, is_qat=is_qat), static_qconfig),
274+
OpQuantizer(FlattenPattern(self, is_qat=is_qat), static_qconfig),
275+
OpQuantizer(HardTanhPattern(self, is_qat=is_qat), static_qconfig),
276+
OpQuantizer(
277+
HardTanhInPlacePattern(self, is_qat=is_qat), static_qconfig
278+
),
279+
OpQuantizer(LeakyReluPattern(self, is_qat=is_qat), static_fc_qconfig),
280+
OpQuantizer(
281+
LeakyReluInPlacePattern(self, is_qat=is_qat), static_fc_qconfig
282+
),
278283
OpQuantizer(LinearPattern(self, is_qat=is_qat), static_fc_qconfig),
279-
OpQuantizer(MaxPool1DPattern(is_qat=is_qat), static_qconfig),
280-
OpQuantizer(MaxPool2DPattern(is_qat=is_qat), static_qconfig),
281-
OpQuantizer(MeanDimPattern(is_qat=is_qat), static_qconfig),
284+
OpQuantizer(MaxPool1DPattern(self, is_qat=is_qat), static_qconfig),
285+
OpQuantizer(MaxPool2DPattern(self, is_qat=is_qat), static_qconfig),
286+
OpQuantizer(MeanDimPattern(self, is_qat=is_qat), static_qconfig),
282287
OpQuantizer(MmPattern(self, is_qat=is_qat), static_qconfig),
283-
OpQuantizer(MulTensorPattern(is_qat=is_qat), static_qconfig),
284-
OpQuantizer(NegPattern(is_qat=is_qat), static_qconfig),
285-
OpQuantizer(PadPattern(is_qat=is_qat), static_qconfig),
286-
OpQuantizer(PermutePattern(is_qat=is_qat), static_qconfig),
287-
OpQuantizer(PReLUPattern(is_qat=is_qat), static_qconfig),
288-
OpQuantizer(ReluPattern(is_qat=is_qat), static_qconfig),
289-
OpQuantizer(ReluInPlacePattern(is_qat=is_qat), static_qconfig),
290-
OpQuantizer(ReshapePattern(is_qat=is_qat), static_qconfig),
291-
OpQuantizer(SigmoidPattern(is_qat=is_qat), static_qconfig),
292-
OpQuantizer(SliceTensorPattern(is_qat=is_qat), static_qconfig),
293-
OpQuantizer(SoftMaxPattern(is_qat=is_qat), static_qconfig),
294-
OpQuantizer(SqueezeDimPattern(is_qat=is_qat), static_qconfig),
295-
OpQuantizer(SqueezeDimsPattern(is_qat=is_qat), static_qconfig),
296-
OpQuantizer(SqueezePattern(is_qat=is_qat), static_qconfig),
297-
OpQuantizer(SubTensorPattern(is_qat=is_qat), static_qconfig),
298-
OpQuantizer(TanhPattern(is_qat=is_qat), static_qconfig),
299-
OpQuantizer(TanhInPlacePattern(is_qat=is_qat), static_qconfig),
300-
OpQuantizer(TransposeIntPattern(is_qat=is_qat), static_qconfig),
301-
OpQuantizer(UnsqueezePattern(is_qat=is_qat), static_qconfig),
302-
OpQuantizer(UpsampleBilinear2DPattern(is_qat=is_qat), static_qconfig),
303-
OpQuantizer(UpsampleNearest2DPattern(is_qat=is_qat), static_qconfig),
304-
OpQuantizer(ViewPattern(is_qat=is_qat), static_qconfig),
288+
OpQuantizer(MulTensorPattern(self, is_qat=is_qat), static_qconfig),
289+
OpQuantizer(NegPattern(self, is_qat=is_qat), static_qconfig),
290+
OpQuantizer(PadPattern(self, is_qat=is_qat), static_qconfig),
291+
OpQuantizer(PermutePattern(self, is_qat=is_qat), static_qconfig),
292+
OpQuantizer(PReLUPattern(self, is_qat=is_qat), static_qconfig),
293+
OpQuantizer(ReluPattern(self, is_qat=is_qat), static_qconfig),
294+
OpQuantizer(ReluInPlacePattern(self, is_qat=is_qat), static_qconfig),
295+
OpQuantizer(ReshapePattern(self, is_qat=is_qat), static_qconfig),
296+
OpQuantizer(SigmoidPattern(self, is_qat=is_qat), static_qconfig),
297+
OpQuantizer(SliceTensorPattern(self, is_qat=is_qat), static_qconfig),
298+
OpQuantizer(SoftMaxPattern(self, is_qat=is_qat), static_qconfig),
299+
OpQuantizer(SqueezeDimPattern(self, is_qat=is_qat), static_qconfig),
300+
OpQuantizer(SqueezeDimsPattern(self, is_qat=is_qat), static_qconfig),
301+
OpQuantizer(SqueezePattern(self, is_qat=is_qat), static_qconfig),
302+
OpQuantizer(SubTensorPattern(self, is_qat=is_qat), static_qconfig),
303+
OpQuantizer(TanhPattern(self, is_qat=is_qat), static_qconfig),
304+
OpQuantizer(TanhInPlacePattern(self, is_qat=is_qat), static_qconfig),
305+
OpQuantizer(TransposeIntPattern(self, is_qat=is_qat), static_qconfig),
306+
OpQuantizer(UnsqueezePattern(self, is_qat=is_qat), static_qconfig),
307+
OpQuantizer(
308+
UpsampleBilinear2DPattern(self, is_qat=is_qat), static_qconfig
309+
),
310+
OpQuantizer(
311+
UpsampleNearest2DPattern(self, is_qat=is_qat), static_qconfig
312+
),
313+
OpQuantizer(ViewPattern(self, is_qat=is_qat), static_qconfig),
305314
]
306315
)
307316

backends/nxp/quantizer/patterns.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from functools import partial
1111

1212
import torch
13-
1413
from executorch.backends.nxp.quantizer.utils import (
1514
get_bias_qparams,
1615
get_bias_qparams_transp_conv,
@@ -86,7 +85,8 @@ class PartitionAnchors:
8685

8786

8887
class QuantizationPattern(ABC):
89-
def __init__(self, is_qat: bool = False):
88+
def __init__(self, neutron_quantizer, is_qat: bool = False):
89+
self.neutron_quantizer = neutron_quantizer
9090
self.is_qat = is_qat
9191

9292
@abstractmethod
@@ -157,9 +157,6 @@ def get_anchors(
157157

158158

159159
class BatchNormPattern(QuantizationPattern):
160-
def __init__(self, is_qat: bool):
161-
super().__init__(is_qat=is_qat)
162-
163160
def partition_types(self) -> list[OpOverload]:
164161
# BatchNorm quantization is needed only when in QAT mode
165162
return [torch.ops.aten.batch_norm.default] if self.is_qat else []
@@ -227,9 +224,8 @@ def partition_types(self):
227224

228225
class AddmmPattern(QuantizationPattern):
229226
def __init__(self, neutron_quantizer, is_qat: bool):
230-
super().__init__(is_qat=is_qat)
227+
super().__init__(neutron_quantizer, is_qat=is_qat)
231228

232-
self.neutron_quantizer = neutron_quantizer
233229
self.neutron_target_info = (
234230
self.neutron_quantizer.neutron_target_spec.neutron_target_info
235231
)
@@ -488,9 +484,8 @@ def get_anchors(
488484

489485
class Conv2dPattern(ConvPattern):
490486
def __init__(self, neutron_quantizer, is_qat: bool = False):
491-
super().__init__(is_qat=is_qat)
487+
super().__init__(neutron_quantizer, is_qat=is_qat)
492488

493-
self.neutron_quantizer = neutron_quantizer
494489
self.neutron_target_info = (
495490
self.neutron_quantizer.neutron_target_spec.neutron_target_info
496491
)
@@ -582,7 +577,7 @@ def get_anchors(
582577

583578
class ConvTranspose2dPattern(QuantizationPattern):
584579
def __init__(self, neutron_quantizer, is_qat: bool = False):
585-
super().__init__(is_qat=is_qat)
580+
super().__init__(neutron_quantizer, is_qat=is_qat)
586581

587582
self.neutron_quantizer = neutron_quantizer
588583
self.neutron_target_info = (
@@ -745,9 +740,8 @@ def partition_types(self):
745740

746741
class LinearPattern(QuantizationPattern):
747742
def __init__(self, neutron_quantizer, is_qat: bool = False):
748-
super().__init__(is_qat=is_qat)
743+
super().__init__(neutron_quantizer, is_qat=is_qat)
749744

750-
self.neutron_quantizer = neutron_quantizer
751745
self.neutron_target_info = (
752746
self.neutron_quantizer.neutron_target_spec.neutron_target_info
753747
)
@@ -836,9 +830,8 @@ def partition_types(self):
836830

837831
class MmPattern(QuantizationPattern):
838832
def __init__(self, neutron_quantizer, is_qat: bool = False):
839-
super().__init__(is_qat=is_qat)
833+
super().__init__(neutron_quantizer, is_qat=is_qat)
840834

841-
self.neutron_quantizer = neutron_quantizer
842835
self.neutron_target_info = (
843836
self.neutron_quantizer.neutron_target_spec.neutron_target_info
844837
)
@@ -1172,9 +1165,8 @@ class ActivationsConcatClusterPattern(QuantizationPattern):
11721165
"""
11731166

11741167
def __init__(self, neutron_quantizer, is_qat: bool = False):
1175-
super().__init__(is_qat=is_qat)
1168+
super().__init__(neutron_quantizer, is_qat=is_qat)
11761169

1177-
self.neutron_quantizer = neutron_quantizer
11781170
self.neutron_target_info = (
11791171
self.neutron_quantizer.neutron_target_spec.neutron_target_info
11801172
)

backends/nxp/tests/executorch_pipeline.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import eiq_neutron_sdk
1414
import numpy as np
1515
import torch
16-
1716
from executorch import exir
1817
from executorch.backends.nxp.backend.custom_delegation_options import (
1918
CustomDelegationOptions,
@@ -98,7 +97,7 @@ def _get_default_quantizer(target_spec: NeutronTargetSpec, use_qat: bool) -> Qua
9897

9998

10099
def to_model_input_spec(
101-
input_spec: Iterable[ModelInputSpec] | tuple[int, ...] | list[tuple[int, ...]]
100+
input_spec: Iterable[ModelInputSpec] | tuple[int, ...] | list[tuple[int, ...]],
102101
) -> tuple[ModelInputSpec, ...]:
103102
match input_spec:
104103
case _ if isinstance(input_spec, Iterable) and all(
@@ -122,7 +121,7 @@ def to_model_input_spec(
122121

123122
def get_calibration_inputs_fn_from_dataset_dir(dataset_dir) -> GetCalibrationInputsFn:
124123
def _nested(
125-
input_spec: tuple[ModelInputSpec, ...]
124+
input_spec: tuple[ModelInputSpec, ...],
126125
) -> Iterable[tuple[torch.Tensor, ...]]:
127126
data = sorted(os.listdir(dataset_dir))
128127
inputs_needed = len(input_spec)
@@ -156,7 +155,7 @@ def _nested(
156155

157156

158157
def _get_example_input(
159-
input_spec: tuple[ModelInputSpec, ...]
158+
input_spec: tuple[ModelInputSpec, ...],
160159
) -> tuple[torch.Tensor, ...]:
161160
example_input = []
162161
for spec in input_spec:
@@ -193,7 +192,9 @@ def to_quantized_edge_program(
193192
use_new_flow_neutron_c: bool = False,
194193
delegate_to_npu=True,
195194
) -> EdgeProgramManager:
196-
_neutron_target_spec = NeutronTargetSpec(target)
195+
_neutron_target_spec = NeutronTargetSpec(
196+
target, use_new_flow_neutron_c=use_new_flow_neutron_c
197+
)
197198
custom_delegation_options.use_new_flow_neutron_c = use_new_flow_neutron_c
198199
if get_quantizer_fn is None:
199200
get_quantizer_fn = partial(

0 commit comments

Comments
 (0)