From af40643e1c8ba3af8656104a01a5587e7ccdc874 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=D0=94=D0=B8=D0=BB=D1=88=D0=BE=D0=B4=D0=B6=D0=BE=D0=BD=20?= =?utf8?q?=D0=A3=D0=BC=D1=80=D0=BE=D0=BD=D1=85=D0=BE=D0=BD=D0=BE=D0=B2?= =?utf8?q?=D0=B8=D1=87=20=D0=9F=D0=BE=D1=88=D1=88=D0=BE=D0=B5=D0=B2/AI=20T?= =?utf8?q?ools=20Lab=20/SRR/Engineer/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Fri, 21 Dec 2018 04:08:40 +0300 Subject: [PATCH] [neurun] Load backend dynamically as plugin (#3863) Load backends dynamically as plugins during runtime Signed-off-by: Poshshoev Dilshodzhon --- runtimes/neurun/CMakeLists.txt | 7 +-- runtimes/neurun/src/backend/BackendManager.cc | 71 +++++++++++++++-------- runtimes/neurun/src/backend/BackendManager.h | 10 ++++ runtimes/neurun/src/backend/acl_cl/CMakeLists.txt | 1 + runtimes/neurun/src/backend/cpu/CMakeLists.txt | 3 +- 5 files changed, 61 insertions(+), 31 deletions(-) diff --git a/runtimes/neurun/CMakeLists.txt b/runtimes/neurun/CMakeLists.txt index 8b28b2d..5f7f100 100644 --- a/runtimes/neurun/CMakeLists.txt +++ b/runtimes/neurun/CMakeLists.txt @@ -38,10 +38,7 @@ target_link_libraries(${LIB_NEURUN} arm_compute) target_link_libraries(${LIB_NEURUN} tensorflow-lite) target_link_libraries(${LIB_NEURUN} nnfw_lib_misc) target_link_libraries(${LIB_NEURUN} nnfw_lib_nnapi) - -# TODO This will be removed when backends are converted to plugins -target_link_libraries(${LIB_NEURUN} ${LIB_NEURUN_BACKEND_CPU}) -target_link_libraries(${LIB_NEURUN} ${LIB_NEURUN_BACKEND_ACL_CL}) +target_link_libraries(${LIB_NEURUN} nnfw_lib_cpp14) target_compile_options(${LIB_NEURUN} PRIVATE -Wall -Wextra -Werror) @@ -61,6 +58,8 @@ target_link_libraries(${TEST_NEURUN} ${LIB_NEURUN}) target_link_libraries(${TEST_NEURUN} gtest) target_link_libraries(${TEST_NEURUN} gtest_main) target_link_libraries(${TEST_NEURUN} ${LIB_PTHREAD}) +target_link_libraries(${TEST_NEURUN} ${LIB_NEURUN_BACKEND_CPU}) +target_link_libraries(${TEST_NEURUN} ${LIB_NEURUN_BACKEND_ACL_CL}) add_test(${TEST_NEURUN} ${TEST_NEURUN}) install(TARGETS ${TEST_NEURUN} DESTINATION unittest) diff --git a/runtimes/neurun/src/backend/BackendManager.cc b/runtimes/neurun/src/backend/BackendManager.cc index 0357f4f..5d19d40 100644 --- a/runtimes/neurun/src/backend/BackendManager.cc +++ b/runtimes/neurun/src/backend/BackendManager.cc @@ -20,6 +20,8 @@ #include "backend/interface/IConfig.h" #include "backend/interface/ITensorBuilder.h" #include "backend/interface/IStageGenerator.h" +#include "util/logging.h" +#include "util/config/ConfigManager.h" namespace neurun { @@ -55,39 +57,58 @@ void BackendManager::loadObjectFromPlugin(std::shared_ptr &object_of_plugin_c allocate_obj = (T * (*)(Types && ... Args))dlsym(handle, obj_creator_func_name.c_str()); if (allocate_obj == nullptr) { - fprintf(stderr, "BackendManager: unable to open function %s: %s", obj_creator_func_name.c_str(), - dlerror()); + fprintf(stderr, "BackendManager: unable to open function %s: %s\n", + obj_creator_func_name.c_str(), dlerror()); abort(); } object_of_plugin_class.reset(allocate_obj(args...)); } + +void BackendManager::loadBackend(const std::string &backend, + const neurun::model::operand::Set &operands) +{ + const std::string backend_plugin = "libbackend_" + backend + ".so"; + void *handle = dlopen(backend_plugin.c_str(), RTLD_LAZY | RTLD_LOCAL); + if (handle == nullptr) + { + fprintf(stderr, "BackendManager::loadBackend failed to load plugin of %s backend: %s\n", + backend.c_str(), dlerror()); + abort(); + } + VERBOSE(BackendManager::loadBackend) << "loaded " << backend_plugin << " as a plugin of " + << backend << " backend\n"; + + // load Config + std::shared_ptr config; + loadObjectFromPlugin(config, std::string("allocate_Config"), handle); + + // load TensorBuilder + std::shared_ptr tensor_builder; + loadObjectFromPlugin(tensor_builder, std::string("allocate_TensorBuilder"), handle); + + // load StageGenerator + std::shared_ptr stage_gen; + loadObjectFromPlugin(stage_gen, std::string("allocate_StageGenerator"), handle, operands, + tensor_builder); + _gen_map[config->id()] = {config, stage_gen}; +} + BackendManager::BackendManager(const neurun::model::operand::Set &operands) { - // TODO handle plugin loading: TBD how - std::string plugins[] = {"libbackend_acl_cl.so", "libbackend_cpu.so"}; - for (auto plugin : plugins) + const auto backends = config::ConfigManager::instance().get("BACKENDS"); + size_t prev_pos = 0; + auto pos = backends.find(";"); + while (pos != std::string::npos) + { + loadBackend(backends.substr(prev_pos, pos - prev_pos), operands); + prev_pos = pos + 1; + pos = backends.find(";", prev_pos); + } + // if backends doesn't terminate with ";" + if (prev_pos < backends.size()) { - void *handle = dlopen(plugin.c_str(), RTLD_LAZY | RTLD_LOCAL); - if (handle == nullptr) - { - fprintf(stderr, "BackendManager %s: %s\n", plugin.c_str(), dlerror()); - abort(); - } - - // load Config - std::shared_ptr config; - loadObjectFromPlugin(config, std::string("allocate_Config"), handle); - - // load TensorBuilder - std::shared_ptr tensor_builder; - loadObjectFromPlugin(tensor_builder, std::string("allocate_TensorBuilder"), handle); - - // load StageGenerator - std::shared_ptr stage_gen; - loadObjectFromPlugin(stage_gen, std::string("allocate_StageGenerator"), handle, operands, - tensor_builder); - _gen_map[config->id()] = {config, stage_gen}; + loadBackend(backends.substr(prev_pos), operands); } } diff --git a/runtimes/neurun/src/backend/BackendManager.h b/runtimes/neurun/src/backend/BackendManager.h index 2dad8a1..428542b 100644 --- a/runtimes/neurun/src/backend/BackendManager.h +++ b/runtimes/neurun/src/backend/BackendManager.h @@ -76,6 +76,16 @@ private: void loadObjectFromPlugin(std::shared_ptr &object_of_plugin_class, const std::string obj_creator_func_name, void *handle, Types &&... args); + + /** + * @brief load backend plugin + * + * @param backend backend to be loaded + * @param operands operands to construct StageGenerator + * + * @return + */ + void loadBackend(const std::string &backend, const neurun::model::operand::Set &operands); }; } // namespace backend diff --git a/runtimes/neurun/src/backend/acl_cl/CMakeLists.txt b/runtimes/neurun/src/backend/acl_cl/CMakeLists.txt index 737f1be..54897e7 100644 --- a/runtimes/neurun/src/backend/acl_cl/CMakeLists.txt +++ b/runtimes/neurun/src/backend/acl_cl/CMakeLists.txt @@ -9,6 +9,7 @@ target_include_directories(${LIB_NEURUN_BACKEND_ACL_CL} PUBLIC ${CMAKE_SOURCE_DI target_link_libraries(${LIB_NEURUN_BACKEND_ACL_CL} arm_compute) target_link_libraries(${LIB_NEURUN_BACKEND_ACL_CL} nnfw_lib_nnapi) target_link_libraries(${LIB_NEURUN_BACKEND_ACL_CL} ${LIB_NEURUN_KERNEL_ACL_CL}) +target_link_libraries(${LIB_NEURUN_BACKEND_ACL_CL} ${LIB_NEURUN}) target_compile_options(${LIB_NEURUN_BACKEND_ACL_CL} PRIVATE -Wall -Wextra -Werror) diff --git a/runtimes/neurun/src/backend/cpu/CMakeLists.txt b/runtimes/neurun/src/backend/cpu/CMakeLists.txt index 20c4f66..5ffbf33 100644 --- a/runtimes/neurun/src/backend/cpu/CMakeLists.txt +++ b/runtimes/neurun/src/backend/cpu/CMakeLists.txt @@ -11,8 +11,7 @@ target_link_libraries(${LIB_NEURUN_BACKEND_CPU} tensorflow-lite) target_link_libraries(${LIB_NEURUN_BACKEND_CPU} nnfw_lib_misc) target_link_libraries(${LIB_NEURUN_BACKEND_CPU} nnfw_lib_cpp14) target_link_libraries(${LIB_NEURUN_BACKEND_CPU} ${LIB_NEURUN_KERNEL_CPU}) -# TODO remove this line once acl dependency is removed from PermuteLayer -target_link_libraries(${LIB_NEURUN_BACKEND_CPU} ${LIB_NEURUN_BACKEND_ACL_CL}) +target_link_libraries(${LIB_NEURUN_BACKEND_CPU} ${LIB_NEURUN}) target_compile_options(${LIB_NEURUN_BACKEND_CPU} PRIVATE -Wall -Wextra -Werror) -- 2.7.4