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 28 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
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
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  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. #include "parser/caffe/caffe_custom_parser_adapter.h"
  34. #include "parser/caffe/caffe_op_parser.h"
  35. #include "graph/operator_reg.h"
  36. #include "parser/common/acl_graph_parser_util.h"
  37. #undef protected
  38. #undef private
  39. #include <google/protobuf/compiler/importer.h>
  40. #include <google/protobuf/io/coded_stream.h>
  41. #include <google/protobuf/io/zero_copy_stream_impl.h>
  42. #include <google/protobuf/text_format.h>
  43. #include <google/protobuf/dynamic_message.h>
  44. using namespace domi::caffe;
  45. using namespace ge;
  46. namespace ge {
  47. class STestCaffeParser : public testing::Test {
  48. protected:
  49. void SetUp() {
  50. ParerSTestsUtils::ClearParserInnerCtx();
  51. RegisterCustomOp();
  52. }
  53. void TearDown() {}
  54. public:
  55. void RegisterCustomOp();
  56. };
  57. static Status ParseParams(const google::protobuf::Message* op_src, ge::Operator& op_dest) {
  58. return SUCCESS;
  59. }
  60. static ge::NodePtr GenNodeFromOpDesc(ge::OpDescPtr opDesc){
  61. if (!opDesc) {
  62. return nullptr;
  63. }
  64. static auto g = std::make_shared<ge::ComputeGraph>("g");
  65. return g->AddNode(std::move(opDesc));
  66. }
  67. ge::ComputeGraphPtr build_graph(bool with_leaf_node = false)
  68. {
  69. ge::ComputeGraphPtr graph = std::make_shared<ge::ComputeGraph>("default");
  70. ge::OpDescPtr data_op = std::make_shared<ge::OpDesc>();
  71. data_op->SetType(parser::DATA);
  72. data_op->SetName("Data1");
  73. data_op->AddInputDesc(ge::GeTensorDesc());
  74. data_op->AddOutputDesc(ge::GeTensorDesc());
  75. ge::NodePtr data1 = graph->AddNode(data_op);
  76. ge::OpDescPtr relu_op1 = std::make_shared<ge::OpDesc>();
  77. relu_op1->SetType(parser::ACTIVATION);
  78. relu_op1->SetName("Relu1");
  79. relu_op1->AddInputDesc(ge::GeTensorDesc());
  80. relu_op1->AddOutputDesc(ge::GeTensorDesc());
  81. ge::NodePtr relu1 = graph->AddNode(relu_op1);
  82. ge::OpDescPtr relu_op2 = std::make_shared<ge::OpDesc>();
  83. relu_op2->SetType(parser::RELU);
  84. relu_op2->SetName("Relu2");
  85. relu_op2->AddInputDesc(ge::GeTensorDesc());
  86. relu_op2->AddOutputDesc(ge::GeTensorDesc());
  87. relu_op2->AddOutputDesc(ge::GeTensorDesc());
  88. ge::NodePtr relu2 = graph->AddNode(relu_op2);
  89. ge::OpDescPtr relu_op3 = std::make_shared<ge::OpDesc>();
  90. relu_op3->SetType(parser::ACTIVATION);
  91. relu_op3->SetName("Relu3");
  92. relu_op3->AddInputDesc(ge::GeTensorDesc());
  93. relu_op3->AddOutputDesc(ge::GeTensorDesc());
  94. ge::NodePtr relu3;
  95. if (with_leaf_node == true) {
  96. relu3 = graph->AddNode(relu_op3);
  97. }
  98. ge::OpDescPtr mul_op = std::make_shared<ge::OpDesc>();
  99. mul_op->SetType(parser::MUL);
  100. mul_op->SetName("Mul");
  101. mul_op->AddInputDesc(ge::GeTensorDesc());
  102. mul_op->AddInputDesc(ge::GeTensorDesc());
  103. mul_op->AddOutputDesc(ge::GeTensorDesc());
  104. mul_op->AddOutputDesc(ge::GeTensorDesc());
  105. mul_op->AddOutputDesc(ge::GeTensorDesc());
  106. mul_op->AddOutputDesc(ge::GeTensorDesc());
  107. ge::NodePtr mul = graph->AddNode(mul_op);
  108. ge::OpDescPtr mul_op1 = std::make_shared<ge::OpDesc>();
  109. mul_op1->SetType(parser::MUL);
  110. mul_op1->SetName("Mul1");
  111. mul_op1->AddInputDesc(ge::GeTensorDesc());
  112. mul_op1->AddInputDesc(ge::GeTensorDesc());
  113. mul_op1->AddOutputDesc(ge::GeTensorDesc());
  114. ge::NodePtr mul1 = graph->AddNode(mul_op1);
  115. ge::OpDescPtr mul_op2 = std::make_shared<ge::OpDesc>();
  116. mul_op2->SetType(parser::MUL);
  117. mul_op2->SetName("Mul2");
  118. mul_op2->AddInputDesc(ge::GeTensorDesc());
  119. mul_op2->AddInputDesc(ge::GeTensorDesc());
  120. mul_op2->AddOutputDesc(ge::GeTensorDesc());
  121. ge::NodePtr mul2 = graph->AddNode(mul_op2);
  122. ge::OpDescPtr fc_op = std::make_shared<ge::OpDesc>();
  123. fc_op->SetType(parser::FULL_CONNECTION);
  124. fc_op->SetName("FullConnection");
  125. fc_op->AddInputDesc(ge::GeTensorDesc());
  126. fc_op->AddOutputDesc(ge::GeTensorDesc());
  127. fc_op->AddOutputDesc(ge::GeTensorDesc());
  128. ge::NodePtr fc = graph->AddNode(fc_op);
  129. ge::GraphUtils::AddEdge(data1->GetOutDataAnchor(0), relu1->GetInDataAnchor(0));
  130. ge::GraphUtils::AddEdge(relu1->GetOutDataAnchor(0), fc->GetInDataAnchor(0));
  131. ge::GraphUtils::AddEdge(fc->GetOutDataAnchor(0), relu2->GetInDataAnchor(0));
  132. if (with_leaf_node == true) {
  133. ge::GraphUtils::AddEdge(fc->GetOutDataAnchor(1), relu3->GetInDataAnchor(0));
  134. }
  135. ge::GraphUtils::AddEdge(relu2->GetOutDataAnchor(0), mul->GetInDataAnchor(0));
  136. ge::GraphUtils::AddEdge(relu2->GetOutDataAnchor(1), mul->GetInDataAnchor(1));
  137. ge::GraphUtils::AddEdge(mul->GetOutDataAnchor(0), mul1->GetInDataAnchor(0));
  138. ge::GraphUtils::AddEdge(mul->GetOutDataAnchor(1), mul1->GetInDataAnchor(1));
  139. ge::GraphUtils::AddEdge(mul->GetOutDataAnchor(2), mul2->GetInDataAnchor(0));
  140. ge::GraphUtils::AddEdge(mul->GetOutDataAnchor(3), mul2->GetInDataAnchor(1));
  141. return graph;
  142. }
  143. void STestCaffeParser::RegisterCustomOp() {
  144. REGISTER_CUSTOM_OP("Data")
  145. .FrameworkType(domi::CAFFE)
  146. .OriginOpType("Input")
  147. .ParseParamsFn(ParseParams);
  148. REGISTER_CUSTOM_OP("Abs")
  149. .FrameworkType(domi::CAFFE)
  150. .OriginOpType("AbsVal")
  151. .ParseParamsFn(ParseParams);
  152. std::vector<OpRegistrationData> reg_datas = domi::OpRegistry::Instance()->registrationDatas;
  153. for (auto reg_data : reg_datas) {
  154. OpRegistrationTbe::Instance()->Finalize(reg_data);
  155. domi::OpRegistry::Instance()->Register(reg_data);
  156. }
  157. domi::OpRegistry::Instance()->registrationDatas.clear();
  158. }
  159. TEST_F(STestCaffeParser, caffe_parser_user_output_with_default) {
  160. std::string case_dir = __FILE__;
  161. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  162. std::string model_file = case_dir + "/origin_models/caffe_abs.pbtxt";
  163. auto model_parser = domi::ModelParserFactory::Instance()->CreateModelParser(domi::CAFFE);
  164. ASSERT_NE(model_parser, nullptr);
  165. ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared<ge::ComputeGraph>("tmp_graph");
  166. ASSERT_NE(compute_graph, nullptr);
  167. ge::Graph graph = ge::GraphUtils::CreateGraphFromComputeGraph(compute_graph);
  168. auto ret = model_parser->Parse(model_file.c_str(), graph);
  169. ASSERT_EQ(ret, GRAPH_SUCCESS);
  170. AclGrphParseUtil acl_graph_parse_util;
  171. std::map<AscendString, AscendString> parser_params;
  172. auto status = acl_graph_parse_util.SetOutputNodeInfo(graph, parser_params);
  173. ASSERT_EQ(status, SUCCESS);
  174. auto output_nodes_info = compute_graph->GetGraphOutNodesInfo();
  175. ASSERT_EQ(output_nodes_info.size(), 1);
  176. EXPECT_EQ((output_nodes_info.at(0).first->GetName()), "abs");
  177. EXPECT_EQ((output_nodes_info.at(0).second), 0);
  178. auto &net_out_name = ge::GetParserContext().net_out_nodes;
  179. ASSERT_EQ(net_out_name.size(), 1);
  180. EXPECT_EQ(net_out_name.at(0), "abs:0:abs_out");
  181. }
  182. TEST_F(STestCaffeParser, acl_caffe_parser) {
  183. std::string case_dir = __FILE__;
  184. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  185. std::string model_file = case_dir + "/origin_models/caffe_add.pbtxt";
  186. std::string weight_file_txt = case_dir + "/origin_models/caffe_add.caffemodel.txt";
  187. std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel";
  188. domi::caffe::NetParameter proto;
  189. EXPECT_EQ(ParerSTestsUtils::ReadProtoFromText(weight_file_txt.c_str(), &proto), true);
  190. ParerSTestsUtils::WriteProtoToBinaryFile(proto, weight_file.c_str());
  191. ge::GetParserContext().caffe_proto_path = case_dir + "/../../../../metadef/proto/caffe/caffe.proto";
  192. std::map<ge::AscendString, ge::AscendString> parser_params;
  193. ge::Graph graph;
  194. auto ret = ge::aclgrphParseCaffe(model_file.c_str(), weight_file.c_str(), parser_params, graph);
  195. EXPECT_EQ(ret, GRAPH_FAILED);
  196. ret = ge::aclgrphParseCaffe(model_file.c_str(), weight_file.c_str(), graph);
  197. EXPECT_EQ(ret, GRAPH_FAILED);
  198. }
  199. TEST_F(STestCaffeParser, modelparser_parsefrommemory_success)
  200. {
  201. std::string caseDir = __FILE__;
  202. std::size_t idx = caseDir.find_last_of("/");
  203. caseDir = caseDir.substr(0, idx);
  204. std::string modelFile = caseDir + "/origin_models/caffe_add.pbtxt";
  205. const char* tmp_tf_pb_model = modelFile.c_str();
  206. ge::Graph graph;
  207. ge::ComputeGraphPtr compute_graph = ge::GraphUtils::GetComputeGraph(graph);
  208. CaffeModelParser modelParser;
  209. MemBuffer* memBuffer = ParerSTestsUtils::MemBufferFromFile(tmp_tf_pb_model);
  210. auto ret = modelParser.ParseFromMemory((char*)memBuffer->data, memBuffer->size, compute_graph);
  211. free(memBuffer->data);
  212. delete memBuffer;
  213. EXPECT_EQ(ret, GRAPH_FAILED);
  214. }
  215. TEST_F(STestCaffeParser, caffe_parser_to_json) {
  216. std::string case_dir = __FILE__;
  217. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  218. std::string model_file = case_dir + "/origin_models/caffe_add.pbtxt";
  219. std::map<ge::AscendString, ge::AscendString> parser_params;
  220. CaffeModelParser caffe_parser;
  221. const char *json_file = "tmp.json";
  222. auto ret = caffe_parser.ToJson(model_file.c_str(), json_file);
  223. EXPECT_EQ(ret, SUCCESS);
  224. const char *json_null = nullptr;
  225. ret = caffe_parser.ToJson(model_file.c_str(), json_null);
  226. EXPECT_EQ(ret, FAILED);
  227. const char *model_null = nullptr;
  228. ret = caffe_parser.ToJson(model_null, json_null);
  229. EXPECT_EQ(ret, FAILED);
  230. }
  231. TEST_F(STestCaffeParser, caffe_parser_ParseParamsForDummyData_test)
  232. {
  233. CaffeDataParser caffe_parser;
  234. domi::caffe::NetParameter net;
  235. ge::OpDescPtr op = std::make_shared<ge::OpDesc>("conv", "Convolution");
  236. domi::caffe::LayerParameter *lay = net.add_layer();
  237. Status ret = caffe_parser.ParseParamsForDummyData(lay, op);
  238. EXPECT_EQ(ret, FAILED);
  239. ret = caffe_parser.ParseParamsForInput(lay, op);
  240. EXPECT_EQ(ret, FAILED);
  241. domi::caffe::DummyDataParameter *dummyData = lay->mutable_dummy_data_param();
  242. ret = caffe_parser.ParseParamsForDummyData(lay, op);
  243. EXPECT_EQ(ret, FAILED);
  244. domi::caffe::BlobShape* dummpShape = dummyData->add_shape();
  245. ret = caffe_parser.ParseParamsForDummyData(lay, op);
  246. EXPECT_EQ(ret, SUCCESS);
  247. }
  248. TEST_F(STestCaffeParser, convertWeights_success)
  249. {
  250. CaffeOpParser parser;
  251. ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc();
  252. ge::GeTensorPtr weight = std::make_shared<ge::GeTensor>(ge_tensor_desc);
  253. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  254. auto node_tmp = GenNodeFromOpDesc(opDef);
  255. domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter();
  256. domi::caffe::BlobProto *blob = layer->add_blobs();
  257. blob->set_int8_data("12");
  258. blob->add_data(1);
  259. blob->add_data(1);
  260. domi::caffe::BlobShape *shap = blob->mutable_shape();
  261. shap->add_dim(1);
  262. shap->add_dim(2);
  263. Status ret = parser.ConvertWeight(*blob, "", weight);
  264. EXPECT_EQ(domi::SUCCESS, ret);
  265. delete layer;
  266. }
  267. TEST_F(STestCaffeParser, CaffeCustomParserAdapter_ParseWeights_success)
  268. {
  269. CaffeCustomParserAdapter parserAdapter;
  270. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  271. auto node_tmp = GenNodeFromOpDesc(opDef);
  272. LayerParameter* layer = new LayerParameter();
  273. Status ret = parserAdapter.ParseWeights(layer, node_tmp);
  274. EXPECT_EQ(ret, SUCCESS);
  275. BlobProto* blob = layer->add_blobs();
  276. blob->add_data(1);
  277. blob->add_data(1);
  278. BlobShape* shap = blob->mutable_shape();
  279. shap->add_dim(1);
  280. shap->add_dim(2);
  281. ret = parserAdapter.ParseWeights(layer, node_tmp);
  282. EXPECT_EQ(ret, SUCCESS);
  283. delete layer;
  284. }
  285. TEST_F(STestCaffeParser, CaffeCustomParserAdapter_ParseParams_success)
  286. {
  287. ge::OpDescPtr op_desc_src = std::make_shared<ge::OpDesc>("Data", "Input");
  288. ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src);
  289. ge::OpDescPtr op_dest = std::make_shared<ge::OpDesc>("Data", "Input");
  290. CaffeCustomParserAdapter parserAdapter;
  291. Status ret = parserAdapter.ParseParams(op_src, op_dest);
  292. EXPECT_EQ(ret, PARAM_INVALID);
  293. }
  294. TEST_F(STestCaffeParser, CaffeDataParser_ParseParams_success)
  295. {
  296. domi::caffe::NetParameter net;
  297. ge::OpDescPtr op_desc_src = std::make_shared<ge::OpDesc>("Data", "Input");
  298. domi::caffe::LayerParameter* lay0 = net.add_layer();
  299. lay0->set_name("conv");
  300. lay0->set_type(ge::parser::DUMMY_DATA);
  301. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  302. CaffeDataParser parserAdapter;
  303. Status ret = parserAdapter.ParseParams(lay0, opDef);
  304. EXPECT_EQ(ret, FAILED);
  305. lay0->set_type(ge::parser::ATTR_NAME_INPUT_TENSOR_DESC);
  306. ret = parserAdapter.ParseParams(lay0, opDef);
  307. EXPECT_EQ(ret, FAILED);
  308. }
  309. TEST_F(STestCaffeParser, CaffeWeightsParser_Parse_test)
  310. {
  311. CaffeWeightsParser weightParser;
  312. std::string case_dir = __FILE__;
  313. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  314. std::string model_file = case_dir + "/origin_models/caffe_add.caffemodel";
  315. const char *file = nullptr;
  316. ge::ComputeGraphPtr graph;
  317. Status ret = weightParser.Parse(file, graph);
  318. EXPECT_EQ(ret, PARAM_INVALID);
  319. file = model_file.c_str();
  320. ret = weightParser.Parse(file, graph);
  321. EXPECT_EQ(ret, PARAM_INVALID);
  322. graph = std::make_shared<ComputeGraph>("test");
  323. ret = weightParser.Parse(file, graph);
  324. EXPECT_EQ(ret, FAILED);
  325. std::string caffe_proto = case_dir + "/../../../../metadef/proto/caffe/";
  326. std::string custom_proto = case_dir + "/origin_models/";
  327. ge::GetParserContext().caffe_proto_path.assign(caffe_proto);
  328. ge::GetParserContext().custom_proto_path.assign(custom_proto);
  329. ret = weightParser.Parse(file, graph);
  330. EXPECT_EQ(ret, FAILED);
  331. custom_proto = case_dir + "/origin_model/";
  332. caffe_proto = case_dir + "/../../../metadef/proto/caffe/";
  333. ge::GetParserContext().caffe_proto_path.assign(caffe_proto);
  334. ge::GetParserContext().custom_proto_path.assign(custom_proto);
  335. ret = weightParser.Parse(file, graph);
  336. EXPECT_EQ(ret, SUCCESS);
  337. }
  338. TEST_F(STestCaffeParser, CaffeWeightsParser_ParseWeightByFusionProto_test)
  339. {
  340. CaffeWeightsParser weightParser;
  341. std::string case_dir = __FILE__;
  342. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  343. std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel";
  344. std::string model_file = case_dir + "/origin_models/caffe.proto";
  345. const char *weight_path = model_file.c_str();
  346. std::string fusion_proto_path = model_file;
  347. std::string fusion_proto_name = "caffe";
  348. ge::ComputeGraphPtr graph = std::make_shared<ComputeGraph>("test");
  349. Status ret = weightParser.ParseWeightByFusionProto(weight_path, fusion_proto_path, fusion_proto_name, graph);
  350. EXPECT_EQ(ret, FAILED);
  351. }
  352. TEST_F(STestCaffeParser, CaffeWeightsParser_ParseFromMemory_test)
  353. {
  354. CaffeWeightsParser weightParser;
  355. std::string case_dir = __FILE__;
  356. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  357. std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel";
  358. ge::ComputeGraphPtr graph;
  359. const char *data = nullptr;
  360. Status ret = weightParser.ParseFromMemory(data, 1, graph);
  361. EXPECT_EQ(ret, PARAM_INVALID);
  362. data = weight_file.c_str();
  363. ret = weightParser.ParseFromMemory(data, 1, graph);
  364. EXPECT_EQ(ret, PARAM_INVALID);
  365. graph = std::make_shared<ComputeGraph>("test");
  366. ret = weightParser.ParseFromMemory(data, 1, graph);
  367. EXPECT_EQ(ret, domi::PARSE_WEIGHTS_FAILED);
  368. CaffeModelParser model_parser;
  369. ret = model_parser.ParseFromMemory(data, 1, graph);
  370. EXPECT_EQ(ret, FAILED);
  371. }
  372. TEST_F(STestCaffeParser, CaffeWeightsParser_CreateCustomOperator_test)
  373. {
  374. CaffeModelParser model_parser;
  375. vector<ge::Operator> operators;
  376. ge::OpDescPtr op_desc_src = std::make_shared<ge::OpDesc>("Data", "Input");
  377. ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src);
  378. operators.emplace_back(op_src);
  379. std::string op_name = "";
  380. std::string op_type = "";
  381. domi::caffe::NetParameter net;
  382. domi::caffe::LayerParameter *lay0 = net.add_layer();
  383. lay0->set_name("Data");
  384. lay0->set_type("Input");
  385. Status ret = model_parser.CreateCustomOperator(op_name, op_type, &net, 1, operators);
  386. EXPECT_EQ(ret, FAILED);
  387. op_name = "Data";
  388. op_type = "Input";
  389. ret = model_parser.CreateCustomOperator(op_name, op_type, &net, 1, operators);
  390. EXPECT_EQ(ret, SUCCESS);
  391. model_parser.AddOutputInfoToContext(op_name, 1);
  392. }
  393. TEST_F(STestCaffeParser, CaffeWeightsParser_ParseOutputNodeTopInfo_test)
  394. {
  395. CaffeModelParser model_parser;
  396. AclGrphParseUtil acl_graph_parse_util;
  397. domi::caffe::NetParameter net;
  398. domi::caffe::LayerParameter *lay0 = net.add_layer();
  399. lay0->set_name("Data");
  400. lay0->set_type("Input");
  401. Status ret = model_parser.ParseOutputNodeTopInfo(net);
  402. EXPECT_EQ(ret, SUCCESS);
  403. GetParserContext().type = domi::CAFFE;
  404. string graph_name;
  405. std::map<AscendString, AscendString> out_nodes_with_tensor_name1 = {
  406. {AscendString(ge::ir_option::OUT_NODES), AscendString("Out_tensor_1;Out_tensor_2")}};
  407. acl_graph_parse_util.ParseParamsBeforeGraph(out_nodes_with_tensor_name1, graph_name);
  408. ret = model_parser.ParseOutputNodeTopInfo(net);
  409. EXPECT_EQ(ret, PARAM_INVALID);
  410. }
  411. TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test)
  412. {
  413. CaffeOpParser opParser;
  414. ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc();
  415. ge::GeTensorPtr weight = std::make_shared<ge::GeTensor>(ge_tensor_desc);
  416. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  417. auto node_tmp = GenNodeFromOpDesc(opDef);
  418. domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter();
  419. domi::caffe::BlobProto *blob = layer->add_blobs();
  420. blob->set_int8_data("10");
  421. std::string lay_name = "DATA";
  422. GeShape shape({1,1,3,4});
  423. Status ret = opParser.ParseWeightType(*blob, shape, 1, lay_name, weight);
  424. EXPECT_EQ(ret, FAILED);
  425. delete layer;
  426. }
  427. TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test2)
  428. {
  429. CaffeOpParser opParser;
  430. ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc();
  431. ge::GeTensorPtr weight = std::make_shared<ge::GeTensor>(ge_tensor_desc);
  432. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  433. auto node_tmp = GenNodeFromOpDesc(opDef);
  434. domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter();
  435. domi::caffe::BlobProto *blob = layer->add_blobs();
  436. blob->add_int32_data(10);
  437. std::string lay_name = "DATA";
  438. GeShape shape({1,1,3,4});
  439. Status ret = opParser.ParseWeightType(*blob, shape, 1, lay_name, weight);
  440. EXPECT_EQ(ret, SUCCESS);
  441. ret = opParser.ParseWeightType(*blob, shape, 2, lay_name, weight);
  442. EXPECT_EQ(ret, FAILED);
  443. delete layer;
  444. }
  445. TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test3)
  446. {
  447. CaffeOpParser opParser;
  448. ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc();
  449. ge::GeTensorPtr weight = std::make_shared<ge::GeTensor>(ge_tensor_desc);
  450. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  451. auto node_tmp = GenNodeFromOpDesc(opDef);
  452. domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter();
  453. domi::caffe::BlobProto *blob = layer->add_blobs();
  454. double value = 2.0;
  455. blob->add_double_data(value);
  456. std::string lay_name = "DATA";
  457. GeShape shape({1,1,3,4});
  458. Status ret = opParser.ParseWeightType(*blob, shape, 1, lay_name, weight);
  459. EXPECT_EQ(ret, SUCCESS);
  460. ret = opParser.ParseWeightType(*blob, shape, 3, lay_name, weight);
  461. EXPECT_EQ(ret, FAILED);
  462. delete layer;
  463. }
  464. TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test4)
  465. {
  466. CaffeOpParser opParser;
  467. ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc();
  468. ge::GeTensorPtr weight = std::make_shared<ge::GeTensor>(ge_tensor_desc);
  469. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  470. auto node_tmp = GenNodeFromOpDesc(opDef);
  471. domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter();
  472. domi::caffe::BlobProto *blob = layer->add_blobs();
  473. blob->add_uint64_data(10);
  474. std::string lay_name = "DATA";
  475. GeShape shape({1,1,3,4});
  476. Status ret = opParser.ParseWeightType(*blob, shape, 1, lay_name, weight);
  477. EXPECT_EQ(ret, SUCCESS);
  478. ret = opParser.ParseWeightType(*blob, shape, 2, lay_name, weight);
  479. EXPECT_EQ(ret, FAILED);
  480. delete layer;
  481. }
  482. TEST_F(STestCaffeParser, CaffeOpParser_ParseWeightType_test5)
  483. {
  484. CaffeOpParser opParser;
  485. ge::GeTensorDesc ge_tensor_desc = ge::GeTensorDesc();
  486. ge::GeTensorPtr weight = std::make_shared<ge::GeTensor>(ge_tensor_desc);
  487. ge::OpDescPtr opDef = std::make_shared<ge::OpDesc>("","");
  488. auto node_tmp = GenNodeFromOpDesc(opDef);
  489. domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter();
  490. domi::caffe::BlobProto *blob = layer->add_blobs();
  491. blob->add_data(10);
  492. std::string lay_name = "DATA";
  493. GeShape shape({1,1,3,4});
  494. Status ret = opParser.ParseWeightType(*blob, shape, 10, lay_name, weight);
  495. EXPECT_EQ(ret, FAILED);
  496. delete layer;
  497. }
  498. TEST_F(STestCaffeParser, CaffeOpParser_ConvertShape_test)
  499. {
  500. CaffeOpParser opParser;
  501. domi::caffe::LayerParameter *layer = new domi::caffe::LayerParameter();
  502. domi::caffe::BlobProto *blob = layer->add_blobs();
  503. blob->set_num(1);
  504. blob->set_channels(2);
  505. blob->set_height(1);
  506. blob->set_width(1);
  507. std::vector<int64_t> shape;
  508. opParser.ConvertShape(*blob, shape);
  509. delete layer;
  510. }
  511. TEST_F(STestCaffeParser, CaffeModelParser_ParseInput_test)
  512. {
  513. CaffeModelParser modelParser;
  514. domi::caffe::NetParameter net;
  515. net.add_input("111");
  516. net.add_input_dim(1);
  517. bool input_data_flag = true;
  518. Status ret = modelParser.ParseInput(net, input_data_flag);
  519. EXPECT_EQ(ret, FAILED);
  520. net.add_input_dim(2);
  521. net.add_input_dim(3);
  522. net.add_input_dim(4);
  523. domi::caffe::LayerParameter *lay0 = net.add_layer();
  524. BlobProto* blob = lay0->add_blobs();
  525. blob->add_data(1);
  526. blob->add_data(1);
  527. BlobShape* shap = blob->mutable_shape();
  528. shap->add_dim(1);
  529. shap->add_dim(2);
  530. ret = modelParser.ParseInput(net, input_data_flag);
  531. EXPECT_EQ(ret, SUCCESS);
  532. net.add_input_shape();
  533. ret = modelParser.ParseInput(net, input_data_flag);
  534. EXPECT_EQ(ret, FAILED);
  535. }
  536. TEST_F(STestCaffeParser, CaffeModelParser_CustomProtoParse_test)
  537. {
  538. CaffeModelParser modelParser;
  539. std::string case_dir = __FILE__;
  540. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  541. std::string model_file = case_dir + "/origin_models/";
  542. const char *model_path = model_file.c_str();
  543. std::string custom_proto = model_file;
  544. std::string caffe_proto = model_file;
  545. std::vector<ge::Operator> operators;
  546. ge::OpDescPtr op_desc_src = std::make_shared<ge::OpDesc>("Data", "Input");
  547. ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src);
  548. operators.emplace_back(op_src);
  549. Status ret = modelParser.CustomProtoParse(model_path, custom_proto, caffe_proto, operators);
  550. EXPECT_EQ(ret, PARAM_INVALID);
  551. }
  552. TEST_F(STestCaffeParser, CaffeWeightsParser_ParseGraph_test)
  553. {
  554. CaffeWeightsParser weightParser;
  555. ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared<ge::ComputeGraph>("tmp_graph");
  556. ge::Graph graph = ge::GraphUtils::CreateGraphFromComputeGraph(compute_graph);
  557. std::string case_dir = __FILE__;
  558. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  559. std::string weight_file = case_dir + "/origin_models/caffe_add.caffemodel";
  560. const char *file = weight_file.c_str();
  561. Status ret = weightParser.Parse(file, graph);
  562. EXPECT_EQ(ret, FAILED);
  563. }
  564. TEST_F(STestCaffeParser, CaffeWeightsParser_ConvertNetParameter_test)
  565. {
  566. CaffeWeightsParser weightParser;
  567. domi::caffe::NetParameter net;
  568. ge::ComputeGraphPtr graph = std::make_shared<ComputeGraph>("test");
  569. domi::caffe::LayerParameter *lay0 = net.add_layer();
  570. lay0->set_name("Data");
  571. lay0->set_type("Input");
  572. Status ret = weightParser.ConvertNetParameter(net, graph);
  573. EXPECT_EQ(ret, SUCCESS);
  574. }
  575. TEST_F(STestCaffeParser, CaffeModelParser_IsOpAttrEmpty_test)
  576. {
  577. CaffeModelParser model_parser;
  578. ge::OpDescPtr op_desc_src = std::make_shared<ge::OpDesc>("Data", "Input");
  579. ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src);
  580. std::string type = "custom";
  581. bool ret = model_parser.IsOpAttrEmpty(op_src, type);
  582. EXPECT_EQ(ret, true);
  583. type = "built-in";
  584. ret = model_parser.IsOpAttrEmpty(op_src, type);
  585. EXPECT_EQ(ret, true);
  586. }
  587. TEST_F(STestCaffeParser, CaffeModelParser_GetCustomOp_test)
  588. {
  589. CaffeModelParser model_parser;
  590. domi::caffe::NetParameter net;
  591. domi::caffe::LayerParameter *layer = net.add_layer();
  592. layer->set_name("Data");
  593. layer->set_type("Input");
  594. vector<ge::Operator> operators;
  595. ge::OpDescPtr op_desc_src = std::make_shared<ge::OpDesc>("Data", "Input");
  596. ge::Operator op_src = ge::OpDescUtils::CreateOperatorFromOpDesc(op_desc_src);
  597. operators.emplace_back(op_src);
  598. Status ret = model_parser.GetCustomOp(*layer, operators);
  599. EXPECT_EQ(ret, SUCCESS);
  600. }
  601. TEST_F(STestCaffeParser, CaffeModelParser_AddTensorDescToOpDesc_test)
  602. {
  603. CaffeModelParser model_parser;
  604. domi::caffe::NetParameter net;
  605. ge::OpDescPtr op_desc_src = std::make_shared<ge::OpDesc>("Abs", "AbsVal");
  606. domi::caffe::LayerParameter *layer = net.add_layer();
  607. layer->set_name("Abs");
  608. layer->set_type("AbsVal");
  609. layer->add_bottom("Abs");
  610. Status ret = model_parser.AddTensorDescToOpDesc(op_desc_src, *layer);
  611. EXPECT_EQ(ret, SUCCESS);
  612. }
  613. TEST_F(STestCaffeParser, CaffeWeightsParser_ConvertLayerParameter_test)
  614. {
  615. CaffeWeightsParser weightParser;
  616. ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared<ge::ComputeGraph>("tmp_graph");
  617. domi::caffe::NetParameter net;
  618. ge::OpDescPtr op_desc_src = std::make_shared<ge::OpDesc>("Abs", "AbsVal");
  619. domi::caffe::LayerParameter *layer = net.add_layer();
  620. layer->set_name("Abs");
  621. layer->set_type("AbsVal");
  622. Status ret = weightParser.ConvertLayerParameter(layer, compute_graph);
  623. EXPECT_EQ(ret, SUCCESS);
  624. }
  625. TEST_F(STestCaffeParser, CaffeWeightsParser_CheckLayersSize_test)
  626. {
  627. CaffeWeightsParser weightParser;
  628. domi::caffe::NetParameter net;
  629. domi::caffe::LayerParameter *layer = net.add_layer();
  630. layer->set_name("Abs");
  631. layer->set_type("AbsVal");
  632. Status ret = weightParser.CheckLayersSize(layer);
  633. EXPECT_EQ(ret, FAILED);
  634. }
  635. TEST_F(STestCaffeParser, CaffeModelParser_FindShareParamLayers_test)
  636. {
  637. CaffeModelParser modelParser;
  638. std::map<std::string, std::vector<std::string>> layer_params_map;
  639. std::vector<std::string> layer_params;
  640. layer_params.emplace_back("Conv");
  641. layer_params.emplace_back("Data");
  642. layer_params.emplace_back("Abs");
  643. layer_params_map.insert(std::make_pair("Abs", layer_params));
  644. layer_params_map.insert(std::make_pair("Data", layer_params));
  645. layer_params_map.insert(std::make_pair("Conv", layer_params));
  646. Status ret = modelParser.FindShareParamLayers(layer_params_map);
  647. EXPECT_EQ(ret, SUCCESS);
  648. }
  649. TEST_F(STestCaffeParser, CaffeWeightsParser_ParseLayerParameter_test)
  650. {
  651. CaffeWeightsParser weightParser;
  652. domi::caffe::NetParameter net;
  653. GetParserContext().type = domi::CAFFE;
  654. domi::caffe::LayerParameter *layer = net.add_layer();
  655. layer->set_name("Abs");
  656. layer->set_type("AbsVal");
  657. ge::ComputeGraphPtr compute_graph = build_graph(true);
  658. std::string case_dir = __FILE__;
  659. case_dir = case_dir.substr(0, case_dir.find_last_of("/"));
  660. std::string caffe_proto = case_dir + "/../../../metadef/proto/caffe/";
  661. google::protobuf::compiler::DiskSourceTree sourceTree;
  662. sourceTree.MapPath("project_root", caffe_proto);
  663. google::protobuf::compiler::Importer importer(&sourceTree, nullptr);
  664. importer.Import("project_root/caffe.proto");
  665. auto descriptor = importer.pool()->FindMessageTypeByName("domi.caffe.LayerParameter");
  666. google::protobuf::DynamicMessageFactory factory;
  667. const google::protobuf::Message *proto = factory.GetPrototype(descriptor);
  668. const google::protobuf::Message *message = proto->New();
  669. Status ret = weightParser.ParseLayerParameter(descriptor, message, compute_graph);
  670. delete message;
  671. EXPECT_EQ(ret, SUCCESS);
  672. }
  673. } // namespace ge