From 0da16dfb5e4a8ec081fb0678efd18a7925e36468 Mon Sep 17 00:00:00 2001 From: Lucy Qiu Date: Thu, 5 Sep 2024 15:01:29 -0700 Subject: [PATCH] Update module/test .pte file Summary: - Update module .pte file to not use constant_buffer (which is deprecated moving forwards). - Use add model, generated from toy_model AddModule (previously was average, no nn.Module definition). Add repro instructions for the .pte file. Differential Revision: D62260916 --- extension/module/test/module_test.cpp | 105 ++++++++++++---------- extension/module/test/resources/README.md | 4 + extension/module/test/resources/add.pte | Bin 0 -> 728 bytes extension/module/test/resources/model.pte | Bin 1600 -> 0 bytes 4 files changed, 61 insertions(+), 48 deletions(-) create mode 100644 extension/module/test/resources/README.md create mode 100644 extension/module/test/resources/add.pte delete mode 100644 extension/module/test/resources/model.pte diff --git a/extension/module/test/module_test.cpp b/extension/module/test/module_test.cpp index 4ef454e1c75..75cead25a72 100644 --- a/extension/module/test/module_test.cpp +++ b/extension/module/test/module_test.cpp @@ -22,7 +22,7 @@ namespace torch::executor { class ModuleTest : public ::testing::Test { protected: static void SetUpTestSuite() { - model_path_ = std::getenv("RESOURCES_PATH") + std::string("/model.pte"); + model_path_ = std::getenv("RESOURCES_PATH") + std::string("/add.pte"); } static std::string model_path_; @@ -95,7 +95,7 @@ TEST_F(ModuleTest, TestMethodMeta) { const auto meta = module.method_meta("forward"); EXPECT_TRUE(meta.ok()); EXPECT_STREQ(meta->name(), "forward"); - EXPECT_EQ(meta->num_inputs(), 1); + EXPECT_EQ(meta->num_inputs(), 2); EXPECT_EQ(*(meta->input_tag(0)), Tag::Tensor); EXPECT_EQ(meta->num_outputs(), 1); EXPECT_EQ(*(meta->output_tag(0)), Tag::Tensor); @@ -103,9 +103,8 @@ TEST_F(ModuleTest, TestMethodMeta) { const auto input_meta = meta->input_tensor_meta(0); EXPECT_TRUE(input_meta.ok()); EXPECT_EQ(input_meta->scalar_type(), ScalarType::Float); - EXPECT_EQ(input_meta->sizes().size(), 2); + EXPECT_EQ(input_meta->sizes().size(), 1); EXPECT_EQ(input_meta->sizes()[0], 1); - EXPECT_EQ(input_meta->sizes()[1], 2); const auto output_meta = meta->output_tensor_meta(0); EXPECT_TRUE(output_meta.ok()); @@ -124,19 +123,22 @@ TEST_F(ModuleTest, TestNonExistentMethodMeta) { TEST_F(ModuleTest, TestExecute) { Module module(model_path_); - std::array input{1, 2}; - std::array sizes{1, 2}; + std::array input{1}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), input.data()); - const auto result = module.execute("forward", Tensor(&tensor)); + const auto result = + module.execute("forward", {Tensor(&tensor), Tensor(&tensor)}); + EXPECT_TRUE(result.ok()); + EXPECT_TRUE(result.ok()); EXPECT_TRUE(module.is_loaded()); EXPECT_TRUE(module.is_method_loaded("forward")); const auto data = result->at(0).toTensor().const_data_ptr(); - EXPECT_NEAR(data[0], 1.5, 1e-5); + EXPECT_NEAR(data[0], 2, 1e-5); } TEST_F(ModuleTest, TestExecutePreload) { @@ -145,17 +147,18 @@ TEST_F(ModuleTest, TestExecutePreload) { const auto error = module.load(); EXPECT_EQ(error, Error::Ok); - std::array input{1, 2}; - std::array sizes{1, 2}; + std::array input{1}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), input.data()); - const auto result = module.execute("forward", Tensor(&tensor)); + const auto result = + module.execute("forward", {Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result.ok()); const auto data = result->at(0).toTensor().const_data_ptr(); - EXPECT_NEAR(data[0], 1.5, 1e-5); + EXPECT_NEAR(data[0], 2, 1e-5); } TEST_F(ModuleTest, TestExecutePreload_method) { @@ -164,17 +167,18 @@ TEST_F(ModuleTest, TestExecutePreload_method) { const auto error = module.load_method("forward"); EXPECT_EQ(error, Error::Ok); - std::array input{1, 2}; - std::array sizes{1, 2}; + std::array input{1}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), input.data()); - const auto result = module.execute("forward", Tensor(&tensor)); + const auto result = + module.execute("forward", {Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result.ok()); const auto data = result->at(0).toTensor().const_data_ptr(); - EXPECT_NEAR(data[0], 1.5, 1e-5); + EXPECT_NEAR(data[0], 2, 1e-5); } TEST_F(ModuleTest, TestExecutePreloadProgramAndMethod) { @@ -186,17 +190,18 @@ TEST_F(ModuleTest, TestExecutePreloadProgramAndMethod) { const auto load_method_error = module.load_method("forward"); EXPECT_EQ(load_method_error, Error::Ok); - std::array input{1, 2}; - std::array sizes{1, 2}; + std::array input{1}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), input.data()); - const auto result = module.execute("forward", Tensor(&tensor)); + const auto result = + module.execute("forward", {Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result.ok()); const auto data = result->at(0).toTensor().const_data_ptr(); - EXPECT_NEAR(data[0], 1.5, 1e-5); + EXPECT_NEAR(data[0], 2, 1e-5); } TEST_F(ModuleTest, TestExecuteOnNonExistent) { @@ -218,41 +223,42 @@ TEST_F(ModuleTest, TestExecuteOnCurrupted) { TEST_F(ModuleTest, TestGet) { Module module(model_path_); - std::array input{1, 2}; - std::array sizes{1, 2}; + std::array input{1}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), input.data()); - const auto result = module.get("forward", Tensor(&tensor)); + const auto result = module.get("forward", {Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result.ok()); const auto data = result->toTensor().const_data_ptr(); - EXPECT_NEAR(data[0], 1.5, 1e-5); + EXPECT_NEAR(data[0], 2, 1e-5); } TEST_F(ModuleTest, TestForward) { auto module = std::make_unique(model_path_); - std::array input{1, 2}; - std::array sizes{1, 2}; + std::array input{1}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), input.data()); - const auto result = module->forward(Tensor(&tensor)); + + const auto result = module->forward({Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result.ok()); const auto data = result->at(0).toTensor().const_data_ptr(); - EXPECT_NEAR(data[0], 1.5, 1e-5); + EXPECT_NEAR(data[0], 2, 1e-5); std::array input2{2, 3}; TensorImpl tensor2( ScalarType::Float, sizes.size(), sizes.data(), input2.data()); - const auto result2 = module->forward(Tensor(&tensor2)); + const auto result2 = module->forward({Tensor(&tensor2), Tensor(&tensor2)}); EXPECT_TRUE(result2.ok()); const auto data2 = result->at(0).toTensor().const_data_ptr(); - EXPECT_NEAR(data2[0], 2.5, 1e-5); + EXPECT_NEAR(data2[0], 4, 1e-5); } TEST_F(ModuleTest, TestForwardWithInvalidInputs) { @@ -303,23 +309,26 @@ TEST_F(ModuleTest, TestProgramSharingAndDataLoaderManagement) { EXPECT_EQ(load_error, Error::Ok); EXPECT_TRUE(module1->is_loaded()); - std::array input{1, 2}; - std::array sizes{1, 2}; + std::array input{1}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), input.data()); - auto result1 = module1->execute("forward", Tensor(&tensor)); + auto result1 = + module1->execute("forward", {Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result1.ok()); auto module2 = std::make_unique(module1->program()); - auto result2 = module2->execute("forward", Tensor(&tensor)); + auto result2 = + module2->execute("forward", {Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result2.ok()); module1 = std::make_unique("/path/to/nonexistent/file.pte"); EXPECT_FALSE(module1->is_loaded()); - auto result3 = module2->execute("forward", Tensor(&tensor)); + auto result3 = + module2->execute("forward", {Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result3.ok()); } @@ -351,17 +360,17 @@ TEST_F(ModuleTest, TestProgramPersistenceAndReuseAfterModuleDestruction) { EXPECT_EQ(module.program(), shared_program); - std::array input{1, 2}; - std::array sizes{1, 2}; + std::array input{1}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), input.data()); - auto result = module.execute("forward", Tensor(&tensor)); + auto result = module.execute("forward", {Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result.ok()); auto data = result->at(0).toTensor().const_data_ptr(); - EXPECT_NEAR(data[0], 1.5, 1e-5); + EXPECT_NEAR(data[0], 2, 1e-5); } TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) { @@ -379,24 +388,24 @@ TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) { EXPECT_TRUE(program != nullptr); auto thread = [](std::shared_ptr program, - const std::array& input) { + const std::array& input) { Module module(program); - std::array sizes{1, 2}; + std::array sizes{1}; TensorImpl tensor( ScalarType::Float, sizes.size(), sizes.data(), (void*)input.data()); - const auto result = module.forward(Tensor(&tensor)); + const auto result = module.forward({Tensor(&tensor), Tensor(&tensor)}); EXPECT_TRUE(result.ok()); const auto data = result->at(0).toTensor().const_data_ptr(); - EXPECT_NEAR(data[0], (input[0] + input[1]) / 2.0, 1e-5); + EXPECT_NEAR(data[0], (input[0] * 2), 1e-5); }; - std::thread t1(thread, program, std::array{1, 2}); - std::thread t2(thread, program, std::array{2, 3}); - std::thread t3(thread, program, std::array{3, 4}); - std::thread t4(thread, program, std::array{4, 5}); - std::thread t5(thread, program, std::array{5, 6}); + std::thread t1(thread, program, std::array{1}); + std::thread t2(thread, program, std::array{2}); + std::thread t3(thread, program, std::array{3}); + std::thread t4(thread, program, std::array{4}); + std::thread t5(thread, program, std::array{5}); t1.join(); t2.join(); diff --git a/extension/module/test/resources/README.md b/extension/module/test/resources/README.md new file mode 100644 index 00000000000..5067c870a3c --- /dev/null +++ b/extension/module/test/resources/README.md @@ -0,0 +1,4 @@ +## Resources + +### model.pte +- generated via `buck2 run fbcode//executorch/examples/portable/scripts:export -- --model_name="add"` after D62209852. diff --git a/extension/module/test/resources/add.pte b/extension/module/test/resources/add.pte new file mode 100644 index 0000000000000000000000000000000000000000..43252ca7d3d05e8fe847e122c9c7de976e0e0096 GIT binary patch literal 728 zcmZ`$O-_Sg5Pi1LVna-08q!40d z9v`$+<8G4NtCNznyo*d;{901sofq4 z&95FC(_^3>z=$tz@ie@O=wFQ6?sRR{e3+V%PkTlvcFUN0_=L1XT6i=0w*D?~&6+W_ zm?cw28ad;8ZTa+8zxfcf= X8imU+Ugk*@$4qIuZ+H9Wa$n&GV)QgK literal 0 HcmV?d00001 diff --git a/extension/module/test/resources/model.pte b/extension/module/test/resources/model.pte deleted file mode 100644 index 91b52416847fff9a794db423583a0c8c5a303d66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1600 zcmbtUF>6y%6h2LpG`67x38h1a$0LYCkyaeiEbSs>a5ICDhBhX*B=CHR$qS80K{`1U zXNL|&931)!#9tu#4;(T$Iyg9V(8lk(C%1VGUBnAt?z!iF=R4<~d-K*rl*siS$iyu-6$x zFl7m-M2@Fz2}U6M0xKZM07ofLj3j#QKR!jPJqb zp3{bj>>9(kS26A**tmi#F5`Gk<{-`|+^qF;hi6cJ8ncUKU0gGsaD)4-k27I)K=^>g zK2QX*z%T5LfHQ!1Tmg0fo?+wC_98|5SnV|5io44@V?6_8?BGnalxusq56&>A^EsxI z2bbDU;A7kd;KsS~65M|ejZZO+Wvt;|^6=v{PA3|yZML2Zjnz9vY)0efwVz2_!%%$- z>=QehftP({e(LcZaGWVG;dp#o?mm=(^DD>p?W5Xh51X#mGJMpeZ?@KqEaUz&_O7v= z;(tu!He&fI_$A@U!DGiYUDifD_Q1XcEI8B0nbC1=*2C}8R5@p3;Z9S7{c-idwDEj} z^p^qlW(%lpu6r;2=tbA~B`+KV!Mf)+I$>mnQOwb52hE-d_xfGafV)~dsv-7rHr{_a zXa`X{?B9z9-N5+Qw0x>t*R0xA{{M~tm->%l=bq+mwj0q*+11*OMWY350{ef^=^fU4 GP5BEPFB_=<