Skip to content

Commit 5252704

Browse files
authored
Add C++ unit tests for cadence::quantized_conv2d_nhwc + add depthwise_nhwc operator + tests
Differential Revision: D96507563 Pull Request resolved: #18479
1 parent c1d482e commit 5252704

6 files changed

Lines changed: 143 additions & 0 deletions

File tree

backends/cadence/aot/BUCK

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ fbcode_target(_kind = executorch_generated_lib,
156156
"//executorch/backends/cadence/generic/operators:op_quantized_conv2d",
157157
"//executorch/backends/cadence/generic/operators:op_quantized_conv1d_ncl",
158158
"//executorch/backends/cadence/generic/operators:op_quantized_conv1d_nlc",
159+
"//executorch/backends/cadence/generic/operators:op_quantized_depthwise_conv1d_ncl",
160+
"//executorch/backends/cadence/generic/operators:op_quantized_depthwise_conv1d_nlc",
159161
"//executorch/backends/cadence/generic/operators:op_quantized_fully_connected",
160162
"//executorch/backends/cadence/generic/operators:op_quantized_layer_norm",
161163
"//executorch/backends/cadence/generic/operators:op_quantized_linear",

backends/cadence/aot/functions.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,11 @@
389389
- arg_meta: null
390390
kernel_name: impl::generic::quantized_conv2d_nhwc_per_tensor_out
391391

392+
- func: cadence::quantized_conv2d_depthwise_nhwc.out(Tensor input, Tensor weight, Tensor bias, int[] stride, SymInt[] padding, int[] dilation, int groups, int input_zero_point, int weight_zero_point, float bias_scale, float out_scale, int out_zero_point, int out_multiplier, int out_shift, *, Tensor(a!) out) -> Tensor(a!)
393+
kernels:
394+
- arg_meta: null
395+
kernel_name: impl::generic::quantized_conv2d_depthwise_nhwc_out
396+
392397
- func: cadence::quantized_conv1d_ncl.per_tensor_out(Tensor input, Tensor weight, Tensor bias, int[] stride, SymInt[] padding, int[] dilation, int groups, int input_zero_point, int weight_zero_point, float bias_scale, float out_scale, int out_zero_point, int out_multiplier, int out_shift, *, Tensor(a!) out) -> Tensor(a!)
393398
kernels:
394399
- arg_meta: null

backends/cadence/aot/ops_registrations.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,12 @@ def register_fake(
238238
lib.define(
239239
"quantized_conv2d_nhwc.per_tensor_out(Tensor input, Tensor weight, Tensor bias, int[] stride, SymInt[] padding, int[] dilation, int groups, int input_zero_point, int weight_zero_point, float bias_scale, float out_scale, int out_zero_point, int out_multiplier, int out_shift, Tensor? offset=None, *, Tensor(a!) out) -> Tensor(a!)"
240240
)
241+
lib.define(
242+
"quantized_conv2d_depthwise_nhwc(Tensor input, Tensor weight, Tensor bias, int[] stride, SymInt[] padding, int[] dilation, int groups, int input_zero_point, int weight_zero_point, float bias_scale, float out_scale, int out_zero_point, int out_multiplier, int out_shift) -> (Tensor Z)"
243+
)
244+
lib.define(
245+
"quantized_conv2d_depthwise_nhwc.out(Tensor input, Tensor weight, Tensor bias, int[] stride, SymInt[] padding, int[] dilation, int groups, int input_zero_point, int weight_zero_point, float bias_scale, float out_scale, int out_zero_point, int out_multiplier, int out_shift, *, Tensor(a!) out) -> Tensor(a!)"
246+
)
241247
lib.define(
242248
"quantized_conv1d_ncl(Tensor input, Tensor weight, Tensor bias, int[] stride, SymInt[] padding, int[] dilation, int groups, int input_zero_point, Tensor weight_zero_point, Tensor bias_scale, float out_scale, int out_zero_point, Tensor out_multiplier, Tensor out_shift) -> (Tensor Z)"
243249
)
@@ -2105,6 +2111,49 @@ def quantized_conv2d_nhwc_depthwise_asym8uxsym8u_asym8u_per_tensor_meta(
21052111
return input.new_empty(output_size, dtype=input.dtype)
21062112

21072113

2114+
@register_fake("cadence::quantized_conv2d_depthwise_nhwc")
2115+
def quantized_conv2d_depthwise_nhwc_meta(
2116+
input: torch.Tensor,
2117+
weight: torch.Tensor,
2118+
bias: torch.Tensor,
2119+
stride: Tuple[int],
2120+
padding: Tuple[int],
2121+
dilation: Tuple[int],
2122+
groups: int,
2123+
in_zero_point: int,
2124+
weight_zero_point: int,
2125+
bias_scale: float,
2126+
output_scale: float,
2127+
output_zero_point: int,
2128+
out_multiplier: int,
2129+
out_shift: int,
2130+
) -> torch.Tensor:
2131+
in_size = input.shape
2132+
assert len(in_size) > 2
2133+
assert len(in_size) < 6
2134+
# Depthwise weight is always [*kernel_size, OC]:
2135+
# 2D: [KH, KW, OC], 1D: [K, OC]
2136+
*kernel_size, out_channels = weight.shape
2137+
2138+
output_size = (
2139+
get_conv1d_output_size(
2140+
in_size,
2141+
out_channels,
2142+
stride[-1],
2143+
padding[-1],
2144+
dilation[-1],
2145+
kernel_size[0],
2146+
True,
2147+
)
2148+
if len(in_size) == 3
2149+
else get_conv2d_output_size(
2150+
in_size, out_channels, stride, padding, dilation, kernel_size, True
2151+
)
2152+
)
2153+
2154+
return input.new_empty(output_size, dtype=input.dtype)
2155+
2156+
21082157
@register_fake("cadence::quantized_layer_norm")
21092158
def quantized_layer_norm_meta(
21102159
input: torch.Tensor,

backends/cadence/aot/ref_implementations.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1556,6 +1556,41 @@ def quantized_conv2d_nhwc(
15561556
)
15571557

15581558

1559+
@impl_tracked(m, "quantized_conv2d_depthwise_nhwc")
1560+
def quantized_conv2d_depthwise_nhwc(
1561+
input_tensor: torch.Tensor,
1562+
weight: torch.Tensor,
1563+
bias: torch.Tensor,
1564+
stride: tuple[int, int],
1565+
padding: tuple[int, int],
1566+
dilation: tuple[int, int],
1567+
groups: int,
1568+
in_zero_point: int,
1569+
weight_zero_point: int,
1570+
bias_scale: float,
1571+
output_scale: float,
1572+
output_zero_point: int,
1573+
out_multiplier: int,
1574+
out_shift: int,
1575+
) -> torch.Tensor:
1576+
return quantized_conv2d_nhwc_per_tensor(
1577+
input_tensor,
1578+
weight,
1579+
bias,
1580+
stride,
1581+
padding,
1582+
dilation,
1583+
groups,
1584+
in_zero_point,
1585+
weight_zero_point,
1586+
bias_scale,
1587+
output_scale,
1588+
output_zero_point,
1589+
out_multiplier,
1590+
out_shift,
1591+
)
1592+
1593+
15591594
def quantized_conv_variant(
15601595
layout: str,
15611596
input_dtype: torch.dtype,

backends/cadence/generic/operators/op_quantized_conv2d.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,40 @@ Tensor& quantized_conv2d_nhwc_per_tensor_out(
955955
return out;
956956
}
957957

958+
Tensor& quantized_conv2d_depthwise_nhwc_out(
959+
ET_UNUSED KernelRuntimeContext& ctx,
960+
const Tensor& input,
961+
const Tensor& weight,
962+
const Tensor& bias,
963+
IntArrayRef stride,
964+
IntArrayRef padding,
965+
IntArrayRef dilation,
966+
int64_t groups,
967+
int64_t in_zero_point,
968+
int64_t weight_zero_point,
969+
double bias_scale,
970+
double output_scale,
971+
int64_t output_zero_point,
972+
ET_UNUSED int64_t out_multiplier,
973+
ET_UNUSED int64_t out_shift,
974+
Tensor& out) {
975+
quantized_conv2d_nhwc(
976+
input,
977+
weight,
978+
bias,
979+
stride,
980+
padding,
981+
dilation,
982+
static_cast<int16_t>(groups),
983+
static_cast<int32_t>(in_zero_point),
984+
static_cast<int32_t>(weight_zero_point),
985+
static_cast<float>(bias_scale),
986+
static_cast<float>(output_scale),
987+
static_cast<int32_t>(output_zero_point),
988+
out);
989+
return out;
990+
}
991+
958992
Tensor& quantized_conv2d_nhwc_asym8sxsym8s_asym8s_per_tensor_out(
959993
ET_UNUSED KernelRuntimeContext& ctx,
960994
const Tensor& input,

backends/cadence/generic/operators/op_quantized_conv2d.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,24 @@ ::executorch::aten::Tensor& quantized_conv2d_nhwc_per_tensor_out(
208208
const ::executorch::aten::optional<Tensor>& offset,
209209
Tensor& out);
210210

211+
::executorch::aten::Tensor& quantized_conv2d_depthwise_nhwc_out(
212+
KernelRuntimeContext& ctx,
213+
const Tensor& input,
214+
const Tensor& weight,
215+
const Tensor& bias,
216+
IntArrayRef stride,
217+
IntArrayRef padding,
218+
IntArrayRef dilation,
219+
int64_t groups,
220+
int64_t in_zero_point,
221+
int64_t weight_zero_point,
222+
double bias_scale,
223+
double output_scale,
224+
int64_t output_zero_point,
225+
int64_t out_multiplier,
226+
int64_t out_shift,
227+
Tensor& out);
228+
211229
::executorch::aten::Tensor&
212230
quantized_conv2d_nhwc_asym8sxsym8s_asym8s_per_tensor_out(
213231
KernelRuntimeContext& ctx,

0 commit comments

Comments
 (0)