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 31 kB

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