|
5 | 5 | # This source code is licensed under the BSD-style license found in the |
6 | 6 | # LICENSE file in the root directory of this source tree. |
7 | 7 |
|
8 | | -import logging |
9 | | -import unittest |
| 8 | +from typing import Tuple |
10 | 9 |
|
11 | 10 | import pytest |
12 | 11 |
|
13 | 12 | import torch |
14 | | -from executorch.backends.arm.test import common, conftest |
| 13 | +from executorch.backends.arm.test import common |
| 14 | +from executorch.backends.arm.test.tester.test_pipeline import ( |
| 15 | + EthosU55PipelineBI, |
| 16 | + EthosU85PipelineBI, |
| 17 | + TosaPipelineBI, |
| 18 | + TosaPipelineMI, |
| 19 | +) |
15 | 20 |
|
16 | | -from executorch.backends.arm.test.tester.arm_tester import ArmTester |
17 | 21 | from torchvision import models, transforms # type: ignore[import-untyped] |
18 | 22 | from torchvision.models.mobilenetv2 import ( # type: ignore[import-untyped] |
19 | 23 | MobileNet_V2_Weights, |
20 | 24 | ) |
21 | 25 |
|
22 | 26 |
|
23 | | -logger = logging.getLogger(__name__) |
24 | | -logger.setLevel(logging.INFO) |
| 27 | +mv2 = models.mobilenetv2.mobilenet_v2(weights=MobileNet_V2_Weights.DEFAULT) |
| 28 | +mv2 = mv2.eval() |
| 29 | +normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) |
25 | 30 |
|
| 31 | +model_inputs = (normalize(torch.rand((1, 3, 224, 224))),) |
| 32 | +input_t = Tuple[torch.Tensor] |
26 | 33 |
|
27 | | -class TestMobileNetV2(unittest.TestCase): |
28 | | - """Tests MobileNetV2.""" |
29 | 34 |
|
30 | | - mv2 = models.mobilenetv2.mobilenet_v2(weights=MobileNet_V2_Weights.DEFAULT) |
31 | | - mv2 = mv2.eval() |
32 | | - normalize = transforms.Normalize( |
33 | | - mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225] |
| 35 | +def test_mv2_tosa_MI(): |
| 36 | + pipeline = TosaPipelineMI[input_t]( |
| 37 | + mv2, model_inputs, aten_op=[], exir_op=[], use_to_edge_transform_and_lower=True |
34 | 38 | ) |
| 39 | + pipeline.run() |
35 | 40 |
|
36 | | - # Used e.g. for quantization calibration and shape extraction in the tester |
37 | | - model_example_inputs = (normalize(torch.randn((1, 3, 224, 224))),) |
38 | 41 |
|
39 | | - def test_mv2_tosa_MI(self): |
40 | | - ( |
41 | | - ArmTester( |
42 | | - self.mv2, |
43 | | - example_inputs=self.model_example_inputs, |
44 | | - compile_spec=common.get_tosa_compile_spec("TOSA-0.80+MI"), |
45 | | - ) |
46 | | - .export() |
47 | | - .to_edge_transform_and_lower() |
48 | | - .check_count({"torch.ops.higher_order.executorch_call_delegate": 1}) |
49 | | - .to_executorch() |
50 | | - .run_method_and_compare_outputs() |
51 | | - ) |
| 42 | +def test_mv2_tosa_BI(): |
| 43 | + pipeline = TosaPipelineBI[input_t]( |
| 44 | + mv2, |
| 45 | + model_inputs, |
| 46 | + aten_op=[], |
| 47 | + exir_op=[], |
| 48 | + use_to_edge_transform_and_lower=True, |
| 49 | + atol=0.25, |
| 50 | + qtol=1, |
| 51 | + ) |
| 52 | + pipeline.run() |
52 | 53 |
|
53 | | - def test_mv2_tosa_BI(self): |
54 | | - ( |
55 | | - ArmTester( |
56 | | - self.mv2, |
57 | | - example_inputs=self.model_example_inputs, |
58 | | - compile_spec=common.get_tosa_compile_spec("TOSA-0.80+BI"), |
59 | | - ) |
60 | | - .quantize() |
61 | | - .export() |
62 | | - .to_edge_transform_and_lower() |
63 | | - .check_count({"torch.ops.higher_order.executorch_call_delegate": 1}) |
64 | | - .to_executorch() |
65 | | - .run_method_and_compare_outputs(rtol=0.001, atol=0.2, qtol=1) |
66 | | - ) |
67 | 54 |
|
68 | | - @pytest.mark.slow |
69 | | - @pytest.mark.corstone_fvp |
70 | | - def test_mv2_u55_BI(self): |
71 | | - tester = ( |
72 | | - ArmTester( |
73 | | - self.mv2, |
74 | | - example_inputs=self.model_example_inputs, |
75 | | - compile_spec=common.get_u55_compile_spec(), |
76 | | - ) |
77 | | - .quantize() |
78 | | - .export() |
79 | | - .to_edge_transform_and_lower() |
80 | | - .to_executorch() |
81 | | - .serialize() |
82 | | - ) |
83 | | - if conftest.is_option_enabled("corstone_fvp"): |
84 | | - tester.run_method_and_compare_outputs( |
85 | | - rtol=0.001, |
86 | | - atol=0.2, |
87 | | - qtol=1, |
88 | | - ) |
| 55 | +@pytest.mark.slow |
| 56 | +@pytest.mark.corstone_fvp |
| 57 | +@common.XfailIfNoCorstone300 |
| 58 | +def test_mv2_u55_BI(): |
| 59 | + pipeline = EthosU55PipelineBI[input_t]( |
| 60 | + mv2, |
| 61 | + model_inputs, |
| 62 | + aten_ops=[], |
| 63 | + exir_ops=[], |
| 64 | + run_on_fvp=True, |
| 65 | + use_to_edge_transform_and_lower=True, |
| 66 | + atol=0.25, |
| 67 | + qtol=1, |
| 68 | + ) |
| 69 | + pipeline.run() |
89 | 70 |
|
90 | | - @pytest.mark.slow |
91 | | - @pytest.mark.corstone_fvp |
92 | | - def test_mv2_u85_BI(self): |
93 | | - tester = ( |
94 | | - ArmTester( |
95 | | - self.mv2, |
96 | | - example_inputs=self.model_example_inputs, |
97 | | - compile_spec=common.get_u85_compile_spec(), |
98 | | - ) |
99 | | - .quantize() |
100 | | - .export() |
101 | | - .to_edge_transform_and_lower() |
102 | | - .to_executorch() |
103 | | - .serialize() |
104 | | - ) |
105 | | - if conftest.is_option_enabled("corstone_fvp"): |
106 | | - tester.run_method_and_compare_outputs( |
107 | | - rtol=0.001, |
108 | | - atol=0.2, |
109 | | - qtol=1, |
110 | | - ) |
| 71 | + |
| 72 | +@pytest.mark.slow |
| 73 | +@pytest.mark.corstone_fvp |
| 74 | +@common.XfailIfNoCorstone320 |
| 75 | +def test_mv2_u85_BI(): |
| 76 | + pipeline = EthosU85PipelineBI[input_t]( |
| 77 | + mv2, |
| 78 | + model_inputs, |
| 79 | + aten_ops=[], |
| 80 | + exir_ops=[], |
| 81 | + run_on_fvp=True, |
| 82 | + use_to_edge_transform_and_lower=True, |
| 83 | + atol=0.25, |
| 84 | + qtol=1, |
| 85 | + ) |
| 86 | + pipeline.run() |
0 commit comments