Skip to content

Commit 571b86e

Browse files
committed
Use generated files in module test
Pull Request resolved: #10497 Instead of checking in the PTE/PTD files. This helps us keep up to date with aot changes, especially with incoming flat_tensor refactor. Main changes here are with the model. Instead of using AddModule from examples/portable, use ModuleAdd from test/models/export_program, like our other tests. There is a shape difference (1 tensor vs 2 tensors+alpha), so we have to change the inputs. ghstack-source-id: 280783094 @exported-using-ghexport Differential Revision: [D73470865](https://our.internmc.facebook.com/intern/diff/D73470865/)
1 parent df75088 commit 571b86e

File tree

8 files changed

+132
-126
lines changed

8 files changed

+132
-126
lines changed

extension/module/test/CMakeLists.txt

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,31 @@ include(${EXECUTORCH_ROOT}/tools/cmake/Test.cmake)
1919

2020
set(_test_srcs module_test.cpp)
2121

22+
add_custom_command(
23+
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/ModuleAdd.pte"
24+
"${CMAKE_CURRENT_BINARY_DIR}/ModuleLinearProgram.pte"
25+
"${CMAKE_CURRENT_BINARY_DIR}/ModuleLinearProgram.ptd"
26+
COMMAND
27+
python3 -m test.models.export_program --modules "ModuleAdd"
28+
--outdir "${CMAKE_CURRENT_BINARY_DIR}" 2> /dev/null
29+
COMMAND
30+
python3 -m test.models.export_program --modules "ModuleLinear"
31+
--external-constants --outdir "${CMAKE_CURRENT_BINARY_DIR}" 2> /dev/null
32+
)
33+
34+
add_custom_target(
35+
generated_module_test_files
36+
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/ModuleAdd.pte"
37+
"${CMAKE_CURRENT_BINARY_DIR}/ModuleLinearProgram.pte"
38+
"${CMAKE_CURRENT_BINARY_DIR}/ModuleLinearProgram.ptd"
39+
)
40+
41+
set(test_env
42+
"ET_MODULE_ADD_PATH=${CMAKE_CURRENT_BINARY_DIR}/ModuleAdd.pte"
43+
"ET_MODULE_LINEAR_PROGRAM_PATH=${CMAKE_CURRENT_BINARY_DIR}/ModuleLinearProgram.pte"
44+
"ET_MODULE_LINEAR_DATA_PATH=${CMAKE_CURRENT_BINARY_DIR}/ModuleLinearProgram.ptd"
45+
)
46+
2247
et_cxx_test(
2348
extension_module_test
2449
SOURCES
@@ -31,7 +56,8 @@ et_cxx_test(
3156
portable_ops_lib
3257
)
3358

34-
set(test_env "RESOURCES_PATH=${EXECUTORCH_ROOT}/extension/module/test/resources")
59+
add_dependencies(extension_module_test generated_module_test_files)
60+
set_property(TEST extension_module_test PROPERTY ENVIRONMENT ${test_env})
3561

3662
set_property(
3763
TEST extension_module_test

extension/module/test/TARGETS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ load(":targets.bzl", "define_common_targets")
55

66
oncall("executorch")
77

8-
define_common_targets()
8+
define_common_targets(is_fbcode = True)

extension/module/test/module_test.cpp

Lines changed: 72 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include <executorch/extension/data_loader/file_data_loader.h>
1717
#include <executorch/extension/tensor/tensor.h>
18+
#include <executorch/runtime/core/exec_aten/testing_util/tensor_util.h>
1819

1920
using namespace ::executorch::extension;
2021
using namespace ::executorch::runtime;
@@ -26,9 +27,9 @@ class ModuleTest : public ::testing::Test {
2627
if (const char* env = std::getenv("RESOURCES_PATH")) {
2728
resources_path = env;
2829
}
29-
model_path_ = resources_path + "/add.pte";
30-
linear_path_ = resources_path + "/linear.pte";
31-
linear_data_path_ = resources_path + "/linear.ptd";
30+
model_path_ = std::getenv("ET_MODULE_ADD_PATH");
31+
linear_path_ = std::getenv("ET_MODULE_LINEAR_PROGRAM_PATH");
32+
linear_data_path_ = std::getenv("ET_MODULE_LINEAR_DATA_PATH");
3233
}
3334

3435
static inline std::string model_path_;
@@ -109,22 +110,29 @@ TEST_F(ModuleTest, TestMethodMeta) {
109110
const auto meta = module.method_meta("forward");
110111
EXPECT_EQ(meta.error(), Error::Ok);
111112
EXPECT_STREQ(meta->name(), "forward");
112-
EXPECT_EQ(meta->num_inputs(), 2);
113+
// tensor, tensor, alpha
114+
EXPECT_EQ(meta->num_inputs(), 3);
113115
EXPECT_EQ(*(meta->input_tag(0)), Tag::Tensor);
114116
EXPECT_EQ(meta->num_outputs(), 1);
115117
EXPECT_EQ(*(meta->output_tag(0)), Tag::Tensor);
116118

117119
const auto input_meta = meta->input_tensor_meta(0);
118120
EXPECT_EQ(input_meta.error(), Error::Ok);
119121
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);
122+
EXPECT_EQ(input_meta->sizes().size(), 2);
123+
EXPECT_EQ(input_meta->sizes()[0], 2);
124+
125+
const auto input_meta1 = meta->input_tensor_meta(1);
126+
EXPECT_EQ(input_meta1.error(), Error::Ok);
127+
EXPECT_EQ(input_meta1->scalar_type(), executorch::aten::ScalarType::Float);
128+
EXPECT_EQ(input_meta1->sizes().size(), 2);
129+
EXPECT_EQ(input_meta1->sizes()[0], 2);
122130

123131
const auto output_meta = meta->output_tensor_meta(0);
124132
EXPECT_EQ(output_meta.error(), Error::Ok);
125133
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);
134+
EXPECT_EQ(output_meta->sizes().size(), 2);
135+
EXPECT_EQ(output_meta->sizes()[0], 2);
128136
}
129137

130138
TEST_F(ModuleTest, TestNonExistentMethodMeta) {
@@ -136,17 +144,16 @@ TEST_F(ModuleTest, TestNonExistentMethodMeta) {
136144

137145
TEST_F(ModuleTest, TestExecute) {
138146
Module module(model_path_);
139-
auto tensor = make_tensor_ptr({1.f});
147+
auto tensor = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
140148

141-
const auto result = module.execute("forward", {tensor, tensor});
149+
const auto result = module.execute("forward", {tensor, tensor, 1.0});
142150
EXPECT_EQ(result.error(), Error::Ok);
143151

144152
EXPECT_TRUE(module.is_loaded());
145153
EXPECT_TRUE(module.is_method_loaded("forward"));
146154

147-
const auto data = result->at(0).toTensor().const_data_ptr<float>();
148-
149-
EXPECT_NEAR(data[0], 2, 1e-5);
155+
const auto expected = make_tensor_ptr({2, 2}, {2.f, 4.f, 6.f, 8.f});
156+
EXPECT_TENSOR_CLOSE(result->at(0).toTensor(), *expected.get());
150157
}
151158

152159
TEST_F(ModuleTest, TestExecutePreload) {
@@ -155,14 +162,13 @@ TEST_F(ModuleTest, TestExecutePreload) {
155162
const auto error = module.load();
156163
EXPECT_EQ(error, Error::Ok);
157164

158-
auto tensor = make_tensor_ptr({1.f});
165+
auto tensor = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
159166

160-
const auto result = module.execute("forward", {tensor, tensor});
167+
const auto result = module.execute("forward", {tensor, tensor, 1.0});
161168
EXPECT_EQ(result.error(), Error::Ok);
162169

163-
const auto data = result->at(0).toTensor().const_data_ptr<float>();
164-
165-
EXPECT_NEAR(data[0], 2, 1e-5);
170+
const auto expected = make_tensor_ptr({2, 2}, {2.f, 4.f, 6.f, 8.f});
171+
EXPECT_TENSOR_CLOSE(result->at(0).toTensor(), *expected.get());
166172
}
167173

168174
TEST_F(ModuleTest, TestExecutePreload_method) {
@@ -171,14 +177,13 @@ TEST_F(ModuleTest, TestExecutePreload_method) {
171177
const auto error = module.load_method("forward");
172178
EXPECT_EQ(error, Error::Ok);
173179

174-
auto tensor = make_tensor_ptr({1.f});
180+
auto tensor = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
175181

176-
const auto result = module.execute("forward", {tensor, tensor});
182+
const auto result = module.execute("forward", {tensor, tensor, 1.0});
177183
EXPECT_EQ(result.error(), Error::Ok);
178184

179-
const auto data = result->at(0).toTensor().const_data_ptr<float>();
180-
181-
EXPECT_NEAR(data[0], 2, 1e-5);
185+
const auto expected = make_tensor_ptr({2, 2}, {2.f, 4.f, 6.f, 8.f});
186+
EXPECT_TENSOR_CLOSE(result->at(0).toTensor(), *expected.get());
182187
}
183188

184189
TEST_F(ModuleTest, TestExecutePreloadProgramAndMethod) {
@@ -190,14 +195,13 @@ TEST_F(ModuleTest, TestExecutePreloadProgramAndMethod) {
190195
const auto load_method_error = module.load_method("forward");
191196
EXPECT_EQ(load_method_error, Error::Ok);
192197

193-
auto tensor = make_tensor_ptr({1.f});
198+
auto tensor = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
194199

195-
const auto result = module.execute("forward", {tensor, tensor});
200+
const auto result = module.execute("forward", {tensor, tensor, 1.0});
196201
EXPECT_EQ(result.error(), Error::Ok);
197202

198-
const auto data = result->at(0).toTensor().const_data_ptr<float>();
199-
200-
EXPECT_NEAR(data[0], 2, 1e-5);
203+
const auto expected = make_tensor_ptr({2, 2}, {2.f, 4.f, 6.f, 8.f});
204+
EXPECT_TENSOR_CLOSE(result->at(0).toTensor(), *expected.get());
201205
}
202206

203207
TEST_F(ModuleTest, TestExecuteOnNonExistent) {
@@ -219,32 +223,30 @@ TEST_F(ModuleTest, TestExecuteOnCurrupted) {
219223
TEST_F(ModuleTest, TestGet) {
220224
Module module(model_path_);
221225

222-
auto tensor = make_tensor_ptr({1.f});
226+
auto tensor = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
223227

224-
const auto result = module.get("forward", {tensor, tensor});
228+
const auto result = module.get("forward", {tensor, tensor, 1.0});
225229
EXPECT_EQ(result.error(), Error::Ok);
226-
const auto data = result->toTensor().const_data_ptr<float>();
227-
EXPECT_NEAR(data[0], 2, 1e-5);
230+
const auto expected = make_tensor_ptr({2, 2}, {2.f, 4.f, 6.f, 8.f});
231+
EXPECT_TENSOR_CLOSE(result->toTensor(), *expected.get());
228232
}
229233

230234
TEST_F(ModuleTest, TestForward) {
231235
auto module = std::make_unique<Module>(model_path_);
232-
auto tensor = make_tensor_ptr({21.f});
236+
auto tensor = make_tensor_ptr({2, 2}, {21.f, 22.f, 23.f, 24.f});
233237

234-
const auto result = module->forward({tensor, tensor});
238+
const auto result = module->forward({tensor, tensor, 1.0});
235239
EXPECT_EQ(result.error(), Error::Ok);
236240

237-
const auto data = result->at(0).toTensor().const_data_ptr<float>();
241+
const auto expected = make_tensor_ptr({2, 2}, {42.f, 44.f, 46.f, 48.f});
242+
EXPECT_TENSOR_CLOSE(result->at(0).toTensor(), *expected.get());
238243

239-
EXPECT_NEAR(data[0], 42, 1e-5);
240-
241-
auto tensor2 = make_tensor_ptr({2.f});
244+
auto tensor2 = make_tensor_ptr({2, 2}, {2.f, 3.f, 4.f, 5.f});
242245
const auto result2 = module->forward({tensor2, tensor2});
243246
EXPECT_EQ(result2.error(), Error::Ok);
244247

245-
const auto data2 = result->at(0).toTensor().const_data_ptr<float>();
246-
247-
EXPECT_NEAR(data2[0], 4, 1e-5);
248+
const auto expected2 = make_tensor_ptr({2, 2}, {4.f, 6.f, 8.f, 10.f});
249+
EXPECT_TENSOR_CLOSE(result2->at(0).toTensor(), *expected2.get());
248250
}
249251

250252
TEST_F(ModuleTest, TestForwardWithInvalidInputs) {
@@ -294,20 +296,20 @@ TEST_F(ModuleTest, TestProgramSharingAndDataLoaderManagement) {
294296
EXPECT_EQ(load_error, Error::Ok);
295297
EXPECT_TRUE(module1->is_loaded());
296298

297-
auto tensor = make_tensor_ptr({1.f});
299+
auto tensor = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
298300

299-
const auto result1 = module1->execute("forward", {tensor, tensor});
301+
const auto result1 = module1->execute("forward", {tensor, tensor, 1.0});
300302
EXPECT_EQ(result1.error(), Error::Ok);
301303

302304
auto module2 = std::make_unique<Module>(module1->program());
303305

304-
const auto result2 = module2->execute("forward", {tensor, tensor});
306+
const auto result2 = module2->execute("forward", {tensor, tensor, 1.0});
305307
EXPECT_EQ(result2.error(), Error::Ok);
306308

307309
module1 = std::make_unique<Module>("/path/to/nonexistent/file.pte");
308310
EXPECT_FALSE(module1->is_loaded());
309311

310-
const auto result3 = module2->execute("forward", {tensor, tensor});
312+
const auto result3 = module2->execute("forward", {tensor, tensor, 1.0});
311313
EXPECT_EQ(result3.error(), Error::Ok);
312314
}
313315

@@ -339,14 +341,13 @@ TEST_F(ModuleTest, TestProgramPersistenceAndReuseAfterModuleDestruction) {
339341

340342
EXPECT_EQ(module.program(), shared_program);
341343

342-
auto tensor = make_tensor_ptr({1.f});
344+
auto tensor = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
343345

344-
const auto result = module.execute("forward", {tensor, tensor});
346+
const auto result = module.execute("forward", {tensor, tensor, 1.0});
345347
EXPECT_EQ(result.error(), Error::Ok);
346348

347-
auto data = result->at(0).toTensor().const_data_ptr<float>();
348-
349-
EXPECT_NEAR(data[0], 2, 1e-5);
349+
const auto expected = make_tensor_ptr({2, 2}, {2.f, 4.f, 6.f, 8.f});
350+
EXPECT_TENSOR_CLOSE(result->at(0).toTensor(), *expected.get());
350351
}
351352

352353
TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) {
@@ -364,22 +365,22 @@ TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) {
364365
EXPECT_TRUE(program != nullptr);
365366

366367
auto thread = [](std::shared_ptr<Program> program,
367-
const std::array<float, 1>& input) {
368+
const std::array<float, 4>& input) {
368369
Module module(program);
369-
auto tensor = from_blob((void*)input.data(), {1});
370+
auto tensor = from_blob((void*)input.data(), {2, 2});
370371

371-
const auto result = module.forward({tensor, tensor});
372+
const auto result = module.forward({tensor, tensor, 1.0});
372373
EXPECT_EQ(result.error(), Error::Ok);
373374

374375
const auto data = result->at(0).toTensor().const_data_ptr<float>();
375376
EXPECT_NEAR(data[0], (input[0] * 2), 1e-5);
376377
};
377378

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});
379+
std::thread t1(thread, program, std::array<float, 4>{1, 2, 3, 4});
380+
std::thread t2(thread, program, std::array<float, 4>{2, 3, 4, 5});
381+
std::thread t3(thread, program, std::array<float, 4>{3, 4, 5, 6});
382+
std::thread t4(thread, program, std::array<float, 4>{4, 5, 6, 7});
383+
std::thread t5(thread, program, std::array<float, 4>{5, 6, 7, 8});
383384

384385
t1.join();
385386
t2.join();
@@ -391,37 +392,38 @@ TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) {
391392
TEST_F(ModuleTest, TestSetInputsBeforeExecute) {
392393
Module module(model_path_);
393394

394-
auto tensor1 = make_tensor_ptr({4.f});
395-
auto tensor2 = make_tensor_ptr({5.f});
395+
auto tensor1 = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
396+
auto tensor2 = make_tensor_ptr({2, 2}, {2.f, 3.f, 4.f, 5.f});
396397

397-
EXPECT_EQ(module.set_inputs({tensor1, tensor2}), Error::Ok);
398+
EXPECT_EQ(module.set_inputs({tensor1, tensor2, 1.0}), Error::Ok);
398399

399400
const auto result = module.forward();
400401
EXPECT_EQ(result.error(), Error::Ok);
401402

402-
const auto data = result->at(0).toTensor().const_data_ptr<float>();
403-
EXPECT_NEAR(data[0], 9, 1e-5);
403+
const auto expected = make_tensor_ptr({2, 2}, {3.f, 5.f, 7.f, 9.f});
404+
EXPECT_TENSOR_CLOSE(result->at(0).toTensor(), *expected.get());
404405
}
405406

406407
TEST_F(ModuleTest, TestSetInputCombinedWithExecute) {
407408
Module module(model_path_);
408409

409-
auto tensor1 = make_tensor_ptr({2.f});
410-
auto tensor2 = make_tensor_ptr({3.f});
410+
auto tensor1 = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
411+
auto tensor2 = make_tensor_ptr({2, 2}, {2.f, 3.f, 4.f, 5.f});
411412

412413
EXPECT_EQ(module.set_input(tensor2, 1), Error::Ok);
414+
EXPECT_EQ(module.set_input(1.0, 2), Error::Ok); // alpha
413415

414416
const auto result = module.forward(tensor1);
415417
EXPECT_EQ(result.error(), Error::Ok);
416418

417-
const auto data = result->at(0).toTensor().const_data_ptr<float>();
418-
EXPECT_NEAR(data[0], 5, 1e-5);
419+
const auto expected = make_tensor_ptr({2, 2}, {3.f, 5.f, 7.f, 9.f});
420+
EXPECT_TENSOR_CLOSE(result->at(0).toTensor(), *expected.get());
419421
}
420422

421423
TEST_F(ModuleTest, TestPartiallySetInputs) {
422424
Module module(model_path_);
423425

424-
auto tensor = make_tensor_ptr({1.f});
426+
auto tensor = make_tensor_ptr({2, 2}, {1.f, 2.f, 3.f, 4.f});
425427

426428
EXPECT_EQ(module.set_input(tensor, 0), Error::Ok);
427429

@@ -455,8 +457,6 @@ TEST_F(ModuleTest, TestPTD) {
455457

456458
ASSERT_EQ(module.load_method("forward"), Error::Ok);
457459

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);
460+
auto tensor = make_tensor_ptr({2, 2}, {2.f, 3.f, 4.f, 2.f});
461+
ASSERT_EQ(module.forward(tensor).error(), Error::Ok);
462462
}

extension/module/test/resources/README.md

Lines changed: 0 additions & 23 deletions
This file was deleted.
-728 Bytes
Binary file not shown.
-336 Bytes
Binary file not shown.
-1.18 KB
Binary file not shown.

0 commit comments

Comments
 (0)