You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_caffe_parser.cc 7.2 kB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /**
  2. * Copyright 2021 Huawei Technologies Co., Ltd
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include <gtest/gtest.h>
  17. #define protected public
  18. #define private public
  19. #include "parser/common/op_parser_factory.h"
  20. #include "graph/operator_reg.h"
  21. #include "register/op_registry.h"
  22. #include "parser/common/register_tbe.h"
  23. #include "framework/omg/parser/model_parser.h"
  24. #include "framework/omg/parser/parser_factory.h"
  25. #include "external/parser/caffe_parser.h"
  26. #include "st/parser_st_utils.h"
  27. #include "external/ge/ge_api_types.h"
  28. #include "tests/depends/ops_stub/ops_stub.h"
  29. #include "proto/caffe/caffe.pb.h"
  30. #include "parser/caffe/caffe_parser.h"
  31. #include "parser/caffe/caffe_data_parser.h"
  32. #include "parser/caffe/caffe_op_parser.h"
  33. #undef protected
  34. #undef private
  35. using namespace domi::caffe;
  36. namespace ge {
  37. class STestCaffeParser : public testing::Test {
  38. protected:
  39. void SetUp() {
  40. ParerSTestsUtils::ClearParserInnerCtx();
  41. RegisterCustomOp();
  42. }
  43. void TearDown() {}
  44. public:
  45. void RegisterCustomOp();
  46. };
  47. static Status ParseParams(const google::protobuf::Message* op_src, ge::Operator& op_dest) {
  48. return SUCCESS;
  49. }
  50. static ge::NodePtr GenNodeFromOpDesc(ge::OpDescPtr opDesc){
  51. if (!opDesc) {
  52. return nullptr;
  53. }
  54. static auto g = std::make_shared<ge::ComputeGraph>("g");
  55. return g->AddNode(std::move(opDesc));
  56. }
  57. void STestCaffeParser::RegisterCustomOp() {
  58. REGISTER_CUSTOM_OP("Data")
  59. .FrameworkType(domi::CAFFE)
  60. .OriginOpType("Input")
  61. .ParseParamsFn(ParseParams);
  62. REGISTER_CUSTOM_OP("Abs")
  63. .FrameworkType(domi::CAFFE)
  64. .OriginOpType("AbsVal")
  65. .ParseParamsFn(ParseParams);
  66. std::vector<OpRegistrationData> reg_datas = domi::OpRegistry::Instance()->registrationDatas;
  67. for (auto reg_data : reg_datas) {
  68. OpRegistrationTbe::Instance()->Finalize(reg_data);
  69. domi::OpRegistry::Instance()->Register(reg_data);
  70. }
  71. domi::OpRegistry::Instance()->registrationDatas.clear();
  72. }
  73. TEST_F(STestCaffeParser, caffe_parser_user_output_with_default) {
  74. std::string case_dir = __FILE__;
  75. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  76. std::string model_file = case_dir + "/origin_models/caffe_abs.pbtxt";
  77. auto model_parser = domi::ModelParserFactory::Instance()->CreateModelParser(domi::CAFFE);
  78. ASSERT_NE(model_parser, nullptr);
  79. ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared<ge::ComputeGraph>("tmp_graph");
  80. ASSERT_NE(compute_graph, nullptr);
  81. ge::Graph graph = ge::GraphUtils::CreateGraphFromComputeGraph(compute_graph);
  82. auto ret = model_parser->Parse(model_file.c_str(), graph);
  83. ASSERT_EQ(ret, GRAPH_SUCCESS);
  84. AclGrphParseUtil acl_graph_parse_util;
  85. std::map<AscendString, AscendString> parser_params;
  86. auto status = acl_graph_parse_util.SetOutputNodeInfo(graph, parser_params);
  87. ASSERT_EQ(status, SUCCESS);
  88. auto output_nodes_info = compute_graph->GetGraphOutNodesInfo();
  89. ASSERT_EQ(output_nodes_info.size(), 1);
  90. EXPECT_EQ((output_nodes_info.at(0).first->GetName()), "abs");
  91. EXPECT_EQ((output_nodes_info.at(0).second), 0);
  92. auto &net_out_name = ge::GetParserContext().net_out_nodes;
  93. ASSERT_EQ(net_out_name.size(), 1);
  94. EXPECT_EQ(net_out_name.at(0), "abs:0:abs_out");
  95. }
  96. TEST_F(STestCaffeParser, acal_caffe_parser) {
  97. std::string case_dir = __FILE__;
  98. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  99. std::string model_file = case_dir + "/origin_models/caffe_add.pbtxt";
  100. std::string weight_file_txt = case_dir + "/origin_models/caffe_add.caffemodel.txt";
  101. std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel";
  102. domi::caffe::NetParameter proto;
  103. EXPECT_EQ(ParerSTestsUtils::ReadProtoFromText(weight_file_txt.c_str(), &proto), true);
  104. ParerSTestsUtils::WriteProtoToBinaryFile(proto, weight_file.c_str());
  105. ge::GetParserContext().caffe_proto_path = case_dir + "/../../../../metadef/proto/caffe/caffe.proto";
  106. std::map<ge::AscendString, ge::AscendString> parser_params;
  107. ge::Graph graph;
  108. auto ret = ge::aclgrphParseCaffe(model_file.c_str(), weight_file.c_str(), parser_params, graph);
  109. EXPECT_EQ(ret, GRAPH_FAILED);
  110. ret = ge::aclgrphParseCaffe(model_file.c_str(), weight_file.c_str(), graph);
  111. EXPECT_EQ(ret, GRAPH_FAILED);
  112. }
  113. TEST_F(STestCaffeParser, modelparser_parsefrommemory_success)
  114. {
  115. std::string caseDir = __FILE__;
  116. std::size_t idx = caseDir.find_last_of("/");
  117. caseDir = caseDir.substr(0, idx);
  118. std::string modelFile = caseDir + "/origin_models/caffe_add.pbtxt";
  119. const char* tmp_tf_pb_model = modelFile.c_str();
  120. ge::Graph graph;
  121. ge::ComputeGraphPtr compute_graph = ge::GraphUtils::GetComputeGraph(graph);
  122. CaffeModelParser modelParser;
  123. MemBuffer* memBuffer = ParerSTestsUtils::MemBufferFromFile(tmp_tf_pb_model);
  124. auto ret = modelParser.ParseFromMemory((char*)memBuffer->data, memBuffer->size, compute_graph);
  125. free(memBuffer->data);
  126. delete memBuffer;
  127. EXPECT_EQ(ret, GRAPH_FAILED);
  128. }
  129. TEST_F(STestCaffeParser, caffe_parser_to_json) {
  130. std::string case_dir = __FILE__;
  131. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  132. std::string model_file = case_dir + "/origin_models/caffe_add.pbtxt";
  133. std::map<ge::AscendString, ge::AscendString> parser_params;
  134. CaffeModelParser caffe_parser;
  135. const char *json_file = "tmp.json";
  136. auto ret = caffe_parser.ToJson(model_file.c_str(), json_file);
  137. EXPECT_EQ(ret, SUCCESS);
  138. const char *json_null = nullptr;
  139. ret = caffe_parser.ToJson(model_file.c_str(), json_null);
  140. EXPECT_EQ(ret, FAILED);
  141. const char *model_null = nullptr;
  142. ret = caffe_parser.ToJson(model_null, json_null);
  143. EXPECT_EQ(ret, FAILED);
  144. }
  145. TEST_F(STestCaffeParser, caffe_parser_ParseParamsForDummyData_test)
  146. {
  147. CaffeDataParser caffe_parser;
  148. domi::caffe::NetParameter net;
  149. ge::OpDescPtr op = std::make_shared<ge::OpDesc>("conv", "Convolution");
  150. domi::caffe::LayerParameter *lay = net.add_layer();
  151. Status ret = caffe_parser.ParseParamsForDummyData(lay, op);
  152. EXPECT_EQ(ret, FAILED);
  153. ret = caffe_parser.ParseParamsForInput(lay, op);
  154. EXPECT_EQ(ret, FAILED);
  155. }
  156. TEST_F(STestCaffeParser, convertWeights_success)
  157. {
  158. CaffeOpParser parser;
  159. ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc();
  160. ge::GeTensorPtr weight = std::make_shared<ge::GeTensor>(ge_tensor_desc);
  161. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  162. auto node_tmp = GenNodeFromOpDesc(opDef);
  163. domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter();
  164. domi::caffe::BlobProto *blob = layer->add_blobs();
  165. blob->set_int8_data("12");
  166. blob->add_data(1);
  167. blob->add_data(1);
  168. domi::caffe::BlobShape *shap = blob->mutable_shape();
  169. shap->add_dim(1);
  170. shap->add_dim(2);
  171. Status ret = parser.ConvertWeight(*blob, "", weight);
  172. EXPECT_EQ(domi::SUCCESS, ret);
  173. delete layer;
  174. }
  175. } // namespace ge