diff --git a/mindspore/ccsrc/cxx_api/model/acl/acl_model_options.h b/mindspore/ccsrc/cxx_api/model/acl/acl_model_options.h index c39cb2a590c..37f49dc414e 100644 --- a/mindspore/ccsrc/cxx_api/model/acl/acl_model_options.h +++ b/mindspore/ccsrc/cxx_api/model/acl/acl_model_options.h @@ -38,6 +38,8 @@ class AclModelOptions { // return tuple std::tuple, std::map> GenAclOptions() const; void SetFirstGraph(bool is_first_graph) noexcept { first_graph_flag_ = is_first_graph; } + void SetOmFilePath(const std::string &file_path) noexcept { om_file_path_ = file_path; } + std::string GetOmFilePath() const { return om_file_path_; } private: std::string output_node_; // todo: at convert.cc::BuildGraph(), no atc options @@ -57,6 +59,7 @@ class AclModelOptions { // other options uint32_t device_id_; std::optional first_graph_flag_; + std::string om_file_path_; }; } // namespace mindspore diff --git a/mindspore/ccsrc/cxx_api/model/acl/model_converter.cc b/mindspore/ccsrc/cxx_api/model/acl/model_converter.cc index b21f6a230ff..fe9890c4917 100644 --- a/mindspore/ccsrc/cxx_api/model/acl/model_converter.cc +++ b/mindspore/ccsrc/cxx_api/model/acl/model_converter.cc @@ -128,10 +128,36 @@ Buffer ModelConverter::BuildAirModel(const transform::DfGraphPtr &graph, return Buffer(); } + if (SaveModel(model) != kSuccess) { + MS_LOG(ERROR) << "Save model failed."; + return Buffer(); + } + ge::aclgrphBuildFinalize(); return Buffer(model.data.get(), model.length); } +Status ModelConverter::SaveModel(const ge::ModelBufferData &model) { +#ifdef BUILD_LITE + std::string file_path; + auto option = options_.lock(); + if (option != nullptr) { + file_path = option->GetOmFilePath(); + } + if (file_path.empty()) { + MS_LOG(INFO) << "File path is empty, there is no need to save model"; + return kSuccess; + } + MS_LOG(INFO) << "Om file path: " << file_path; + auto ret = ge::aclgrphSaveModel(file_path, model); + if (ret != ge::SUCCESS) { + MS_LOG(ERROR) << "Call aclgrphSaveModel fail."; + return kMCFailed; + } +#endif + return kSuccess; +} + Buffer ModelConverter::LoadMindIR(const FuncGraphPtr &func_graph) { MultiProcess multi_process; Buffer buffer_ret; diff --git a/mindspore/ccsrc/cxx_api/model/acl/model_converter.h b/mindspore/ccsrc/cxx_api/model/acl/model_converter.h index e4a6723f49a..4f97a6b161f 100644 --- a/mindspore/ccsrc/cxx_api/model/acl/model_converter.h +++ b/mindspore/ccsrc/cxx_api/model/acl/model_converter.h @@ -37,6 +37,8 @@ class ModelConverter { void set_options(const std::weak_ptr &options) { options_ = options; } + Status SaveModel(const ge::ModelBufferData &model); + private: transform::DfGraphPtr ConvertFuncGraphToAIR(const FuncGraphPtr &anf_graph); Buffer BuildAirModel(const transform::DfGraphPtr &graph, const std::map &init_options, diff --git a/mindspore/lite/src/runtime/kernel/ascend/src/custom_kernel.cc b/mindspore/lite/src/runtime/kernel/ascend/src/custom_kernel.cc index b832e94e4ca..c6bf422eebb 100644 --- a/mindspore/lite/src/runtime/kernel/ascend/src/custom_kernel.cc +++ b/mindspore/lite/src/runtime/kernel/ascend/src/custom_kernel.cc @@ -266,12 +266,16 @@ namespace registry { namespace { const auto kFloat32 = DataType::kNumberTypeFloat32; const auto kFloat16 = DataType::kNumberTypeFloat16; +const auto kInt32 = DataType::kNumberTypeInt32; const auto kInt8 = DataType::kNumberTypeInt8; const auto kUInt8 = DataType::kNumberTypeUInt8; +const auto kBool = DataType::kNumberTypeBool; } // namespace REGISTER_CUSTOM_KERNEL(ASCEND, ACL, kFloat32, ACL, kernel::acl::CustomCreateKernel) REGISTER_CUSTOM_KERNEL(ASCEND, ACL, kFloat16, ACL, kernel::acl::CustomCreateKernel) +REGISTER_CUSTOM_KERNEL(ASCEND, ACL, kInt32, ACL, kernel::acl::CustomCreateKernel) REGISTER_CUSTOM_KERNEL(ASCEND, ACL, kInt8, ACL, kernel::acl::CustomCreateKernel) REGISTER_CUSTOM_KERNEL(ASCEND, ACL, kUInt8, ACL, kernel::acl::CustomCreateKernel) +REGISTER_CUSTOM_KERNEL(ASCEND, ACL, kBool, ACL, kernel::acl::CustomCreateKernel) } // namespace registry } // namespace mindspore diff --git a/mindspore/lite/tools/converter/adapter/acl/common/acl_types.h b/mindspore/lite/tools/converter/adapter/acl/common/acl_types.h index 80691107ade..20bb37e42c2 100644 --- a/mindspore/lite/tools/converter/adapter/acl/common/acl_types.h +++ b/mindspore/lite/tools/converter/adapter/acl/common/acl_types.h @@ -38,6 +38,7 @@ struct AclModelOptionCfg { std::string buffer_optimize; std::string insert_op_config_file_path; std::string dynamic_image_size; + std::string om_file_path; }; constexpr auto kOutputShapes = "outputs_shape"; diff --git a/mindspore/lite/tools/converter/adapter/acl/src/acl_pass_impl.cc b/mindspore/lite/tools/converter/adapter/acl/src/acl_pass_impl.cc index 29075e0822b..9d54656bf8e 100644 --- a/mindspore/lite/tools/converter/adapter/acl/src/acl_pass_impl.cc +++ b/mindspore/lite/tools/converter/adapter/acl/src/acl_pass_impl.cc @@ -328,6 +328,7 @@ STATUS AclPassImpl::SetAclModelOptions(const FuncGraphPtr &func_graph) { input_names.push_back(name); } options_->RenameInput(input_names); + options_->SetOmFilePath(user_options_cfg_.om_file_path); MS_LOG(INFO) << "Set acl model options success."; return lite::RET_OK; } diff --git a/mindspore/lite/tools/converter/converter_flags.cc b/mindspore/lite/tools/converter/converter_flags.cc index 35f13ffbbfd..7e3eebdd9c7 100644 --- a/mindspore/lite/tools/converter/converter_flags.cc +++ b/mindspore/lite/tools/converter/converter_flags.cc @@ -273,6 +273,8 @@ int Flags::InitExtendedIntegrationInfo(const lite::ConfigFileParser &config_file return RET_OK; } +void Flags::InitAclDefaultOption() { this->aclModelOptionCfgParam.om_file_path = this->outputFile; } + int Flags::InitConfigFile() { lite::ConfigFileParser config_file_parser; auto ret = config_file_parser.ParseConfigFile(this->configFile); @@ -421,6 +423,8 @@ int Flags::PreInit(int argc, const char **argv) { return RET_INPUT_PARAM_INVALID; } } + + InitAclDefaultOption(); return RET_OK; } diff --git a/mindspore/lite/tools/converter/converter_flags.h b/mindspore/lite/tools/converter/converter_flags.h index a023f67be7f..0ca19a02895 100644 --- a/mindspore/lite/tools/converter/converter_flags.h +++ b/mindspore/lite/tools/converter/converter_flags.h @@ -73,6 +73,8 @@ class Flags : public virtual mindspore::lite::FlagParser { int InitSaveFP16(); + void InitAclDefaultOption(); + int Init(int argc, const char **argv); int PreInit(int argc, const char **argv);