Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions extension/module/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ et_cxx_test(
EXTRA_LIBS
extension_data_loader
extension_module_static
extension_tensor
portable_kernels
portable_ops_lib
)
96 changes: 25 additions & 71 deletions extension/module/test/module_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <gtest/gtest.h>

#include <executorch/extension/data_loader/file_data_loader.h>
#include <executorch/extension/tensor/tensor.h>

using namespace ::executorch::extension;
using namespace ::executorch::runtime;
Expand Down Expand Up @@ -121,17 +122,11 @@ TEST_F(ModuleTest, TestNonExistentMethodMeta) {

TEST_F(ModuleTest, TestExecute) {
Module module(model_path_);
auto tensor = make_tensor_ptr({1}, {1});

std::array<float, 1> input{1};
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input.data());

const auto result = module.execute(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result = module.execute("forward", {tensor, tensor});
EXPECT_TRUE(result.ok());

EXPECT_TRUE(result.ok());
EXPECT_TRUE(module.is_loaded());
EXPECT_TRUE(module.is_method_loaded("forward"));

Expand All @@ -146,13 +141,9 @@ TEST_F(ModuleTest, TestExecutePreload) {
const auto error = module.load();
EXPECT_EQ(error, Error::Ok);

std::array<float, 1> input{1};
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input.data());
auto tensor = make_tensor_ptr({1}, {1});

const auto result = module.execute(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result = module.execute("forward", {tensor, tensor});
EXPECT_TRUE(result.ok());

const auto data = result->at(0).toTensor().const_data_ptr<float>();
Expand All @@ -166,13 +157,9 @@ TEST_F(ModuleTest, TestExecutePreload_method) {
const auto error = module.load_method("forward");
EXPECT_EQ(error, Error::Ok);

std::array<float, 1> input{1};
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input.data());
auto tensor = make_tensor_ptr({1}, {1});

const auto result = module.execute(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result = module.execute("forward", {tensor, tensor});
EXPECT_TRUE(result.ok());

const auto data = result->at(0).toTensor().const_data_ptr<float>();
Expand All @@ -189,13 +176,9 @@ TEST_F(ModuleTest, TestExecutePreloadProgramAndMethod) {
const auto load_method_error = module.load_method("forward");
EXPECT_EQ(load_method_error, Error::Ok);

std::array<float, 1> input{1};
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input.data());
auto tensor = make_tensor_ptr({1}, {1});

const auto result = module.execute(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result = module.execute("forward", {tensor, tensor});
EXPECT_TRUE(result.ok());

const auto data = result->at(0).toTensor().const_data_ptr<float>();
Expand All @@ -222,40 +205,27 @@ TEST_F(ModuleTest, TestExecuteOnCurrupted) {
TEST_F(ModuleTest, TestGet) {
Module module(model_path_);

std::array<float, 1> input{1};
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input.data());

const auto result = module.get(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
auto tensor = make_tensor_ptr({1}, {1});

const auto result = module.get("forward", {tensor, tensor});
EXPECT_TRUE(result.ok());
const auto data = result->toTensor().const_data_ptr<float>();
EXPECT_NEAR(data[0], 2, 1e-5);
}

TEST_F(ModuleTest, TestForward) {
auto module = std::make_unique<Module>(model_path_);
auto tensor = make_tensor_ptr({21.f});

std::array<float, 1> input{1};
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input.data());

const auto result =
module->forward({exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result = module->forward({tensor, tensor});
EXPECT_TRUE(result.ok());

const auto data = result->at(0).toTensor().const_data_ptr<float>();

EXPECT_NEAR(data[0], 2, 1e-5);
EXPECT_NEAR(data[0], 42, 1e-5);

std::array<float, 2> input2{2, 3};
exec_aten::TensorImpl tensor2(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input2.data());
const auto result2 = module->forward(
{exec_aten::Tensor(&tensor2), exec_aten::Tensor(&tensor2)});
auto tensor2 = make_tensor_ptr({1}, {2, 3});
const auto result2 = module->forward({tensor2, tensor2});
EXPECT_TRUE(result2.ok());

const auto data2 = result->at(0).toTensor().const_data_ptr<float>();
Expand Down Expand Up @@ -310,26 +280,20 @@ TEST_F(ModuleTest, TestProgramSharingAndDataLoaderManagement) {
EXPECT_EQ(load_error, Error::Ok);
EXPECT_TRUE(module1->is_loaded());

std::array<float, 1> input{1};
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input.data());
auto tensor = make_tensor_ptr({1}, {1});

auto result1 = module1->execute(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result1 = module1->execute("forward", {tensor, tensor});
EXPECT_TRUE(result1.ok());

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

auto result2 = module2->execute(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result2 = module2->execute("forward", {tensor, tensor});
EXPECT_TRUE(result2.ok());

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

auto result3 = module2->execute(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result3 = module2->execute("forward", {tensor, tensor});
EXPECT_TRUE(result3.ok());
}

Expand Down Expand Up @@ -361,13 +325,9 @@ TEST_F(ModuleTest, TestProgramPersistenceAndReuseAfterModuleDestruction) {

EXPECT_EQ(module.program(), shared_program);

std::array<float, 1> input{1};
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float, sizes.size(), sizes.data(), input.data());
auto tensor = make_tensor_ptr({1}, {1});

auto result = module.execute(
"forward", {exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
const auto result = module.execute("forward", {tensor, tensor});
EXPECT_TRUE(result.ok());

auto data = result->at(0).toTensor().const_data_ptr<float>();
Expand All @@ -392,15 +352,9 @@ TEST_F(ModuleTest, TestConcurrentExecutionWithSharedProgram) {
auto thread = [](std::shared_ptr<Program> program,
const std::array<float, 1>& input) {
Module module(program);
std::array<int32_t, 1> sizes{1};
exec_aten::TensorImpl tensor(
exec_aten::ScalarType::Float,
sizes.size(),
sizes.data(),
(void*)input.data());

const auto result = module.forward(
{exec_aten::Tensor(&tensor), exec_aten::Tensor(&tensor)});
auto tensor = from_blob((void*)input.data(), {1});

const auto result = module.forward({tensor, tensor});
EXPECT_TRUE(result.ok());

const auto data = result->at(0).toTensor().const_data_ptr<float>();
Expand Down
41 changes: 27 additions & 14 deletions extension/module/test/targets.bzl
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
load(
"@fbsource//tools/build_defs:default_platform_defs.bzl",
"ANDROID",
"CXX",
)
load("@fbsource//xplat/executorch/build:runtime_wrapper.bzl", "runtime")

def define_common_targets():
Expand All @@ -7,20 +12,28 @@ def define_common_targets():
TARGETS and BUCK files that call this function.
"""

runtime.cxx_test(
name = "test",
srcs = [
"module_test.cpp",
],
deps = [
"//executorch/kernels/portable:generated_lib",
"//executorch/extension/data_loader:file_data_loader",
"//executorch/extension/module:module",
],
env = {
"RESOURCES_PATH": "$(location :resources)/resources",
},
)
for aten_mode in (True, False):
aten_suffix = ("_aten" if aten_mode else "")

runtime.cxx_test(
name = "test" + aten_suffix,
srcs = [
"module_test.cpp",
],
deps = [
"//executorch/kernels/portable:generated_lib" + aten_suffix,
"//executorch/extension/data_loader:file_data_loader",
"//executorch/extension/module:module" + aten_suffix,
"//executorch/extension/tensor:tensor" + aten_suffix,
],
env = {
"RESOURCES_PATH": "$(location :resources)/resources",
},
platforms = [CXX, ANDROID], # Cannot bundle resources on Apple platform.
compiler_flags = [
"-Wno-error=deprecated-declarations",
],
)

runtime.filegroup(
name = "resources",
Expand Down