From d22e5e3dbe5fdc21e90a9549249f5ee1317caf76 Mon Sep 17 00:00:00 2001 From: zhengyuanhua Date: Tue, 27 Oct 2020 16:53:34 +0800 Subject: [PATCH] aipp config add related input name(parser) --- metadef | 2 +- parser/caffe/caffe_parser.cc | 34 +++++++++++++++++++++++++ parser/caffe/caffe_parser.h | 2 ++ parser/common/proto/insert_op.proto | 3 +++ parser/proto/insert_op.proto | 3 +++ parser/tensorflow/proto/insert_op.proto | 3 +++ 6 files changed, 46 insertions(+), 1 deletion(-) diff --git a/metadef b/metadef index a75b33c..5d06bc7 160000 --- a/metadef +++ b/metadef @@ -1 +1 @@ -Subproject commit a75b33c637a304d02cc0f073d2e5ea163a71f8dd +Subproject commit 5d06bc7547189f24195b3cedcb0bfc3d787c80a5 diff --git a/parser/caffe/caffe_parser.cc b/parser/caffe/caffe_parser.cc index 36d07b3..4b3b2a7 100644 --- a/parser/caffe/caffe_parser.cc +++ b/parser/caffe/caffe_parser.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include "parser/common/convert/pb2json.h" #include "common/debug/log.h" #include "parser/common/acl_graph_parser_util.h" @@ -1539,6 +1540,34 @@ void CaffeModelParser::SaveOrigionLayerTops(domi::caffe::LayerParameter &layer) return; } +Status CaffeModelParser::SaveDataLayerTops(const domi::caffe::LayerParameter &layer) { + string name = layer.name(); + if (node_map.find(name) == node_map.end()) { + GELOGE(FAILED, "Node can not be found by layer name: %s", name.c_str()); + return FAILED; + } + + ge::NodePtr node = node_map[name]; + GE_CHECK_NOTNULL(node); + + if (node->GetType() == ge::parser::DATA) { + if (layer.top_size() != 1) { + GELOGE(FAILED, "Data layer[%s] top size must be 1, real size: %d", name.c_str(), layer.top_size()); + return FAILED; + } + + string top_name = layer.top(0); + auto data_top_names = ge::GetParserContext().data_top_names; + if (find(data_top_names.begin(), data_top_names.end(), top_name) != data_top_names.end()) { + GELOGE(FAILED, "Different data can not have same top name: %s.", top_name.c_str()); + return FAILED; + } + ge::GetParserContext().data_top_names.push_back(top_name); + } + + return SUCCESS; +} + Status CaffeModelParser::Parse(const char *model_path, ge::ComputeGraphPtr &graph) { bool has_error = false; GE_CHECK_NOTNULL(model_path); @@ -1610,6 +1639,7 @@ Status CaffeModelParser::Parse(const char *model_path, ge::ComputeGraphPtr &grap // Map of operator name and occurrence times std::map layer_name_map; + GetParserContext().data_top_names.clear(); // std::map> layer_params_map; // same param name set @@ -1656,6 +1686,10 @@ Status CaffeModelParser::Parse(const char *model_path, ge::ComputeGraphPtr &grap GE_RETURN_WITH_LOG_IF_ERROR(AddBlobsToMap(layer, inplace_blob_name_remapping), "Caffe parser add blobs to map ret fail."); + if (SaveDataLayerTops(layer) != SUCCESS) { + GELOGE(FAILED, "Caffe parse: save data layer tops failed."); + return FAILED; + } } // Find a layer with the same param name and save it to graph GE_RETURN_WITH_LOG_IF_ERROR(FindShareParamLayers(layer_params_map), diff --git a/parser/caffe/caffe_parser.h b/parser/caffe/caffe_parser.h index bd1520e..9a252f9 100644 --- a/parser/caffe/caffe_parser.h +++ b/parser/caffe/caffe_parser.h @@ -343,6 +343,8 @@ class CaffeModelParser : public domi::ModelParser { Status ParseOutputNodeTopInfo(const domi::caffe::NetParameter &proto_message); + Status SaveDataLayerTops(const domi::caffe::LayerParameter &layer); + std::map node_map; // key: blob name, value: layer name and index diff --git a/parser/common/proto/insert_op.proto b/parser/common/proto/insert_op.proto index e28d653..6c3287a 100644 --- a/parser/common/proto/insert_op.proto +++ b/parser/common/proto/insert_op.proto @@ -45,6 +45,9 @@ message AippOpParams { // 标识对模型的第几个输入做AIPP处理,例如模型有两个输入,需要对第2个输入做AIPP,则配置related_input_rank为1。 uint32 related_input_rank = 2; + // related_input_name is optional and the top name of data node which inserts aipp + string related_input_name = 6; + // input_edge_idx参数为可选,类型为整型,配置范围为>=0。 // 配置该参数的作用,在于对Data算子不同的输出做不同的AIPP处理,如果该参数没有配置,默认对related_input_rank指定的模型输入的所有输出边做AIPP。 // 配置值 <= Data算子输出边的个数。 diff --git a/parser/proto/insert_op.proto b/parser/proto/insert_op.proto index e28d653..6c3287a 100644 --- a/parser/proto/insert_op.proto +++ b/parser/proto/insert_op.proto @@ -45,6 +45,9 @@ message AippOpParams { // 标识对模型的第几个输入做AIPP处理,例如模型有两个输入,需要对第2个输入做AIPP,则配置related_input_rank为1。 uint32 related_input_rank = 2; + // related_input_name is optional and the top name of data node which inserts aipp + string related_input_name = 6; + // input_edge_idx参数为可选,类型为整型,配置范围为>=0。 // 配置该参数的作用,在于对Data算子不同的输出做不同的AIPP处理,如果该参数没有配置,默认对related_input_rank指定的模型输入的所有输出边做AIPP。 // 配置值 <= Data算子输出边的个数。 diff --git a/parser/tensorflow/proto/insert_op.proto b/parser/tensorflow/proto/insert_op.proto index e28d653..6c3287a 100644 --- a/parser/tensorflow/proto/insert_op.proto +++ b/parser/tensorflow/proto/insert_op.proto @@ -45,6 +45,9 @@ message AippOpParams { // 标识对模型的第几个输入做AIPP处理,例如模型有两个输入,需要对第2个输入做AIPP,则配置related_input_rank为1。 uint32 related_input_rank = 2; + // related_input_name is optional and the top name of data node which inserts aipp + string related_input_name = 6; + // input_edge_idx参数为可选,类型为整型,配置范围为>=0。 // 配置该参数的作用,在于对Data算子不同的输出做不同的AIPP处理,如果该参数没有配置,默认对related_input_rank指定的模型输入的所有输出边做AIPP。 // 配置值 <= Data算子输出边的个数。