15
15
16
16
#include < executorch/extension/data_loader/file_data_loader.h>
17
17
#include < executorch/extension/tensor/tensor.h>
18
+ #include < executorch/runtime/core/exec_aten/testing_util/tensor_util.h>
18
19
19
20
using namespace ::executorch::extension;
20
21
using namespace ::executorch::runtime;
21
22
22
23
class ModuleTest : public ::testing::Test {
23
24
protected:
24
25
static void SetUpTestSuite () {
25
- std::string resources_path;
26
- if (const char * env = std::getenv (" RESOURCES_PATH" )) {
27
- resources_path = env;
28
- }
29
- model_path_ = resources_path + " /add.pte" ;
30
- linear_path_ = resources_path + " /linear.pte" ;
31
- linear_data_path_ = resources_path + " /linear.ptd" ;
26
+ model_path_ = std::getenv (" ET_MODULE_ADD_PATH" );
27
+ linear_path_ = std::getenv (" ET_MODULE_LINEAR_PROGRAM_PATH" );
28
+ linear_data_path_ = std::getenv (" ET_MODULE_LINEAR_DATA_PATH" );
32
29
}
33
30
34
31
static inline std::string model_path_;
@@ -109,22 +106,29 @@ TEST_F(ModuleTest, TestMethodMeta) {
109
106
const auto meta = module .method_meta (" forward" );
110
107
EXPECT_EQ (meta.error (), Error::Ok);
111
108
EXPECT_STREQ (meta->name (), " forward" );
112
- EXPECT_EQ (meta->num_inputs (), 2 );
109
+ // tensor, tensor, alpha
110
+ EXPECT_EQ (meta->num_inputs (), 3 );
113
111
EXPECT_EQ (*(meta->input_tag (0 )), Tag::Tensor);
114
112
EXPECT_EQ (meta->num_outputs (), 1 );
115
113
EXPECT_EQ (*(meta->output_tag (0 )), Tag::Tensor);
116
114
117
115
const auto input_meta = meta->input_tensor_meta (0 );
118
116
EXPECT_EQ (input_meta.error (), Error::Ok);
119
117
EXPECT_EQ (input_meta->scalar_type (), executorch::aten::ScalarType::Float);
120
- EXPECT_EQ (input_meta->sizes ().size (), 1 );
121
- EXPECT_EQ (input_meta->sizes ()[0 ], 1 );
118
+ EXPECT_EQ (input_meta->sizes ().size (), 2 );
119
+ EXPECT_EQ (input_meta->sizes ()[0 ], 2 );
120
+
121
+ const auto input_meta1 = meta->input_tensor_meta (1 );
122
+ EXPECT_EQ (input_meta1.error (), Error::Ok);
123
+ EXPECT_EQ (input_meta1->scalar_type (), executorch::aten::ScalarType::Float);
124
+ EXPECT_EQ (input_meta1->sizes ().size (), 2 );
125
+ EXPECT_EQ (input_meta1->sizes ()[0 ], 2 );
122
126
123
127
const auto output_meta = meta->output_tensor_meta (0 );
124
128
EXPECT_EQ (output_meta.error (), Error::Ok);
125
129
EXPECT_EQ (output_meta->scalar_type (), executorch::aten::ScalarType::Float);
126
- EXPECT_EQ (output_meta->sizes ().size (), 1 );
127
- EXPECT_EQ (output_meta->sizes ()[0 ], 1 );
130
+ EXPECT_EQ (output_meta->sizes ().size (), 2 );
131
+ EXPECT_EQ (output_meta->sizes ()[0 ], 2 );
128
132
}
129
133
130
134
TEST_F (ModuleTest, TestNonExistentMethodMeta) {
@@ -136,17 +140,16 @@ TEST_F(ModuleTest, TestNonExistentMethodMeta) {
136
140
137
141
TEST_F (ModuleTest, TestExecute) {
138
142
Module module (model_path_);
139
- auto tensor = make_tensor_ptr ({1 .f });
143
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
140
144
141
- const auto result = module .execute (" forward" , {tensor, tensor});
145
+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
142
146
EXPECT_EQ (result.error (), Error::Ok);
143
147
144
148
EXPECT_TRUE (module .is_loaded ());
145
149
EXPECT_TRUE (module .is_method_loaded (" forward" ));
146
150
147
- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
148
-
149
- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
151
+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
152
+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
150
153
}
151
154
152
155
TEST_F (ModuleTest, TestExecutePreload) {
@@ -155,14 +158,13 @@ TEST_F(ModuleTest, TestExecutePreload) {
155
158
const auto error = module .load ();
156
159
EXPECT_EQ (error, Error::Ok);
157
160
158
- auto tensor = make_tensor_ptr ({1 .f });
161
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
159
162
160
- const auto result = module .execute (" forward" , {tensor, tensor});
163
+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
161
164
EXPECT_EQ (result.error (), Error::Ok);
162
165
163
- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
164
-
165
- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
166
+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
167
+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
166
168
}
167
169
168
170
TEST_F (ModuleTest, TestExecutePreload_method) {
@@ -171,14 +173,13 @@ TEST_F(ModuleTest, TestExecutePreload_method) {
171
173
const auto error = module .load_method (" forward" );
172
174
EXPECT_EQ (error, Error::Ok);
173
175
174
- auto tensor = make_tensor_ptr ({1 .f });
176
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
175
177
176
- const auto result = module .execute (" forward" , {tensor, tensor});
178
+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
177
179
EXPECT_EQ (result.error (), Error::Ok);
178
180
179
- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
180
-
181
- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
181
+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
182
+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
182
183
}
183
184
184
185
TEST_F (ModuleTest, TestExecutePreloadProgramAndMethod) {
@@ -190,14 +191,13 @@ TEST_F(ModuleTest, TestExecutePreloadProgramAndMethod) {
190
191
const auto load_method_error = module .load_method (" forward" );
191
192
EXPECT_EQ (load_method_error, Error::Ok);
192
193
193
- auto tensor = make_tensor_ptr ({1 .f });
194
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
194
195
195
- const auto result = module .execute (" forward" , {tensor, tensor});
196
+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
196
197
EXPECT_EQ (result.error (), Error::Ok);
197
198
198
- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
199
-
200
- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
199
+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
200
+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
201
201
}
202
202
203
203
TEST_F (ModuleTest, TestExecuteOnNonExistent) {
@@ -219,32 +219,30 @@ TEST_F(ModuleTest, TestExecuteOnCurrupted) {
219
219
TEST_F (ModuleTest, TestGet) {
220
220
Module module (model_path_);
221
221
222
- auto tensor = make_tensor_ptr ({1 .f });
222
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
223
223
224
- const auto result = module .get (" forward" , {tensor, tensor});
224
+ const auto result = module .get (" forward" , {tensor, tensor, 1.0 });
225
225
EXPECT_EQ (result.error (), Error::Ok);
226
- const auto data = result-> toTensor (). const_data_ptr < float >( );
227
- EXPECT_NEAR (data[ 0 ], 2 , 1e-5 );
226
+ const auto expected = make_tensor_ptr ({ 2 , 2 }, { 2 . f , 4 . f , 6 . f , 8 . f } );
227
+ EXPECT_TENSOR_CLOSE (result-> toTensor (), *expected. get () );
228
228
}
229
229
230
230
TEST_F (ModuleTest, TestForward) {
231
231
auto module = std::make_unique<Module>(model_path_);
232
- auto tensor = make_tensor_ptr ({21 .f });
232
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 21 . f , 22 . f , 23 . f , 24 .f });
233
233
234
- const auto result = module ->forward ({tensor, tensor});
234
+ const auto result = module ->forward ({tensor, tensor, 1.0 });
235
235
EXPECT_EQ (result.error (), Error::Ok);
236
236
237
- const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
237
+ const auto expected = make_tensor_ptr ({2 , 2 }, {42 .f , 44 .f , 46 .f , 48 .f });
238
+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
238
239
239
- EXPECT_NEAR (data[0 ], 42 , 1e-5 );
240
-
241
- auto tensor2 = make_tensor_ptr ({2 .f });
240
+ auto tensor2 = make_tensor_ptr ({2 , 2 }, {2 .f , 3 .f , 4 .f , 5 .f });
242
241
const auto result2 = module ->forward ({tensor2, tensor2});
243
242
EXPECT_EQ (result2.error (), Error::Ok);
244
243
245
- const auto data2 = result->at (0 ).toTensor ().const_data_ptr <float >();
246
-
247
- EXPECT_NEAR (data2[0 ], 4 , 1e-5 );
244
+ const auto expected2 = make_tensor_ptr ({2 , 2 }, {4 .f , 6 .f , 8 .f , 10 .f });
245
+ EXPECT_TENSOR_CLOSE (result2->at (0 ).toTensor (), *expected2.get ());
248
246
}
249
247
250
248
TEST_F (ModuleTest, TestForwardWithInvalidInputs) {
@@ -294,20 +292,20 @@ TEST_F(ModuleTest, TestProgramSharingAndDataLoaderManagement) {
294
292
EXPECT_EQ (load_error, Error::Ok);
295
293
EXPECT_TRUE (module1->is_loaded ());
296
294
297
- auto tensor = make_tensor_ptr ({1 .f });
295
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
298
296
299
- const auto result1 = module1->execute (" forward" , {tensor, tensor});
297
+ const auto result1 = module1->execute (" forward" , {tensor, tensor, 1.0 });
300
298
EXPECT_EQ (result1.error (), Error::Ok);
301
299
302
300
auto module2 = std::make_unique<Module>(module1->program ());
303
301
304
- const auto result2 = module2->execute (" forward" , {tensor, tensor});
302
+ const auto result2 = module2->execute (" forward" , {tensor, tensor, 1.0 });
305
303
EXPECT_EQ (result2.error (), Error::Ok);
306
304
307
305
module1 = std::make_unique<Module>(" /path/to/nonexistent/file.pte" );
308
306
EXPECT_FALSE (module1->is_loaded ());
309
307
310
- const auto result3 = module2->execute (" forward" , {tensor, tensor});
308
+ const auto result3 = module2->execute (" forward" , {tensor, tensor, 1.0 });
311
309
EXPECT_EQ (result3.error (), Error::Ok);
312
310
}
313
311
@@ -339,14 +337,13 @@ TEST_F(ModuleTest, TestProgramPersistenceAndReuseAfterModuleDestruction) {
339
337
340
338
EXPECT_EQ (module .program (), shared_program);
341
339
342
- auto tensor = make_tensor_ptr ({1 .f });
340
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
343
341
344
- const auto result = module .execute (" forward" , {tensor, tensor});
342
+ const auto result = module .execute (" forward" , {tensor, tensor, 1.0 });
345
343
EXPECT_EQ (result.error (), Error::Ok);
346
344
347
- auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
348
-
349
- EXPECT_NEAR (data[0 ], 2 , 1e-5 );
345
+ const auto expected = make_tensor_ptr ({2 , 2 }, {2 .f , 4 .f , 6 .f , 8 .f });
346
+ EXPECT_TENSOR_CLOSE (result->at (0 ).toTensor (), *expected.get ());
350
347
}
351
348
352
349
TEST_F (ModuleTest, TestConcurrentExecutionWithSharedProgram) {
@@ -364,22 +361,22 @@ TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) {
364
361
EXPECT_TRUE (program != nullptr );
365
362
366
363
auto thread = [](std::shared_ptr<Program> program,
367
- const std::array<float , 1 >& input) {
364
+ const std::array<float , 4 >& input) {
368
365
Module module (program);
369
- auto tensor = from_blob ((void *)input.data (), {1 });
366
+ auto tensor = from_blob ((void *)input.data (), {2 , 2 });
370
367
371
- const auto result = module .forward ({tensor, tensor});
368
+ const auto result = module .forward ({tensor, tensor, 1.0 });
372
369
EXPECT_EQ (result.error (), Error::Ok);
373
370
374
371
const auto data = result->at (0 ).toTensor ().const_data_ptr <float >();
375
372
EXPECT_NEAR (data[0 ], (input[0 ] * 2 ), 1e-5 );
376
373
};
377
374
378
- std::thread t1 (thread, program, std::array<float , 1 >{1 });
379
- std::thread t2 (thread, program, std::array<float , 1 >{2 });
380
- std::thread t3 (thread, program, std::array<float , 1 >{3 });
381
- std::thread t4 (thread, program, std::array<float , 1 >{4 });
382
- std::thread t5 (thread, program, std::array<float , 1 >{5 });
375
+ std::thread t1 (thread, program, std::array<float , 4 >{1 , 2 , 3 , 4 });
376
+ std::thread t2 (thread, program, std::array<float , 4 >{2 , 3 , 4 , 5 });
377
+ std::thread t3 (thread, program, std::array<float , 4 >{3 , 4 , 5 , 6 });
378
+ std::thread t4 (thread, program, std::array<float , 4 >{4 , 5 , 6 , 7 });
379
+ std::thread t5 (thread, program, std::array<float , 4 >{5 , 6 , 7 , 8 });
383
380
384
381
t1.join ();
385
382
t2.join ();
@@ -391,37 +388,38 @@ TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) {
391
388
TEST_F (ModuleTest, TestSetInputsBeforeExecute) {
392
389
Module module (model_path_);
393
390
394
- auto tensor1 = make_tensor_ptr ({4 .f });
395
- auto tensor2 = make_tensor_ptr ({5 .f });
391
+ auto tensor1 = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
392
+ auto tensor2 = make_tensor_ptr ({2 , 2 }, { 2 . f , 3 . f , 4 . f , 5 .f });
396
393
397
- EXPECT_EQ (module .set_inputs ({tensor1, tensor2}), Error::Ok);
394
+ EXPECT_EQ (module .set_inputs ({tensor1, tensor2, 1.0 }), Error::Ok);
398
395
399
396
const auto result = module .forward ();
400
397
EXPECT_EQ (result.error (), Error::Ok);
401
398
402
- const auto data = result-> at ( 0 ). toTensor (). const_data_ptr < float >( );
403
- EXPECT_NEAR (data[ 0 ], 9 , 1e-5 );
399
+ const auto expected = make_tensor_ptr ({ 2 , 2 }, { 3 . f , 5 . f , 7 . f , 9 . f } );
400
+ EXPECT_TENSOR_CLOSE (result-> at ( 0 ). toTensor (), *expected. get () );
404
401
}
405
402
406
403
TEST_F (ModuleTest, TestSetInputCombinedWithExecute) {
407
404
Module module (model_path_);
408
405
409
- auto tensor1 = make_tensor_ptr ({2 .f });
410
- auto tensor2 = make_tensor_ptr ({3 .f });
406
+ auto tensor1 = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
407
+ auto tensor2 = make_tensor_ptr ({2 , 2 }, { 2 . f , 3 . f , 4 . f , 5 .f });
411
408
412
409
EXPECT_EQ (module .set_input (tensor2, 1 ), Error::Ok);
410
+ EXPECT_EQ (module .set_input (1.0 , 2 ), Error::Ok); // alpha
413
411
414
412
const auto result = module .forward (tensor1);
415
413
EXPECT_EQ (result.error (), Error::Ok);
416
414
417
- const auto data = result-> at ( 0 ). toTensor (). const_data_ptr < float >( );
418
- EXPECT_NEAR (data[ 0 ], 5 , 1e-5 );
415
+ const auto expected = make_tensor_ptr ({ 2 , 2 }, { 3 . f , 5 . f , 7 . f , 9 . f } );
416
+ EXPECT_TENSOR_CLOSE (result-> at ( 0 ). toTensor (), *expected. get () );
419
417
}
420
418
421
419
TEST_F (ModuleTest, TestPartiallySetInputs) {
422
420
Module module (model_path_);
423
421
424
- auto tensor = make_tensor_ptr ({1 .f });
422
+ auto tensor = make_tensor_ptr ({2 , 2 }, { 1 . f , 2 . f , 3 . f , 4 .f });
425
423
426
424
EXPECT_EQ (module .set_input (tensor, 0 ), Error::Ok);
427
425
@@ -455,8 +453,6 @@ TEST_F(ModuleTest, TestPTD) {
455
453
456
454
ASSERT_EQ (module .load_method (" forward" ), Error::Ok);
457
455
458
- auto tensor1 =
459
- make_tensor_ptr ({3 , 3 }, {2 .f , 3 .f , 4 .f , 2 .f , 3 .f , 4 .f , 2 .f , 3 .f , 4 .f });
460
-
461
- ASSERT_EQ (module .forward (tensor1).error (), Error::Ok);
456
+ auto tensor = make_tensor_ptr ({2 , 2 }, {2 .f , 3 .f , 4 .f , 2 .f });
457
+ ASSERT_EQ (module .forward (tensor).error (), Error::Ok);
462
458
}
0 commit comments