From 221b0c0d204aed58ac90c1b66bc18959eadc6695 Mon Sep 17 00:00:00 2001 From: yejianwu Date: Fri, 18 May 2018 15:56:04 +0800 Subject: [PATCH] update api and format code --- mace/benchmark/benchmark_model.cc | 12 +++--- mace/benchmark/model_throughput_test.cc | 8 ++-- mace/core/mace.cc | 40 +++++++++++-------- mace/examples/example.cc | 16 ++++---- mace/public/mace.h | 10 ++++- .../python/tools/mace_engine_factory.h.jinja2 | 12 +++--- mace/python/tools/model.jinja2 | 9 +---- mace/python/tools/model_header.jinja2 | 2 +- mace/python/tools/tensor_data.jinja2 | 32 ++------------- mace/tools/validation/mace_run.cc | 16 ++++---- tools/sh_commands.py | 3 +- 11 files changed, 69 insertions(+), 91 deletions(-) diff --git a/mace/benchmark/benchmark_model.cc b/mace/benchmark/benchmark_model.cc index c83812df..cac3aca2 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 b7b05f7b..fdcc03a0 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 ac97fe48..4bbcad2a 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 6c4fce30..3d0b19e5 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 7b238aa2..cfeeb0ca 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 1042f697..d4eb7c30 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 42e987aa..122404cc 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 ace89933..98f956d1 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 0f00eb3b..5520ce05 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 553647f8..af6e0c43 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 535fcf70..63676522 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), -- GitLab