Skip to content

Commit 1533e55

Browse files
Arm backend: Add 16x8 tests for VGF (pytorch#18839)
Introduce int16a8w for a couple of op tests on VGF cc @digantdesai @freddan80 @per @zingo @oscarandersson8218 @mansnils @Sebastian-Larsson @robell Signed-off-by: Christoffer J.L <christoffer.johanssonlundqvist@arm.com>
1 parent 425c519 commit 1533e55

26 files changed

Lines changed: 652 additions & 0 deletions

backends/arm/test/ops/test_adaptive_avg_pool2d.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
import torch
99

10+
from executorch.backends.arm.quantizer.arm_quantizer import (
11+
get_symmetric_a16w8_quantization_config,
12+
)
1013
from executorch.backends.arm.test import common
1114

1215
from executorch.backends.arm.test.tester.test_pipeline import (
@@ -244,3 +247,19 @@ def test_adaptive_avg_pool2d_vgf_quant(test_module):
244247
quantize=True,
245248
)
246249
pipeline.run()
250+
251+
252+
@common.parametrize("test_module", test_modules)
253+
@common.SkipIfNoModelConverter
254+
def test_adaptive_avg_pool2d_vgf_quant_a16w8(test_module):
255+
model, input_tensor = test_module()
256+
pipeline = VgfPipeline[input_t](
257+
model,
258+
input_tensor,
259+
[],
260+
exir_op,
261+
quantize=True,
262+
tosa_extensions=["int16"],
263+
)
264+
pipeline.quantizer.set_global(get_symmetric_a16w8_quantization_config())
265+
pipeline.run()

backends/arm/test/ops/test_add.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,22 @@ def test_add_tensor_vgf_quant(test_data: input_t1):
278278
pipeline.run()
279279

280280

281+
@common.parametrize("test_data", Add.test_data)
282+
@common.SkipIfNoModelConverter
283+
def test_add_tensor_vgf_quant_a16w8(test_data: input_t1):
284+
pipeline = VgfPipeline[input_t1](
285+
Add(),
286+
test_data(),
287+
aten_op,
288+
exir_op,
289+
run_on_vulkan_runtime=True,
290+
quantize=True,
291+
tosa_extensions=["int16"],
292+
)
293+
pipeline.quantizer.set_global(get_symmetric_a16w8_quantization_config())
294+
pipeline.run()
295+
296+
281297
@common.parametrize("test_data", Add.test_data)
282298
def test_add_tensor_tosa_INT_16a8w(test_data: input_t1):
283299
"""Test add operation with 16A8W quantization (16-bit activations, 8-bit

backends/arm/test/ops/test_amax.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
import pytest
1010
import torch
11+
from executorch.backends.arm.quantizer.arm_quantizer import (
12+
get_symmetric_a16w8_quantization_config,
13+
)
1114
from executorch.backends.arm.test import common
1215
from executorch.backends.arm.test.tester.test_pipeline import (
1316
EthosU55PipelineINT,
@@ -263,6 +266,23 @@ def test_max_dim_vgf_quant_to_amax(test_data: Max.input_t):
263266
pipeline.run()
264267

265268

269+
@common.parametrize("test_data", Amax.test_data)
270+
@common.SkipIfNoModelConverter
271+
def test_amax_vgf_quant_a16w8(test_data: Amax.input_t):
272+
data, dim, keep_dims = test_data()
273+
module = Amax(dim, keep_dims)
274+
pipeline = VgfPipeline[Max.input_t](
275+
module,
276+
data,
277+
amax_aten_op,
278+
amax_exir_op,
279+
quantize=True,
280+
tosa_extensions=["int16"],
281+
)
282+
pipeline.quantizer.set_global(get_symmetric_a16w8_quantization_config())
283+
pipeline.run()
284+
285+
266286
@common.parametrize("test_data", Amax.test_data)
267287
def test_amax_tosa_INT_a16w8(test_data: Amax.input_t):
268288
"""Test amax with 16A8W quantization for TOSA INT."""

backends/arm/test/ops/test_amin.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import pytest
1010

1111
import torch
12+
from executorch.backends.arm.quantizer.arm_quantizer import (
13+
get_symmetric_a16w8_quantization_config,
14+
)
1215
from executorch.backends.arm.test import common
1316
from executorch.backends.arm.test.tester.test_pipeline import (
1417
EthosU55PipelineINT,
@@ -273,6 +276,21 @@ def test_min_dim_vgf_quant_to_amin(test_data: Min.input_t):
273276
pipeline.run()
274277

275278

279+
@common.parametrize("test_data", Amin.test_data)
280+
@common.SkipIfNoModelConverter
281+
def test_amin_vgf_quant_a16w8(test_data: Amin.input_t):
282+
data, dim, keep_dims = test_data()
283+
pipeline = VgfPipeline[Amin.input_t](
284+
Amin(dim, keep_dims),
285+
data,
286+
amin_aten_op,
287+
quantize=True,
288+
tosa_extensions=["int16"],
289+
)
290+
pipeline.quantizer.set_global(get_symmetric_a16w8_quantization_config())
291+
pipeline.run()
292+
293+
276294
@common.parametrize("test_data", Amin.test_data)
277295
def test_amin_tosa_INT_a16w8(test_data: Amin.input_t):
278296
"""Test amin with 16A8W quantization for TOSA INT."""

backends/arm/test/ops/test_avg_pool2d.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import conftest
1212

1313
import torch
14+
from executorch.backends.arm.quantizer.arm_quantizer import (
15+
get_symmetric_a16w8_quantization_config,
16+
)
1417

1518
from executorch.backends.arm.test import common
1619

@@ -289,6 +292,22 @@ def test_avg_pool2d_vgf_quant(test_module):
289292
pipeline.run()
290293

291294

295+
@common.parametrize("test_module", test_modules)
296+
@common.SkipIfNoModelConverter
297+
def test_avg_pool2d_vgf_quant_a16w8(test_module):
298+
model, input_tensor = test_module()
299+
pipeline = VgfPipeline[input_t](
300+
model,
301+
input_tensor,
302+
aten_op,
303+
exir_op,
304+
quantize=True,
305+
tosa_extensions=["int16"],
306+
)
307+
pipeline.quantizer.set_global(get_symmetric_a16w8_quantization_config())
308+
pipeline.run()
309+
310+
292311
reject_modules = {
293312
"kernel_1x1_stride_1_pad_0": lambda: (AvgPool2d(1, 1, 0), torch.rand(2, 5, 5, 5)),
294313
"kernel_2x9_stride_1_pad_1": lambda: (

backends/arm/test/ops/test_clamp.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
from typing import Tuple, Union
88

99
import torch
10+
from executorch.backends.arm.quantizer.arm_quantizer import (
11+
get_symmetric_a16w8_quantization_config,
12+
)
1013

1114
from executorch.backends.arm.test import common
1215

@@ -260,6 +263,25 @@ def test_clamp_vgf_quant(test_data):
260263
aten_op_tensor = [
261264
"torch.ops.aten.clamp.Tensor",
262265
]
266+
267+
268+
@common.parametrize("test_data", test_data_suite)
269+
@common.SkipIfNoModelConverter
270+
def test_clamp_vgf_quant_a16w8(test_data):
271+
input_tensor, min_val, max_val = test_data()
272+
model = Clamp(min_val, max_val)
273+
pipeline = VgfPipeline[input_t](
274+
model,
275+
(input_tensor,),
276+
aten_op,
277+
exir_op,
278+
quantize=True,
279+
tosa_extensions=["int16"],
280+
)
281+
pipeline.quantizer.set_global(get_symmetric_a16w8_quantization_config())
282+
pipeline.run()
283+
284+
263285
exir_op_tensor = "executorch_exir_dialects_edge__ops_aten_clamp_Tensor"
264286

265287
test_data_suite_tensor_FP = {

backends/arm/test/ops/test_constant_pad_nd.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
import torch
1111
import torch.nn.functional as F
12+
from executorch.backends.arm.quantizer.arm_quantizer import (
13+
get_symmetric_a16w8_quantization_config,
14+
)
1215
from executorch.backends.arm.test import common
1316
from executorch.backends.arm.test.tester.test_pipeline import (
1417
TosaPipelineFP,
@@ -208,3 +211,19 @@ def test_constant_pad_nd_vgf_quant(test_data: Tuple):
208211
quantize=True,
209212
)
210213
pipeline.run()
214+
215+
216+
@common.parametrize("test_data", test_data_suite)
217+
@common.SkipIfNoModelConverter
218+
def test_constant_pad_nd_vgf_quant_a16w8(test_data: Tuple):
219+
inp, padding, value, mode = test_data()
220+
pipeline = VgfPipeline[input_t1](
221+
ConstantPadND(padding, value, mode),
222+
(inp,),
223+
aten_op,
224+
exir_op,
225+
quantize=True,
226+
tosa_extensions=["int16"],
227+
)
228+
pipeline.quantizer.set_global(get_symmetric_a16w8_quantization_config())
229+
pipeline.run()

backends/arm/test/ops/test_conv2d.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import torch
1010
from executorch.backends.arm.quantizer.arm_quantizer import (
11+
get_symmetric_a16w8_quantization_config,
1112
get_symmetric_a8w4_quantization_config,
1213
)
1314
from executorch.backends.arm.test import common
@@ -644,6 +645,25 @@ def test_convolution_2d_vgf_quant(test_data):
644645
pipeline.run()
645646

646647

648+
@common.parametrize("test_data", test_data_INT)
649+
@common.SkipIfNoModelConverter
650+
def test_convolution_2d_vgf_quant_a16w8(test_data):
651+
model, per_channel_quantization = test_data()
652+
pipeline = VgfPipeline[input_t](
653+
model,
654+
model.get_inputs(),
655+
aten_op,
656+
exir_op,
657+
per_channel_quantization=per_channel_quantization,
658+
quantize=True,
659+
tosa_extensions=["int16"],
660+
)
661+
pipeline.quantizer.set_global(
662+
get_symmetric_a16w8_quantization_config(is_per_channel=per_channel_quantization)
663+
)
664+
pipeline.run()
665+
666+
647667
reject_suite = {
648668
"large_stride": lambda: Conv2d(
649669
in_channels=1,

backends/arm/test/ops/test_conv3d.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import pytest
1010
import torch
1111
from executorch.backends.arm.quantizer.arm_quantizer import (
12+
get_symmetric_a16w8_quantization_config,
1213
get_symmetric_a8w4_quantization_config,
1314
)
1415
from executorch.backends.arm.test import common
@@ -741,6 +742,26 @@ def test_convolution_3d_vgf_quant_a8w4(test_data):
741742
pipeline.run()
742743

743744

745+
@common.parametrize("test_data", test_data_INT16)
746+
@common.SkipIfNoModelConverter
747+
def test_convolution_3d_vgf_quant_a16w8(test_data):
748+
model, per_channel_quantization = test_data()
749+
pipeline = VgfPipeline[input_t](
750+
model,
751+
model.get_inputs(),
752+
aten_op,
753+
exir_op,
754+
per_channel_quantization=per_channel_quantization,
755+
quantize=True,
756+
tosa_extensions=["int16"],
757+
qtol=1,
758+
)
759+
pipeline.quantizer.set_global(
760+
get_symmetric_a16w8_quantization_config(is_per_channel=per_channel_quantization)
761+
)
762+
pipeline.run()
763+
764+
744765
@common.SkipIfNoModelConverter
745766
def test_convolution_3d_vgf_no_quant_multi_op():
746767
"""Ensure mixed Conv3d/Conv2d graphs keep correct spatial annotations."""

backends/arm/test/ops/test_depthwise_conv.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import torch
1111
from executorch.backends.arm.quantizer.arm_quantizer import (
12+
get_symmetric_a16w8_quantization_config,
1213
get_symmetric_a8w4_quantization_config,
1314
)
1415
from executorch.backends.arm.test import common
@@ -338,6 +339,25 @@ def test_convolution_2d_vgf_quant_a8w4_depthwise(test_data):
338339
pipeline.run()
339340

340341

342+
@common.parametrize("test_data", test_data_conv2d_INT)
343+
@common.SkipIfNoModelConverter
344+
def test_convolution_2d_vgf_quant_a16w8_depthwise(test_data):
345+
model, per_channel_quantization = test_data()
346+
pipeline = VgfPipeline[input_t](
347+
model,
348+
model.get_inputs(),
349+
aten_op=[],
350+
exir_op=exir_op,
351+
per_channel_quantization=per_channel_quantization,
352+
quantize=True,
353+
tosa_extensions=["int16"],
354+
)
355+
pipeline.quantizer.set_global(
356+
get_symmetric_a16w8_quantization_config(is_per_channel=per_channel_quantization)
357+
)
358+
pipeline.run()
359+
360+
341361
@common.XfailIfNoCorstone300
342362
@common.parametrize("test_data", test_data_conv2d_INT)
343363
def test_convolution_2d_u55_INT_depthwise(test_data):

0 commit comments

Comments
 (0)