diff --git a/mace/benchmark/benchmark_model.cc b/mace/benchmark/benchmark_model.cc index c83812df4a3e31a8c357ad9009bbe188bc257d9a..cac3aca2d18216b2f09efd3c6a0d5f8f52bb2baf 100644 --- a/mace/benchmark/benchmark_model.cc +++ b/mace/benchmark/benchmark_model.cc @@ -288,12 +288,12 @@ int Main(int argc, char **argv) { model_pb_data); } else { create_engine_status = - CreateMaceEngine(FLAGS_model_name, - model_data_file_ptr, - input_names, - output_names, - device_type, - &engine); + CreateMaceEngineFromCode(FLAGS_model_name, + model_data_file_ptr, + input_names, + output_names, + device_type, + &engine); } if (create_engine_status != MaceStatus::MACE_SUCCESS) { LOG(FATAL) << "Create engine error, please check the arguments"; diff --git a/mace/benchmark/model_throughput_test.cc b/mace/benchmark/model_throughput_test.cc index b7b05f7b54052aeb6db21156e812d741c6faa235..fdcc03a05faa214b69df65bb5ca9afe2abdaa39c 100644 --- a/mace/benchmark/model_throughput_test.cc +++ b/mace/benchmark/model_throughput_test.cc @@ -42,11 +42,11 @@ namespace mace { #ifdef MACE_CPU_MODEL_TAG namespace MACE_CPU_MODEL_TAG { -extern const unsigned char *LoadModelData(const char *model_data_file); +extern const unsigned char *LoadModelData(const std::string &model_data_file); extern void UnloadModelData(const unsigned char *model_data); -extern NetDef CreateNet(const std::vector &model_pb = {}); +extern NetDef CreateNet(); extern const std::string ModelChecksum(); @@ -60,7 +60,7 @@ extern const unsigned char *LoadModelData(const char *model_data_file); extern void UnloadModelData(const unsigned char *model_data); -extern NetDef CreateNet(const std::vector &model_pb = {}); +extern NetDef CreateNet(); extern const std::string ModelChecksum(); @@ -74,7 +74,7 @@ extern const unsigned char *LoadModelData(const char *model_data_file); extern void UnloadModelData(const unsigned char *model_data); -extern NetDef CreateNet(const std::vector &model_pb = {}); +extern NetDef CreateNet(); extern const std::string ModelChecksum(); diff --git a/mace/core/mace.cc b/mace/core/mace.cc index ac97fe48795f0e79348b80d8f230ec0c61fa2262..4bbcad2a135ea25b65abd55322797eba7e842e0c 100644 --- a/mace/core/mace.cc +++ b/mace/core/mace.cc @@ -14,11 +14,12 @@ #include #include -#include #include #include #include +#include + #include "mace/core/net.h" #include "mace/core/types.h" #include "mace/public/mace.h" @@ -276,15 +277,14 @@ MaceStatus MaceEngine::Run(const std::map &inputs, return impl_->Run(inputs, outputs, nullptr); } -namespace { -const unsigned char *LoadModelData(const char *model_data_file) { - int fd = open(model_data_file, O_RDONLY); +const unsigned char *LoadModelData(const std::string &model_data_file, + const size_t &data_size) { + int fd = open(model_data_file.c_str(), O_RDONLY); MACE_CHECK(fd >= 0, "Failed to open model data file ", model_data_file, ", error code: ", errno); - const unsigned char *model_data = - static_cast(mmap(nullptr, 2453764, - PROT_READ, MAP_PRIVATE, fd, 0)); + const unsigned char *model_data = static_cast( + mmap(nullptr, data_size, PROT_READ, MAP_PRIVATE, fd, 0)); MACE_CHECK(model_data != MAP_FAILED, "Failed to map model data file ", model_data_file, ", error code: ", errno); @@ -295,37 +295,45 @@ const unsigned char *LoadModelData(const char *model_data_file) { return model_data; } -void UnloadModelData(const unsigned char *model_data) { +void UnloadModelData(const unsigned char *model_data, + const size_t &data_size) { int ret = munmap(const_cast(model_data), - 2453764); + data_size); MACE_CHECK(ret == 0, "Failed to unmap model data file, error code: ", errno); } -} // namespace -MaceStatus CreateMaceEngineFromPB(const char *model_data_file, +MaceStatus CreateMaceEngineFromPB(const std::string &model_data_file, const std::vector &input_nodes, const std::vector &output_nodes, const DeviceType device_type, std::shared_ptr *engine, - const std::vector model_pb) { + const std::vector &model_pb) { LOG(INFO) << "Create MaceEngine from model pb"; // load model if (engine == nullptr) { return MaceStatus::MACE_INVALID_ARGS; } - const unsigned char * model_data = nullptr; - model_data = LoadModelData(model_data_file); - NetDef net_def; net_def.ParseFromArray(&model_pb[0], model_pb.size()); + index_t model_data_size = 0; + for (auto &const_tensor : net_def.tensors()) { + model_data_size = std::max( + model_data_size, + static_cast(const_tensor.offset() + + const_tensor.data_size() * + GetEnumTypeSize(const_tensor.data_type()))); + } + const unsigned char *model_data = nullptr; + model_data = LoadModelData(model_data_file, model_data_size); + engine->reset( new mace::MaceEngine(&net_def, device_type, input_nodes, output_nodes, model_data)); if (device_type == DeviceType::GPU || device_type == DeviceType::HEXAGON) { - UnloadModelData(model_data); + UnloadModelData(model_data, model_data_size); } return MACE_SUCCESS; } diff --git a/mace/examples/example.cc b/mace/examples/example.cc index 6c4fce304d10737bbfa48a5141a392ef115d759f..3d0b19e523a0c7f78c34b15e276824d73d42afa0 100644 --- a/mace/examples/example.cc +++ b/mace/examples/example.cc @@ -169,15 +169,13 @@ bool RunModel(const std::vector &input_names, MaceStatus create_engine_status; // Create Engine int64_t t0 = NowMicros(); - const char *model_data_file_ptr = - FLAGS_model_data_file.empty() ? nullptr : FLAGS_model_data_file.c_str(); if (FLAGS_model_file != "") { std::vector model_pb_data; if (!mace::ReadBinaryFile(&model_pb_data, FLAGS_model_file)) { LOG(FATAL) << "Failed to read file: " << FLAGS_model_file; } create_engine_status = - CreateMaceEngineFromPB(model_data_file_ptr, + CreateMaceEngineFromPB(FLAGS_model_data_file, input_names, output_names, device_type, @@ -185,12 +183,12 @@ bool RunModel(const std::vector &input_names, model_pb_data); } else { create_engine_status = - CreateMaceEngine(model_name, - model_data_file_ptr, - input_names, - output_names, - device_type, - &engine); + CreateMaceEngineFromCode(model_name, + FLAGS_model_data_file, + input_names, + output_names, + device_type, + &engine); } if (create_engine_status != MaceStatus::MACE_SUCCESS) { diff --git a/mace/public/mace.h b/mace/public/mace.h index 7b238aa2fb8359e138a6cb30ebdf0efe23382e32..cfeeb0cadfb7314d774e9ddfd37e46c6d5c863da 100644 --- a/mace/public/mace.h +++ b/mace/public/mace.h @@ -106,12 +106,18 @@ class MaceEngine { MaceEngine &operator=(const MaceEngine &) = delete; }; -MaceStatus CreateMaceEngineFromPB(const char *model_data_file, +const unsigned char *LoadModelData(const std::string &model_data_file, + const size_t &data_size); + +void UnloadModelData(const unsigned char *model_data, + const size_t &data_size); + +MaceStatus CreateMaceEngineFromPB(const std::string &model_data_file, const std::vector &input_nodes, const std::vector &output_nodes, const DeviceType device_type, std::shared_ptr *engine, - const std::vector model_pb); + const std::vector &model_pb); } // namespace mace diff --git a/mace/python/tools/mace_engine_factory.h.jinja2 b/mace/python/tools/mace_engine_factory.h.jinja2 index 1042f6975e27edeb93aab1ebe71ea6c3c4fe8f46..d4eb7c309e43d8613200e52e44f965dbd31908fc 100644 --- a/mace/python/tools/mace_engine_factory.h.jinja2 +++ b/mace/python/tools/mace_engine_factory.h.jinja2 @@ -29,11 +29,11 @@ namespace mace { {% for tag in model_tags %} namespace {{tag}} { -extern const unsigned char *LoadModelData(const char *model_data_file); +extern const unsigned char *LoadModelData(const std::string &model_data_file); extern void UnloadModelData(const unsigned char *model_data); -extern NetDef CreateNet(const std::vector &model_pb = {}); +extern NetDef CreateNet(); extern const std::string ModelName(); extern const std::string ModelChecksum(); @@ -51,9 +51,9 @@ std::map model_name_map { }; } // namespace -MaceStatus CreateMaceEngine( +MaceStatus CreateMaceEngineFromCode( const std::string &model_name, - const char *model_data_file, + const std::string &model_data_file, const std::vector &input_nodes, const std::vector &output_nodes, const DeviceType device_type, @@ -86,9 +86,9 @@ MaceStatus CreateMaceEngine( return MaceStatus::MACE_SUCCESS; } {% else %} -MaceStatus CreateMaceEngine( +MaceStatus CreateMaceEngineFromCode( const std::string &model_name, - const char *model_data_file, + const std::string &model_data_file, const std::vector &input_nodes, const std::vector &output_nodes, const DeviceType device_type, diff --git a/mace/python/tools/model.jinja2 b/mace/python/tools/model.jinja2 index 42e987aa781490ac919bb06b4bde5c024d168a82..122404cc2c9251162e8abcb6716e2778d93af6bb 100644 --- a/mace/python/tools/model.jinja2 +++ b/mace/python/tools/model.jinja2 @@ -127,13 +127,11 @@ void CreateMemoryArena(mace::MemoryArena *mem_arena) { namespace {{tag}} { -NetDef CreateNet(const std::vector &model_pb = {}) { +NetDef CreateNet() { MACE_LATENCY_LOGGER(1, "Create net {{ net.name }}"); NetDef net_def; - {% if model_type == 'source' %} - MACE_UNUSED(model_pb); net_def.set_name("{{ net.name}}"); net_def.set_version("{{ net.version }}"); @@ -150,11 +148,6 @@ NetDef CreateNet(const std::vector &model_pb = {}) { CreateOutputInfo(net_def); {% endif %} - {% else %} - - net_def.ParseFromArray(&model_pb[0], model_pb.size()); - {% endif %} - return net_def; } diff --git a/mace/python/tools/model_header.jinja2 b/mace/python/tools/model_header.jinja2 index ace89933f014658a2777a4723921ecb504562a16..98f956d12cdd34c570d38ef4fb8017c99759b3da 100644 --- a/mace/python/tools/model_header.jinja2 +++ b/mace/python/tools/model_header.jinja2 @@ -28,7 +28,7 @@ const unsigned char *LoadModelData(const char *model_data_file); void UnloadModelData(const unsigned char *model_data); -NetDef CreateNet(const unsigned char *model_data); +NetDef CreateNet(); const std::string ModelName(); diff --git a/mace/python/tools/tensor_data.jinja2 b/mace/python/tools/tensor_data.jinja2 index 0f00eb3b48afa01888fc834e161b84982928fe94..5520ce055b07ef5515bde734b9316960e0ff396a 100644 --- a/mace/python/tools/tensor_data.jinja2 +++ b/mace/python/tools/tensor_data.jinja2 @@ -22,16 +22,6 @@ #include "mace/utils/env_time.h" #include "mace/utils/logging.h" -{% if not embed_model_data %} - -#include -#include -#include -#include -#include - -{% endif %} - namespace mace { namespace {{tag}} { @@ -41,34 +31,18 @@ alignas(4) const unsigned char model_data[{{ model_data_size }}] = { }; {% endif %} -const unsigned char *LoadModelData(const char *model_data_file) { +const unsigned char *LoadModelData(const std::string &model_data_file) { {% if embed_model_data %} MACE_UNUSED(model_data_file); return model_data; {% else %} - int fd = open(model_data_file, O_RDONLY); - MACE_CHECK(fd >= 0, "Failed to open model data file ", - model_data_file, ", error code: ", errno); - - const unsigned char *model_data = - static_cast(mmap(nullptr, {{ model_data_size }}, - PROT_READ, MAP_PRIVATE, fd, 0)); - MACE_CHECK(model_data != MAP_FAILED, "Failed to map model data file ", - model_data_file, ", error code: ", errno); - - int ret = close(fd); - MACE_CHECK(ret == 0, "Failed to close model data file ", - model_data_file, ", error code: ", errno); - - return model_data; + return mace::LoadModelData(model_data_file, {{ model_data_size }}); {% endif %} } void UnloadModelData(const unsigned char *model_data) { {% if not embed_model_data %} - int ret = munmap(const_cast(model_data), - {{ model_data_size }}); - MACE_CHECK(ret == 0, "Failed to unmap model data file, error code: ", errno); + mace::UnloadModelData(model_data, {{ model_data_size }}); {% else %} MACE_UNUSED(model_data); {% endif %} diff --git a/mace/tools/validation/mace_run.cc b/mace/tools/validation/mace_run.cc index 553647f8821e84a52fafd37a5cb37769b7b3e54d..af6e0c43a96b0d601f96a285e4fec24f62ba213e 100644 --- a/mace/tools/validation/mace_run.cc +++ b/mace/tools/validation/mace_run.cc @@ -231,15 +231,13 @@ bool RunModel(const std::string &model_name, MaceStatus create_engine_status; // Create Engine int64_t t0 = NowMicros(); - const char *model_data_file_ptr = - FLAGS_model_data_file.empty() ? nullptr : FLAGS_model_data_file.c_str(); if (FLAGS_model_file != "") { std::vector model_pb_data; if (!mace::ReadBinaryFile(&model_pb_data, FLAGS_model_file)) { LOG(FATAL) << "Failed to read file: " << FLAGS_model_file; } create_engine_status = - CreateMaceEngineFromPB(model_data_file_ptr, + CreateMaceEngineFromPB(FLAGS_model_data_file, input_names, output_names, device_type, @@ -247,12 +245,12 @@ bool RunModel(const std::string &model_name, model_pb_data); } else { create_engine_status = - CreateMaceEngine(model_name, - model_data_file_ptr, - input_names, - output_names, - device_type, - &engine); + CreateMaceEngineFromCode(model_name, + FLAGS_model_data_file, + input_names, + output_names, + device_type, + &engine); } int64_t t1 = NowMicros(); diff --git a/tools/sh_commands.py b/tools/sh_commands.py index 535fcf706989353f452726676044f5c75c917afb..6367652205dd58b367ab34dbee5ea30f1c68d57d 100644 --- a/tools/sh_commands.py +++ b/tools/sh_commands.py @@ -942,7 +942,8 @@ def merge_libs(target_soc, sh.cp("-f", glob.glob("%s/*.data" % model_output_dir), model_data_dir) if model_load_type == "source": - sh.cp("-f", glob.glob("%s/*.h" % model_output_dir), model_header_dir) + sh.cp("-f", glob.glob("%s/*.h" % model_output_dir), + model_header_dir) for model_name in mace_model_dirs_kv: sh.cp("-f", "%s/%s.pb" % (mace_model_dirs_kv[model_name], model_name),