/** * Copyright 2021 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #define protected public #define private public #include "parser/common/op_parser_factory.h" #include "graph/operator_reg.h" #include "register/op_registry.h" #include "parser/common/op_registration_tbe.h" #include "framework/omg/parser/model_parser.h" #include "framework/omg/parser/parser_factory.h" #include "external/parser/caffe_parser.h" #include "st/parser_st_utils.h" #include "external/ge/ge_api_types.h" #include "tests/depends/ops_stub/ops_stub.h" #include "proto/caffe/caffe.pb.h" #include "parser/caffe/caffe_parser.h" #include "parser/caffe/caffe_data_parser.h" #include "parser/caffe/caffe_op_parser.h" #include "parser/caffe/caffe_custom_parser_adapter.h" #include "parser/caffe/caffe_op_parser.h" #include "graph/operator_reg.h" #include "parser/common/acl_graph_parser_util.h" #include "common/op_map.h" #undef protected #undef private #include #include #include #include #include using namespace domi::caffe; using namespace ge; namespace ge { class STestCaffeParser : public testing::Test { protected: void SetUp() { ParerSTestsUtils::ClearParserInnerCtx(); RegisterCustomOp(); } void TearDown() {} public: void RegisterCustomOp(); }; static Status ParseParams(const google::protobuf::Message* op_src, ge::Operator& op_dest) { return SUCCESS; } static ge::NodePtr GenNodeFromOpDesc(ge::OpDescPtr opDesc){ if (!opDesc) { return nullptr; } static auto g = std::make_shared("g"); return g->AddNode(std::move(opDesc)); } ge::ComputeGraphPtr build_graph(bool with_leaf_node = false) { ge::ComputeGraphPtr graph = std::make_shared("default"); ge::OpDescPtr data_op = std::make_shared(); data_op->SetType(parser::DATA); data_op->SetName("Data1"); data_op->AddInputDesc(ge::GeTensorDesc()); data_op->AddOutputDesc(ge::GeTensorDesc()); ge::NodePtr data1 = graph->AddNode(data_op); ge::OpDescPtr relu_op1 = std::make_shared(); relu_op1->SetType(parser::ACTIVATION); relu_op1->SetName("Relu1"); relu_op1->AddInputDesc(ge::GeTensorDesc()); relu_op1->AddOutputDesc(ge::GeTensorDesc()); ge::NodePtr relu1 = graph->AddNode(relu_op1); ge::OpDescPtr relu_op2 = std::make_shared(); relu_op2->SetType(parser::RELU); relu_op2->SetName("Relu2"); relu_op2->AddInputDesc(ge::GeTensorDesc()); relu_op2->AddOutputDesc(ge::GeTensorDesc()); relu_op2->AddOutputDesc(ge::GeTensorDesc()); ge::NodePtr relu2 = graph->AddNode(relu_op2); ge::OpDescPtr relu_op3 = std::make_shared(); relu_op3->SetType(parser::ACTIVATION); relu_op3->SetName("Relu3"); relu_op3->AddInputDesc(ge::GeTensorDesc()); relu_op3->AddOutputDesc(ge::GeTensorDesc()); ge::NodePtr relu3; if (with_leaf_node == true) { relu3 = graph->AddNode(relu_op3); } ge::OpDescPtr mul_op = std::make_shared(); mul_op->SetType(parser::MUL); mul_op->SetName("Mul"); mul_op->AddInputDesc(ge::GeTensorDesc()); mul_op->AddInputDesc(ge::GeTensorDesc()); mul_op->AddOutputDesc(ge::GeTensorDesc()); mul_op->AddOutputDesc(ge::GeTensorDesc()); mul_op->AddOutputDesc(ge::GeTensorDesc()); mul_op->AddOutputDesc(ge::GeTensorDesc()); ge::NodePtr mul = graph->AddNode(mul_op); ge::OpDescPtr mul_op1 = std::make_shared(); mul_op1->SetType(parser::MUL); mul_op1->SetName("Mul1"); mul_op1->AddInputDesc(ge::GeTensorDesc()); mul_op1->AddInputDesc(ge::GeTensorDesc()); mul_op1->AddOutputDesc(ge::GeTensorDesc()); ge::NodePtr mul1 = graph->AddNode(mul_op1); ge::OpDescPtr mul_op2 = std::make_shared(); mul_op2->SetType(parser::MUL); mul_op2->SetName("Mul2"); mul_op2->AddInputDesc(ge::GeTensorDesc()); mul_op2->AddInputDesc(ge::GeTensorDesc()); mul_op2->AddOutputDesc(ge::GeTensorDesc()); ge::NodePtr mul2 = graph->AddNode(mul_op2); ge::OpDescPtr fc_op = std::make_shared(); fc_op->SetType(parser::FULL_CONNECTION); fc_op->SetName("FullConnection"); fc_op->AddInputDesc(ge::GeTensorDesc()); fc_op->AddOutputDesc(ge::GeTensorDesc()); fc_op->AddOutputDesc(ge::GeTensorDesc()); ge::NodePtr fc = graph->AddNode(fc_op); ge::GraphUtils::AddEdge(data1->GetOutDataAnchor(0), relu1->GetInDataAnchor(0)); ge::GraphUtils::AddEdge(relu1->GetOutDataAnchor(0), fc->GetInDataAnchor(0)); ge::GraphUtils::AddEdge(fc->GetOutDataAnchor(0), relu2->GetInDataAnchor(0)); if (with_leaf_node == true) { ge::GraphUtils::AddEdge(fc->GetOutDataAnchor(1), relu3->GetInDataAnchor(0)); } ge::GraphUtils::AddEdge(relu2->GetOutDataAnchor(0), mul->GetInDataAnchor(0)); ge::GraphUtils::AddEdge(relu2->GetOutDataAnchor(1), mul->GetInDataAnchor(1)); ge::GraphUtils::AddEdge(mul->GetOutDataAnchor(0), mul1->GetInDataAnchor(0)); ge::GraphUtils::AddEdge(mul->GetOutDataAnchor(1), mul1->GetInDataAnchor(1)); ge::GraphUtils::AddEdge(mul->GetOutDataAnchor(2), mul2->GetInDataAnchor(0)); ge::GraphUtils::AddEdge(mul->GetOutDataAnchor(3), mul2->GetInDataAnchor(1)); return graph; } void STestCaffeParser::RegisterCustomOp() { REGISTER_CUSTOM_OP("Data") .FrameworkType(domi::CAFFE) .OriginOpType("Input") .ParseParamsFn(ParseParams); REGISTER_CUSTOM_OP("Abs") .FrameworkType(domi::CAFFE) .OriginOpType("AbsVal") .ParseParamsFn(ParseParams); std::vector reg_datas = domi::OpRegistry::Instance()->registrationDatas; for (auto reg_data : reg_datas) { domi::OpRegTbeParserFactory::Instance()->Finalize(reg_data); domi::OpRegistry::Instance()->Register(reg_data); } domi::OpRegistry::Instance()->registrationDatas.clear(); } TEST_F(STestCaffeParser, caffe_parser_user_output_with_default) { std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string model_file = case_dir + "/origin_models/caffe_abs.pbtxt"; auto model_parser = domi::ModelParserFactory::Instance()->CreateModelParser(domi::CAFFE); ASSERT_NE(model_parser, nullptr); ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared("tmp_graph"); ASSERT_NE(compute_graph, nullptr); ge::Graph graph = ge::GraphUtils::CreateGraphFromComputeGraph(compute_graph); auto ret = model_parser->Parse(model_file.c_str(), graph); ASSERT_EQ(ret, GRAPH_SUCCESS); AclGraphParserUtil acl_graph_parse_util; std::map parser_params; auto status = acl_graph_parse_util.SetOutputNodeInfo(graph, parser_params); ASSERT_EQ(status, SUCCESS); auto output_nodes_info = compute_graph->GetGraphOutNodesInfo(); ASSERT_EQ(output_nodes_info.size(), 1); EXPECT_EQ((output_nodes_info.at(0).first->GetName()), "abs"); EXPECT_EQ((output_nodes_info.at(0).second), 0); auto &net_out_name = ge::GetParserContext().net_out_nodes; ASSERT_EQ(net_out_name.size(), 1); EXPECT_EQ(net_out_name.at(0), "abs:0:abs_out"); } TEST_F(STestCaffeParser, acl_caffe_parser) { std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string model_file = case_dir + "/origin_models/caffe_add.pbtxt"; std::string weight_file_txt = case_dir + "/origin_models/caffe_add.caffemodel.txt"; std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel"; domi::caffe::NetParameter proto; EXPECT_EQ(ParerSTestsUtils::ReadProtoFromText(weight_file_txt.c_str(), &proto), true); ParerSTestsUtils::WriteProtoToBinaryFile(proto, weight_file.c_str()); ge::GetParserContext().caffe_proto_path = case_dir + "/../../../../metadef/proto/caffe/caffe.proto"; std::map parser_params; ge::Graph graph; auto ret = ge::aclgrphParseCaffe(model_file.c_str(), weight_file.c_str(), parser_params, graph); EXPECT_EQ(ret, GRAPH_FAILED); ret = ge::aclgrphParseCaffe(model_file.c_str(), weight_file.c_str(), graph); EXPECT_EQ(ret, GRAPH_FAILED); caffe_op_map.clear(); ret = ge::aclgrphParseCaffe(model_file.c_str(), weight_file.c_str(), parser_params, graph); EXPECT_EQ(ret, GRAPH_FAILED); { proto.set_name("empty_layer"); auto &layers = *proto.add_layers(); layers.set_name("layers"); proto.clear_layer(); const std::string empty_layer = case_dir + "/origin_models/empty_layer.pbtxt"; ParerSTestsUtils::WriteProtoToTextFile(proto, empty_layer.c_str()); EXPECT_EQ(ge::aclgrphParseCaffe(empty_layer.c_str(), weight_file.c_str(), parser_params, graph), FAILED); proto.clear_layers(); const std::string empty_layers = case_dir + "/origin_models/empty_layers.pbtxt"; ParerSTestsUtils::WriteProtoToTextFile(proto, empty_layers.c_str()); EXPECT_EQ(ge::aclgrphParseCaffe(empty_layers.c_str(), weight_file.c_str(), parser_params, graph), FAILED); unlink(empty_layer.c_str()); unlink(empty_layers.c_str()); } } TEST_F(STestCaffeParser, modelparser_parsefrommemory_success) { std::string caseDir = __FILE__; std::size_t idx = caseDir.find_last_of("/"); caseDir = caseDir.substr(0, idx); std::string modelFile = caseDir + "/origin_models/caffe_add.pbtxt"; const char* tmp_tf_pb_model = modelFile.c_str(); ge::Graph graph; ge::ComputeGraphPtr compute_graph = ge::GraphUtils::GetComputeGraph(graph); CaffeModelParser modelParser; MemBuffer* memBuffer = ParerSTestsUtils::MemBufferFromFile(tmp_tf_pb_model); auto ret = modelParser.ParseFromMemory((char*)memBuffer->data, memBuffer->size, compute_graph); free(memBuffer->data); delete memBuffer; EXPECT_EQ(ret, GRAPH_FAILED); } TEST_F(STestCaffeParser, caffe_parser_to_json) { std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string model_file = case_dir + "/origin_models/caffe_add.pbtxt"; std::map parser_params; CaffeModelParser caffe_parser; const char *json_file = "tmp.json"; auto ret = caffe_parser.ToJson(model_file.c_str(), json_file); EXPECT_EQ(ret, SUCCESS); const char *json_null = nullptr; ret = caffe_parser.ToJson(model_file.c_str(), json_null); EXPECT_EQ(ret, FAILED); const char *model_null = nullptr; ret = caffe_parser.ToJson(model_null, json_null); EXPECT_EQ(ret, FAILED); } TEST_F(STestCaffeParser, caffe_parser_ParseParamsForDummyData_test) { CaffeDataParser caffe_parser; domi::caffe::NetParameter net; ge::OpDescPtr op = std::make_shared("conv", "Convolution"); domi::caffe::LayerParameter *lay = net.add_layer(); Status ret = caffe_parser.ParseParamsForDummyData(*lay, op); EXPECT_EQ(ret, FAILED); ret = caffe_parser.ParseParamsForInput(*lay, op); EXPECT_EQ(ret, FAILED); domi::caffe::DummyDataParameter *dummyData = lay->mutable_dummy_data_param(); ret = caffe_parser.ParseParamsForDummyData(*lay, op); EXPECT_EQ(ret, FAILED); domi::caffe::BlobShape* dummpShape = dummyData->add_shape(); ret = caffe_parser.ParseParamsForDummyData(*lay, op); EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, convertWeights_success) { CaffeOpParser parser; ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc(); ge::GeTensorPtr weight = std::make_shared(ge_tensor_desc); ge::OpDescPtr opDef = std::make_shared("",""); auto node_tmp = GenNodeFromOpDesc(opDef); domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter(); domi::caffe::BlobProto *blob = layer->add_blobs(); blob->set_int8_data("12"); blob->add_data(1); blob->add_data(1); domi::caffe::BlobShape *shap = blob->mutable_shape(); shap->add_dim(1); shap->add_dim(2); Status ret = parser.ConvertWeight(*blob, "", weight); EXPECT_EQ(domi::SUCCESS, ret); delete layer; } TEST_F(STestCaffeParser, CaffeCustomParserAdapter_ParseWeights_success) { CaffeCustomParserAdapter parserAdapter; ge::OpDescPtr opDef = std::make_shared("",""); auto node_tmp = GenNodeFromOpDesc(opDef); LayerParameter* layer = new LayerParameter(); Status ret = parserAdapter.ParseWeights(layer, node_tmp); EXPECT_EQ(ret, SUCCESS); BlobProto* blob = layer->add_blobs(); blob->add_data(1); blob->add_data(1); BlobShape* shap = blob->mutable_shape(); shap->add_dim(1); shap->add_dim(2); ret = parserAdapter.ParseWeights(layer, node_tmp); EXPECT_EQ(ret, SUCCESS); delete layer; } TEST_F(STestCaffeParser, CaffeCustomParserAdapter_ParseParams_success) { ge::OpDescPtr op_desc_src = std::make_shared("Data", "Input"); ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src); ge::OpDescPtr op_dest = std::make_shared("Data", "Input"); CaffeCustomParserAdapter parserAdapter; Status ret = parserAdapter.ParseParams(op_src, op_dest); EXPECT_EQ(ret, PARAM_INVALID); } TEST_F(STestCaffeParser, CaffeDataParser_ParseParams_success) { domi::caffe::NetParameter net; ge::OpDescPtr op_desc_src = std::make_shared("Data", "Input"); domi::caffe::LayerParameter* lay0 = net.add_layer(); lay0->set_name("conv"); lay0->set_type(ge::parser::DUMMY_DATA); ge::OpDescPtr opDef = std::make_shared("",""); CaffeDataParser parserAdapter; Status ret = parserAdapter.ParseParams(lay0, opDef); EXPECT_EQ(ret, FAILED); lay0->set_type(ge::parser::ATTR_NAME_INPUT_TENSOR_DESC); ret = parserAdapter.ParseParams(lay0, opDef); EXPECT_EQ(ret, FAILED); } TEST_F(STestCaffeParser, CaffeWeightsParser_Parse_test) { CaffeWeightsParser weightParser; std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string model_file = case_dir + "/origin_models/caffe_add.caffemodel"; const char *file = nullptr; ge::ComputeGraphPtr graph; Status ret = weightParser.Parse(file, graph); EXPECT_EQ(ret, PARAM_INVALID); file = model_file.c_str(); ret = weightParser.Parse(file, graph); EXPECT_EQ(ret, PARAM_INVALID); graph = std::make_shared("test"); ret = weightParser.Parse(file, graph); EXPECT_EQ(ret, FAILED); std::string caffe_proto = case_dir + "/../../../../metadef/proto/caffe/"; std::string custom_proto = case_dir + "/origin_models/"; ge::GetParserContext().caffe_proto_path.assign(caffe_proto); ge::GetParserContext().custom_proto_path.assign(custom_proto); ret = weightParser.Parse(file, graph); EXPECT_EQ(ret, FAILED); custom_proto = case_dir + "/origin_model/"; caffe_proto = case_dir + "/../../../metadef/proto/caffe/"; ge::GetParserContext().caffe_proto_path.assign(caffe_proto); ge::GetParserContext().custom_proto_path.assign(custom_proto); ret = weightParser.Parse(file, graph); EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, CaffeWeightsParser_ParseWeightByFusionProto_test) { CaffeWeightsParser weightParser; std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel"; std::string model_file = case_dir + "/origin_models/caffe.proto"; const char *weight_path = model_file.c_str(); std::string fusion_proto_path = model_file; std::string fusion_proto_name = "caffe"; ge::ComputeGraphPtr graph = std::make_shared("test"); Status ret = weightParser.ParseWeightByFusionProto(weight_path, fusion_proto_path, fusion_proto_name, graph); EXPECT_EQ(ret, FAILED); } TEST_F(STestCaffeParser, CaffeWeightsParser_ParseFromMemory_test) { CaffeWeightsParser weightParser; std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel"; ge::ComputeGraphPtr graph; const char *data = nullptr; Status ret = weightParser.ParseFromMemory(data, 1, graph); EXPECT_EQ(ret, PARAM_INVALID); data = weight_file.c_str(); ret = weightParser.ParseFromMemory(data, 1, graph); EXPECT_EQ(ret, PARAM_INVALID); graph = std::make_shared("test"); ret = weightParser.ParseFromMemory(data, 1, graph); EXPECT_EQ(ret, domi::PARSE_WEIGHTS_FAILED); CaffeModelParser model_parser; ret = model_parser.ParseFromMemory(data, 1, graph); EXPECT_EQ(ret, FAILED); } TEST_F(STestCaffeParser, CaffeWeightsParser_CreateCustomOperator_test) { CaffeModelParser model_parser; vector operators; ge::OpDescPtr op_desc_src = std::make_shared("Data", "Input"); ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src); operators.emplace_back(op_src); std::string op_name = ""; std::string op_type = ""; domi::caffe::NetParameter net; domi::caffe::LayerParameter *lay0 = net.add_layer(); lay0->set_name("Data"); lay0->set_type("Input"); Status ret = model_parser.CreateCustomOperator(op_name, op_type, &net, 1, operators); EXPECT_EQ(ret, FAILED); op_name = "Data"; op_type = "Input"; ret = model_parser.CreateCustomOperator(op_name, op_type, &net, 1, operators); EXPECT_EQ(ret, SUCCESS); model_parser.AddOutputInfoToContext(op_name, 1); } TEST_F(STestCaffeParser, CaffeWeightsParser_ParseOutputNodeTopInfo_test) { CaffeModelParser model_parser; AclGraphParserUtil acl_graph_parse_util; domi::caffe::NetParameter net; domi::caffe::LayerParameter *lay0 = net.add_layer(); lay0->set_name("Data"); lay0->set_type("Input"); Status ret = model_parser.ParseOutputNodeTopInfo(net); EXPECT_EQ(ret, SUCCESS); GetParserContext().type = domi::CAFFE; string graph_name; std::map out_nodes_with_tensor_name1 = { {AscendString(ge::ir_option::OUT_NODES), AscendString("Out_tensor_1;Out_tensor_2")}}; acl_graph_parse_util.ParseParamsBeforeGraph(out_nodes_with_tensor_name1, graph_name); ret = model_parser.ParseOutputNodeTopInfo(net); EXPECT_EQ(ret, PARAM_INVALID); } TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test) { CaffeOpParser opParser; ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc(); ge::GeTensorPtr weight = std::make_shared(ge_tensor_desc); ge::OpDescPtr opDef = std::make_shared("",""); auto node_tmp = GenNodeFromOpDesc(opDef); domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter(); domi::caffe::BlobProto *blob = layer->add_blobs(); blob->set_int8_data("10"); std::string lay_name = "DATA"; GeShape shape({1,1,3,4}); Status ret = opParser.ParseWeightType(*blob, shape, 1, lay_name, weight); EXPECT_EQ(ret, FAILED); delete layer; } TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test2) { CaffeOpParser opParser; ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc(); ge::GeTensorPtr weight = std::make_shared(ge_tensor_desc); ge::OpDescPtr opDef = std::make_shared("",""); auto node_tmp = GenNodeFromOpDesc(opDef); domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter(); domi::caffe::BlobProto *blob = layer->add_blobs(); blob->add_int32_data(10); std::string lay_name = "DATA"; GeShape shape({1,1,3,4}); Status ret = opParser.ParseWeightType(*blob, shape, 1, lay_name, weight); EXPECT_EQ(ret, SUCCESS); ret = opParser.ParseWeightType(*blob, shape, 2, lay_name, weight); EXPECT_EQ(ret, FAILED); delete layer; } TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test3) { CaffeOpParser opParser; ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc(); ge::GeTensorPtr weight = std::make_shared(ge_tensor_desc); ge::OpDescPtr opDef = std::make_shared("",""); auto node_tmp = GenNodeFromOpDesc(opDef); domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter(); domi::caffe::BlobProto *blob = layer->add_blobs(); double value = 2.0; blob->add_double_data(value); std::string lay_name = "DATA"; GeShape shape({1,1,3,4}); Status ret = opParser.ParseWeightType(*blob, shape, 1, lay_name, weight); EXPECT_EQ(ret, SUCCESS); ret = opParser.ParseWeightType(*blob, shape, 3, lay_name, weight); EXPECT_EQ(ret, FAILED); delete layer; } TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test4) { CaffeOpParser opParser; ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc(); ge::GeTensorPtr weight = std::make_shared(ge_tensor_desc); ge::OpDescPtr opDef = std::make_shared("",""); auto node_tmp = GenNodeFromOpDesc(opDef); domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter(); domi::caffe::BlobProto *blob = layer->add_blobs(); blob->add_uint64_data(10); std::string lay_name = "DATA"; GeShape shape({1,1,3,4}); Status ret = opParser.ParseWeightType(*blob, shape, 1, lay_name, weight); EXPECT_EQ(ret, SUCCESS); ret = opParser.ParseWeightType(*blob, shape, 2, lay_name, weight); EXPECT_EQ(ret, FAILED); delete layer; } TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test5) { CaffeOpParser opParser; ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc(); ge::GeTensorPtr weight = std::make_shared(ge_tensor_desc); ge::OpDescPtr opDef = std::make_shared("",""); auto node_tmp = GenNodeFromOpDesc(opDef); domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter(); domi::caffe::BlobProto *blob = layer->add_blobs(); blob->add_data(10); std::string lay_name = "DATA"; GeShape shape({1,1,3,4}); Status ret = opParser.ParseWeightType(*blob, shape, 10, lay_name, weight); EXPECT_EQ(ret, FAILED); delete layer; } TEST_F(STestCaffeParser, CaffeOpParser_ConvertShape_test) { CaffeOpParser opParser; domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter(); domi::caffe::BlobProto *blob = layer->add_blobs(); blob->set_num(1); blob->set_channels(2); blob->set_height(1); blob->set_width(1); std::vector shape; opParser.ConvertShape(*blob, shape); delete layer; } TEST_F(STestCaffeParser, CaffeModelParser_ParseInput_test) { CaffeModelParser modelParser; domi::caffe::NetParameter net; net.add_input("111"); net.add_input_dim(1); bool input_data_flag = true; Status ret = modelParser.ParseInput(net, input_data_flag); EXPECT_EQ(ret, FAILED); net.add_input_dim(2); net.add_input_dim(3); net.add_input_dim(4); domi::caffe::LayerParameter *lay0 = net.add_layer(); BlobProto* blob = lay0->add_blobs(); blob->add_data(1); blob->add_data(1); BlobShape* shap = blob->mutable_shape(); shap->add_dim(1); shap->add_dim(2); ret = modelParser.ParseInput(net, input_data_flag); EXPECT_EQ(ret, SUCCESS); net.add_input_shape(); ret = modelParser.ParseInput(net, input_data_flag); EXPECT_EQ(ret, FAILED); } TEST_F(STestCaffeParser, CaffeModelParser_CustomProtoParse_test) { CaffeModelParser modelParser; std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string model_file = case_dir + "/origin_models/"; const char *model_path = model_file.c_str(); std::string custom_proto = model_file; std::string caffe_proto = model_file; std::vector operators; ge::OpDescPtr op_desc_src = std::make_shared("Data", "Input"); ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src); operators.emplace_back(op_src); Status ret = modelParser.CustomProtoParse(model_path, custom_proto, caffe_proto, operators); EXPECT_EQ(ret, PARAM_INVALID); } TEST_F(STestCaffeParser, CaffeWeightsParser_ParseGraph_test) { CaffeWeightsParser weightParser; ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared("tmp_graph"); ge::Graph graph = ge::GraphUtils::CreateGraphFromComputeGraph(compute_graph); std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel"; const char *file = weight_file.c_str(); Status ret = weightParser.Parse(file, graph); EXPECT_EQ(ret, FAILED); } TEST_F(STestCaffeParser, CaffeWeightsParser_ConvertNetParameter_test) { CaffeWeightsParser weightParser; domi::caffe::NetParameter net; ge::ComputeGraphPtr graph = std::make_shared("test"); domi::caffe::LayerParameter *lay0 = net.add_layer(); lay0->set_name("Data"); lay0->set_type("Input"); Status ret = weightParser.ConvertNetParameter(net, graph); EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, CaffeModelParser_IsOpAttrEmpty_test) { CaffeModelParser model_parser; ge::OpDescPtr op_desc_src = std::make_shared("Data", "Input"); ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src); std::string type = "custom"; bool ret = model_parser.IsOpAttrEmpty(op_src, type); EXPECT_EQ(ret, true); type = "built-in"; ret = model_parser.IsOpAttrEmpty(op_src, type); EXPECT_EQ(ret, true); } TEST_F(STestCaffeParser, CaffeModelParser_GetCustomOp_test) { CaffeModelParser model_parser; domi::caffe::NetParameter net; domi::caffe::LayerParameter *layer = net.add_layer(); layer->set_name("Data"); layer->set_type("Input"); vector operators; ge::OpDescPtr op_desc_src = std::make_shared("Data", "Input"); ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src); operators.emplace_back(op_src); Status ret = model_parser.GetCustomOp(*layer, operators); EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, CaffeModelParser_AddTensorDescToOpDesc_test) { CaffeModelParser model_parser; domi::caffe::NetParameter net; ge::OpDescPtr op_desc_src = std::make_shared("Abs", "AbsVal"); domi::caffe::LayerParameter *layer = net.add_layer(); layer->set_name("Abs"); layer->set_type("AbsVal"); layer->add_bottom("Abs"); Status ret = model_parser.AddTensorDescToOpDesc(op_desc_src, *layer); EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, CaffeWeightsParser_ConvertLayerParameter_test) { CaffeWeightsParser weightParser; ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared("tmp_graph"); domi::caffe::NetParameter net; ge::OpDescPtr op_desc_src = std::make_shared("Abs", "AbsVal"); domi::caffe::LayerParameter *layer = net.add_layer(); layer->set_name("Abs"); layer->set_type("AbsVal"); Status ret = weightParser.ConvertLayerParameter(layer, compute_graph); EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, CaffeWeightsParser_CheckLayersSize_test) { CaffeWeightsParser weightParser; domi::caffe::NetParameter net; domi::caffe::LayerParameter *layer = net.add_layer(); layer->set_name("Abs"); layer->set_type("AbsVal"); Status ret = weightParser.CheckLayersSize(*layer); EXPECT_EQ(ret, FAILED); } TEST_F(STestCaffeParser, CaffeModelParser_FindShareParamLayers_test) { CaffeModelParser modelParser; std::map> layer_params_map; std::vector layer_params; layer_params.emplace_back("Conv"); layer_params.emplace_back("Data"); layer_params.emplace_back("Abs"); layer_params_map.insert(std::make_pair("Abs", layer_params)); layer_params_map.insert(std::make_pair("Data", layer_params)); layer_params_map.insert(std::make_pair("Conv", layer_params)); Status ret = modelParser.FindShareParamLayers(layer_params_map); EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, CaffeWeightsParser_ParseLayerParameter_test) { CaffeWeightsParser weightParser; domi::caffe::NetParameter net; GetParserContext().type = domi::CAFFE; domi::caffe::LayerParameter *layer = net.add_layer(); layer->set_name("Abs"); layer->set_type("AbsVal"); ge::ComputeGraphPtr compute_graph = build_graph(true); std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string caffe_proto = case_dir + "/../../../metadef/proto/caffe/"; google::protobuf::compiler::DiskSourceTree sourceTree; sourceTree.MapPath("project_root", caffe_proto); google::protobuf::compiler::Importer importer(&sourceTree, nullptr); importer.Import("project_root/caffe.proto"); auto descriptor = importer.pool()->FindMessageTypeByName("domi.caffe.LayerParameter"); google::protobuf::DynamicMessageFactory factory; const google::protobuf::Message *proto = factory.GetPrototype(descriptor); const google::protobuf::Message *message = proto->New(); Status ret = weightParser.ParseLayerParameter(*descriptor, *message, compute_graph); delete message; EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, CaffeModelParser_ParseInput_test_DimSize_0) { CaffeModelParser modelParser; domi::caffe::NetParameter net; net.add_input("111"); net.add_input_shape(); bool input_data_flag = true; Status ret = modelParser.ParseInput(net, input_data_flag); EXPECT_EQ(ret, SUCCESS); } TEST_F(STestCaffeParser, CaffeModelParser_ParseInput_test_Err1) { CaffeModelParser modelParser; domi::caffe::NetParameter net; net.add_input("111"); net.add_input("222"); net.add_input_shape(); bool input_data_flag = true; Status ret = modelParser.ParseInput(net, input_data_flag); EXPECT_EQ(ret, FAILED); } TEST_F(STestCaffeParser, CaffeModelParser_ParserLayerParameter_Succ) { CaffeModelParser modelParser; std::string case_dir = __FILE__; case_dir = case_dir.substr(0, case_dir.find_last_of("/")); std::string model_file = case_dir + "/origin_models/"; const char *model_path = model_file.c_str(); std::string custom_proto = model_file; std::string caffe_proto = model_file; std::vector operators; ge::OpDescPtr op_desc_src = std::make_shared("Data", "Input"); ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src); operators.emplace_back(op_src); model_file = case_dir + "/origin_models/caffe_add.pbtxt"; custom_proto = case_dir + "/../../../metadef/proto/caffe/caffe.proto"; model_path = model_file.c_str(); std::string caffe_proto_path = case_dir + "/../../../metadef/proto/caffe/caffe.proto"; auto ret = modelParser.CustomProtoParse(model_path, custom_proto, caffe_proto_path, operators); EXPECT_EQ(ret, SUCCESS); } } // namespace ge