@@ -20,110 +20,140 @@ using exec_aten::ScalarType;
20
20
using exec_aten::Tensor;
21
21
using torch::executor::testing::TensorFactory;
22
22
23
- ::std::tuple<Tensor&, Tensor&, Tensor&> op_native_group_norm_out (
24
- const Tensor& input,
25
- const optional<Tensor>& weight,
26
- const optional<Tensor>& bias,
27
- int64_t N,
28
- int64_t C,
29
- int64_t HxW,
30
- int64_t group,
31
- double eps,
32
- Tensor& out0,
33
- Tensor& out1,
34
- Tensor& out2) {
35
- executorch::runtime::KernelRuntimeContext context{};
36
- return torch::executor::aten::native_group_norm_outf (
37
- context, input, weight, bias, N, C, HxW, group, eps, out0, out1, out2);
38
- }
23
+ class OpNativeGroupNormOutTest : public OperatorTest {
24
+ protected:
25
+ ::std::tuple<Tensor&, Tensor&, Tensor&> op_native_group_norm_out (
26
+ const Tensor& input,
27
+ const optional<Tensor>& weight,
28
+ const optional<Tensor>& bias,
29
+ int64_t N,
30
+ int64_t C,
31
+ int64_t HxW,
32
+ int64_t group,
33
+ double eps,
34
+ Tensor& out0,
35
+ Tensor& out1,
36
+ Tensor& out2) {
37
+ executorch::runtime::KernelRuntimeContext context{};
38
+ return torch::executor::aten::native_group_norm_outf (
39
+ context, input, weight, bias, N, C, HxW, group, eps, out0, out1, out2);
40
+ }
41
+ template <ScalarType DTYPE>
42
+ void test_dtype () {
43
+ TensorFactory<DTYPE> tf;
39
44
40
- TEST (OpNativeGroupNormOutTest, SmokeTest) {
41
- TensorFactory<ScalarType::Float> tfFloat;
45
+ Tensor input = tf.make (
46
+ {5 , 6 , 2 , 2 },
47
+ {-0.8125 , 0.0625 , -2.7500 , -3.0625 , -1.1250 , -2.1250 , -1.3125 ,
48
+ -4.0625 , 2.8125 , -2.0625 , 4.2500 , 3.5000 , -0.3750 , 1.6250 ,
49
+ 4.3125 , -1.0625 , -2.8750 , 3.3750 , 4.9375 , 4.0625 , -3.0625 ,
50
+ -1.8750 , -2.7500 , -2.5625 , -0.1875 , -3.0000 , -2.7500 , 0.6875 ,
51
+ -3.2500 , -3.1875 , 1.0000 , -4.6250 , -0.1875 , -1.7500 , 4.5000 ,
52
+ -1.8750 , -2.6875 , 4.8125 , -3.8125 , -2.9375 , -1.1875 , 2.8750 ,
53
+ 0.7500 , 2.8750 , 1.1250 , -0.6250 , -2.2500 , -3.7500 , 3.2500 ,
54
+ -0.3750 , -2.0625 , -4.7500 , 2.0625 , 3.0000 , -3.1875 , -4.1250 ,
55
+ -3.7500 , 1.2500 , -2.3125 , 1.5625 , 3.1250 , 0.3125 , 3.2500 ,
56
+ -2.7500 , -3.8125 , -4.2500 , -4.3125 , -0.5625 , -0.4375 , 2.9375 ,
57
+ -1.3750 , -0.6250 , -2.5625 , -4.5625 , 0.1250 , -3.5000 , -5.0000 ,
58
+ -1.0000 , -4.6875 , -0.6875 , 1.1250 , 1.8750 , -4.5000 , 4.3125 ,
59
+ 4.5625 , 0.2500 , -3.6250 , 4.5625 , -3.5000 , -2.1250 , -3.6250 ,
60
+ -2.9375 , 3.6875 , 3.9375 , 4.3750 , 3.0625 , 2.4375 , 2.0625 ,
61
+ -2.4375 , -3.9375 , 3.6875 , 2.7500 , -0.8750 , -0.9375 , 2.7500 ,
62
+ -2.4375 , -2.3750 , -0.9375 , -4.8750 , 0.1875 , 3.5000 , -2.0000 ,
63
+ -0.2500 , -2.7500 , 0.3125 , 1.2500 , -0.5625 , 0.0000 , 1.8125 ,
64
+ 1.0625 });
65
+ optional<Tensor> weight =
66
+ tf.make ({6 }, {4.5625 , -2.8750 , -0.6875 , 0.5625 , -2.0625 , -2.7500 });
67
+ optional<Tensor> bias =
68
+ tf.make ({6 }, {-0.5000 , -2.7500 , 1.1875 , 3.6875 , 3.8125 , 4.6875 });
69
+ double eps = 1e-5 ;
70
+ Tensor out0 = tf.zeros ({5 , 6 , 2 , 2 });
71
+ Tensor out1 = tf.zeros ({5 , 3 });
72
+ Tensor out2 = tf.zeros ({5 , 3 });
73
+ Tensor out0_expected = tf.make (
74
+ {5 , 6 , 2 , 2 },
75
+ {3.419882 , 6.578348 , -3.573864 , -4.701888 , -4.509254 , -2.234663 ,
76
+ -4.082768 , 2.172355 , 0.838826 , 2.270225 , 0.416747 , 0.636962 ,
77
+ 3.207030 , 3.687500 , 4.333131 , 3.041869 , 5.547079 , 1.649148 ,
78
+ 0.674665 , 1.220376 , 7.156189 , 6.168714 , 6.896327 , 6.740410 ,
79
+ 3.509863 , -3.022041 , -2.441427 , 5.542011 , -0.794903 , -0.886369 ,
80
+ -7.014627 , 1.217361 , 1.120617 , 1.463606 , 0.091652 , 1.491045 ,
81
+ 3.293219 , 4.640229 , 3.091168 , 3.248319 , 4.895990 , 1.114683 ,
82
+ 3.092597 , 1.114683 , 3.262238 , 5.434066 , 7.450763 , 9.312329 ,
83
+ 5.570122 , 0.101119 , -2.444796 , -6.499403 , -5.446074 , -6.337338 ,
84
+ -0.454995 , 0.436269 , 2.228491 , 0.871598 , 1.838385 , 0.786793 ,
85
+ 4.362284 , 3.737805 , 4.390039 , 3.057817 , 5.814659 , 6.202621 ,
86
+ 6.258044 , 2.932658 , 3.366583 , -0.623879 , 4.475045 , 3.588276 ,
87
+ -0.082914 , -4.936279 , 6.438795 , -2.357929 , 0.714463 , -5.402106 ,
88
+ 0.236606 , -5.879963 , 1.176247 , 1.021916 , 2.333727 , 0.520341 ,
89
+ 4.275447 , 3.549392 , 2.896994 , 4.275447 , 6.120910 , 5.298480 ,
90
+ 6.195676 , 5.784461 , 2.033296 , 1.833920 , 1.485010 , 2.531738 ,
91
+ 3.193988 , 2.532378 , -5.406940 , -8.053379 , -6.467402 , -5.425139 ,
92
+ -1.395059 , -1.325575 , 0.266062 , 1.622680 , 1.606336 , 1.230405 ,
93
+ 2.809896 , 3.893110 , 4.601880 , 3.425055 , 4.374411 , 8.283354 ,
94
+ 3.494898 , 2.029045 , 6.088204 , 4.915522 , 1.136877 , 2.700454 });
95
+ Tensor out1_expected = tf.make (
96
+ {5 , 3 },
97
+ {-1.89843750 ,
98
+ 1.62500000 ,
99
+ -0.09375000 ,
100
+ -1.91406250 ,
101
+ -0.49218744 ,
102
+ -0.02343750 ,
103
+ -0.77343756 ,
104
+ 0.08593753 ,
105
+ -1.55468738 ,
106
+ -2.73437500 ,
107
+ 1.07031238 ,
108
+ 0.35937503 ,
109
+ 0.34374997 ,
110
+ -0.77343750 ,
111
+ 0.10937499 });
112
+ Tensor out2_expected = tf.make (
113
+ {5 , 3 },
114
+ {0.79116172 ,
115
+ 0.42708409 ,
116
+ 0.30238494 ,
117
+ 0.50903118 ,
118
+ 0.31929117 ,
119
+ 0.45128885 ,
120
+ 0.33067191 ,
121
+ 0.39473253 ,
122
+ 0.42994878 ,
123
+ 0.53187561 ,
124
+ 0.29930803 ,
125
+ 0.29000264 ,
126
+ 0.38669431 ,
127
+ 0.38038814 ,
128
+ 0.75809801 });
129
+ op_native_group_norm_out (
130
+ input, weight, bias, 5 , 6 , 4 , 3 , eps, out0, out1, out2);
131
+ if (DTYPE == ScalarType::Half || DTYPE == ScalarType::BFloat16) {
132
+ EXPECT_TENSOR_CLOSE_WITH_TOL (
133
+ out0,
134
+ out0_expected,
135
+ 2e-1 ,
136
+ executorch::runtime::testing::internal::kDefaultAtol );
137
+ EXPECT_TENSOR_CLOSE_WITH_TOL (
138
+ out1,
139
+ out1_expected,
140
+ 1e-2 ,
141
+ executorch::runtime::testing::internal::kDefaultAtol );
142
+ EXPECT_TENSOR_CLOSE_WITH_TOL (
143
+ out2,
144
+ out2_expected,
145
+ 1e-2 ,
146
+ executorch::runtime::testing::internal::kDefaultAtol );
147
+ } else {
148
+ EXPECT_TENSOR_CLOSE (out0, out0_expected);
149
+ EXPECT_TENSOR_CLOSE (out1, out1_expected);
150
+ EXPECT_TENSOR_CLOSE (out2, out2_expected);
151
+ }
152
+ }
153
+ };
42
154
43
- Tensor input = tfFloat.make (
44
- {5 , 6 , 2 , 2 },
45
- {-0.8125 , 0.0625 , -2.7500 , -3.0625 , -1.1250 , -2.1250 , -1.3125 , -4.0625 ,
46
- 2.8125 , -2.0625 , 4.2500 , 3.5000 , -0.3750 , 1.6250 , 4.3125 , -1.0625 ,
47
- -2.8750 , 3.3750 , 4.9375 , 4.0625 , -3.0625 , -1.8750 , -2.7500 , -2.5625 ,
48
- -0.1875 , -3.0000 , -2.7500 , 0.6875 , -3.2500 , -3.1875 , 1.0000 , -4.6250 ,
49
- -0.1875 , -1.7500 , 4.5000 , -1.8750 , -2.6875 , 4.8125 , -3.8125 , -2.9375 ,
50
- -1.1875 , 2.8750 , 0.7500 , 2.8750 , 1.1250 , -0.6250 , -2.2500 , -3.7500 ,
51
- 3.2500 , -0.3750 , -2.0625 , -4.7500 , 2.0625 , 3.0000 , -3.1875 , -4.1250 ,
52
- -3.7500 , 1.2500 , -2.3125 , 1.5625 , 3.1250 , 0.3125 , 3.2500 , -2.7500 ,
53
- -3.8125 , -4.2500 , -4.3125 , -0.5625 , -0.4375 , 2.9375 , -1.3750 , -0.6250 ,
54
- -2.5625 , -4.5625 , 0.1250 , -3.5000 , -5.0000 , -1.0000 , -4.6875 , -0.6875 ,
55
- 1.1250 , 1.8750 , -4.5000 , 4.3125 , 4.5625 , 0.2500 , -3.6250 , 4.5625 ,
56
- -3.5000 , -2.1250 , -3.6250 , -2.9375 , 3.6875 , 3.9375 , 4.3750 , 3.0625 ,
57
- 2.4375 , 2.0625 , -2.4375 , -3.9375 , 3.6875 , 2.7500 , -0.8750 , -0.9375 ,
58
- 2.7500 , -2.4375 , -2.3750 , -0.9375 , -4.8750 , 0.1875 , 3.5000 , -2.0000 ,
59
- -0.2500 , -2.7500 , 0.3125 , 1.2500 , -0.5625 , 0.0000 , 1.8125 , 1.0625 });
60
- optional<Tensor> weight =
61
- tfFloat.make ({6 }, {4.5625 , -2.8750 , -0.6875 , 0.5625 , -2.0625 , -2.7500 });
62
- optional<Tensor> bias =
63
- tfFloat.make ({6 }, {-0.5000 , -2.7500 , 1.1875 , 3.6875 , 3.8125 , 4.6875 });
64
- double eps = 1e-5 ;
65
- Tensor out0 = tfFloat.zeros ({5 , 6 , 2 , 2 });
66
- Tensor out1 = tfFloat.zeros ({5 , 3 });
67
- Tensor out2 = tfFloat.zeros ({5 , 3 });
68
- Tensor out0_expected = tfFloat.make (
69
- {5 , 6 , 2 , 2 },
70
- {3.419882 , 6.578348 , -3.573864 , -4.701888 , -4.509254 , -2.234663 ,
71
- -4.082768 , 2.172355 , 0.838826 , 2.270225 , 0.416747 , 0.636962 ,
72
- 3.207030 , 3.687500 , 4.333131 , 3.041869 , 5.547079 , 1.649148 ,
73
- 0.674665 , 1.220376 , 7.156189 , 6.168714 , 6.896327 , 6.740410 ,
74
- 3.509863 , -3.022041 , -2.441427 , 5.542011 , -0.794903 , -0.886369 ,
75
- -7.014627 , 1.217361 , 1.120617 , 1.463606 , 0.091652 , 1.491045 ,
76
- 3.293219 , 4.640229 , 3.091168 , 3.248319 , 4.895990 , 1.114683 ,
77
- 3.092597 , 1.114683 , 3.262238 , 5.434066 , 7.450763 , 9.312329 ,
78
- 5.570122 , 0.101119 , -2.444796 , -6.499403 , -5.446074 , -6.337338 ,
79
- -0.454995 , 0.436269 , 2.228491 , 0.871598 , 1.838385 , 0.786793 ,
80
- 4.362284 , 3.737805 , 4.390039 , 3.057817 , 5.814659 , 6.202621 ,
81
- 6.258044 , 2.932658 , 3.366583 , -0.623879 , 4.475045 , 3.588276 ,
82
- -0.082914 , -4.936279 , 6.438795 , -2.357929 , 0.714463 , -5.402106 ,
83
- 0.236606 , -5.879963 , 1.176247 , 1.021916 , 2.333727 , 0.520341 ,
84
- 4.275447 , 3.549392 , 2.896994 , 4.275447 , 6.120910 , 5.298480 ,
85
- 6.195676 , 5.784461 , 2.033296 , 1.833920 , 1.485010 , 2.531738 ,
86
- 3.193988 , 2.532378 , -5.406940 , -8.053379 , -6.467402 , -5.425139 ,
87
- -1.395059 , -1.325575 , 0.266062 , 1.622680 , 1.606336 , 1.230405 ,
88
- 2.809896 , 3.893110 , 4.601880 , 3.425055 , 4.374411 , 8.283354 ,
89
- 3.494898 , 2.029045 , 6.088204 , 4.915522 , 1.136877 , 2.700454 });
90
- Tensor out1_expected = tfFloat.make (
91
- {5 , 3 },
92
- {-1.89843750 ,
93
- 1.62500000 ,
94
- -0.09375000 ,
95
- -1.91406250 ,
96
- -0.49218744 ,
97
- -0.02343750 ,
98
- -0.77343756 ,
99
- 0.08593753 ,
100
- -1.55468738 ,
101
- -2.73437500 ,
102
- 1.07031238 ,
103
- 0.35937503 ,
104
- 0.34374997 ,
105
- -0.77343750 ,
106
- 0.10937499 });
107
- Tensor out2_expected = tfFloat.make (
108
- {5 , 3 },
109
- {0.79116172 ,
110
- 0.42708409 ,
111
- 0.30238494 ,
112
- 0.50903118 ,
113
- 0.31929117 ,
114
- 0.45128885 ,
115
- 0.33067191 ,
116
- 0.39473253 ,
117
- 0.42994878 ,
118
- 0.53187561 ,
119
- 0.29930803 ,
120
- 0.29000264 ,
121
- 0.38669431 ,
122
- 0.38038814 ,
123
- 0.75809801 });
124
- op_native_group_norm_out (
125
- input, weight, bias, 5 , 6 , 4 , 3 , eps, out0, out1, out2);
126
- EXPECT_TENSOR_CLOSE (out0, out0_expected);
127
- EXPECT_TENSOR_CLOSE (out1, out1_expected);
128
- EXPECT_TENSOR_CLOSE (out2, out2_expected);
155
+ TEST_F (OpNativeGroupNormOutTest, SmokeTest) {
156
+ #define TEST_ENTRY (ctype, dtype ) test_dtype<ScalarType::dtype>();
157
+ ET_FORALL_FLOATHBF16_TYPES (TEST_ENTRY)
158
+ #undef TEST_ENTRY
129
159
}
0 commit comments