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.

caffe_parser.cc 109 kB

5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
4 years ago
4 years ago
5 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
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
3 years ago
5 years ago
3 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
3 years ago
5 years ago
5 years ago
5 years ago
5 years ago
3 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351
  1. /**
  2. * Copyright (c) Huawei Technologies Co., Ltd. 2020~2022. All rights reserved.
  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 "parser/caffe/caffe_parser.h"
  17. #include <fstream>
  18. #include <iostream>
  19. #include <sstream>
  20. #include <memory>
  21. #include <algorithm>
  22. #include <google/protobuf/compiler/importer.h>
  23. #include <google/protobuf/descriptor.h>
  24. #include <google/protobuf/dynamic_message.h>
  25. #include <google/protobuf/io/coded_stream.h>
  26. #include <google/protobuf/io/zero_copy_stream_impl.h>
  27. #include <google/protobuf/text_format.h>
  28. #include "common/convert/message2operator.h"
  29. #include "parser/common/convert/pb2json.h"
  30. #include "parser/common/acl_graph_parser_util.h"
  31. #include "common/op_map.h"
  32. #include "common/util/error_manager/error_manager.h"
  33. #include "common/string_util.h"
  34. #include "external/graph/operator_factory.h"
  35. #include "external/parser/caffe_parser.h"
  36. #include "external/ge/ge_api_types.h"
  37. #include "framework/common/debug/ge_log.h"
  38. #include "graph/utils/graph_utils.h"
  39. #include "omg/parser/op_parser.h"
  40. #include "omg/parser/parser_factory.h"
  41. #include "omg/parser/parser_inner_ctx.h"
  42. #include "parser/caffe/caffe_custom_parser_adapter.h"
  43. #include "parser/caffe/caffe_op_parser.h"
  44. #include "parser/common/op_parser_factory.h"
  45. #include "parser/common/prototype_pass_manager.h"
  46. #include "framework/omg/parser/parser_types.h"
  47. #include "parser/common/model_saver.h"
  48. #include "parser/common/acl_graph_parser_util.h"
  49. #include "parser/common/proto_file_parser.h"
  50. #include "register/op_registry.h"
  51. #include "register/register_fmk_types.h"
  52. #include "mmpa/mmpa_api.h"
  53. #include "parser/common/parser_utils.h"
  54. using domi::caffe::ConvolutionParameter;
  55. using domi::caffe::InnerProductParameter;
  56. using domi::caffe::LayerParameter;
  57. using domi::caffe::NetParameter;
  58. using domi::ParseParamByOpFunc;
  59. using ge::parser::ModelSaver;
  60. using std::ifstream;
  61. #define CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(val, errormsg) \
  62. do { \
  63. if ((val) == nullptr) { \
  64. GELOGE(ge::PARAM_INVALID, errormsg); \
  65. REPORT_INNER_ERROR("E19999", errormsg); \
  66. return ge::PARAM_INVALID; \
  67. } \
  68. } while (0)
  69. namespace {
  70. const size_t kMaxErrStrLen = 128U;
  71. std::map<std::vector<std::string>, std::vector<std::string>> params_share_map;
  72. } // namespace
  73. namespace ge {
  74. graphStatus aclgrphParseCaffe(const char *model_file, const char *weights_file, ge::Graph &graph) {
  75. ErrorManager::GetInstance().SetStage(error_message::kModelCompile, error_message::kParser);
  76. GE_CHECK_NOTNULL(model_file);
  77. GetParserContext().type = domi::CAFFE;
  78. std::map<string, string> options;
  79. options.insert(std::pair<string, string>(string(ge::FRAMEWORK_TYPE), to_string(domi::CAFFE)));
  80. // load custom plugin so and proto
  81. AclGrphParseUtil acl_graph_parse_util;
  82. domi::Status status = acl_graph_parse_util.AclParserInitialize(options);
  83. if (status != domi::SUCCESS) {
  84. REPORT_CALL_ERROR("E19999", "AclParserInitialize failed, ret:%d.", status);
  85. GELOGE(GRAPH_FAILED, "[Parser][Initialize] failed, ret:%d.", status);
  86. return GRAPH_FAILED;
  87. }
  88. // Create an empty computegraph
  89. ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared<ge::ComputeGraph>("tmpGraph");
  90. GE_CHECK_NOTNULL(compute_graph);
  91. graph = ge::GraphUtils::CreateGraphFromComputeGraph(compute_graph);
  92. auto model_parser = domi::ModelParserFactory::Instance()->CreateModelParser(domi::CAFFE);
  93. GE_CHECK_NOTNULL(model_parser);
  94. // parse caffe model_file and weights_file to GE graph
  95. ge::graphStatus ret = model_parser->Parse(model_file, graph);
  96. if (ret != ge::SUCCESS) {
  97. REPORT_CALL_ERROR("E19999", "parse param:model_file %s failed, graph:%s.",
  98. model_file, ParserUtils::GetGraphName(graph).c_str());
  99. GELOGE(ret, "[Parser][Param]ModelFile %s failed, graph:%s.", model_file,
  100. ParserUtils::GetGraphName(graph).c_str());
  101. return ge::FAILED;
  102. }
  103. GELOGI("Parser graph %s success.", ParserUtils::GetGraphName(graph).c_str());
  104. auto weights_parser = domi::WeightsParserFactory::Instance()->CreateWeightsParser(domi::CAFFE);
  105. GE_CHECK_NOTNULL(weights_parser);
  106. ret = weights_parser->Parse(weights_file, graph);
  107. if (ret != ge::SUCCESS) {
  108. REPORT_CALL_ERROR("E19999", "parse param:weights_file %s failed, graph:%s",
  109. weights_file, ParserUtils::GetGraphName(graph).c_str());
  110. GELOGE(ret, "[Parse][Param]WeightsFile %s failed. graph: %s", weights_file,
  111. ParserUtils::GetGraphName(graph).c_str());
  112. return ret;
  113. }
  114. GELOGI("Weights parse success. graph: %s", ParserUtils::GetGraphName(graph).c_str());
  115. std::map<AscendString, AscendString> parser_params;
  116. if (acl_graph_parse_util.SetOutputNodeInfo(graph, parser_params) != ge::SUCCESS) {
  117. REPORT_CALL_ERROR("E19999", "SetOutputNodeInfo failed, model file:%s graph:%s",
  118. model_file, ParserUtils::GetGraphName(graph).c_str());
  119. GELOGE(ret, "[Invoke][SetOutputNodeInfo]Set graph %s default output node failed, model file:%s.",
  120. ParserUtils::GetGraphName(graph).c_str(), model_file);
  121. return ge::FAILED;
  122. }
  123. return ge::SUCCESS;
  124. }
  125. graphStatus aclgrphParseCaffe(const char *model_file, const char *weights_file,
  126. const std::map<AscendString, AscendString> &parser_params, ge::Graph &graph) {
  127. ErrorManager::GetInstance().SetStage(error_message::kModelCompile, error_message::kParser);
  128. GE_CHECK_NOTNULL(model_file);
  129. GetParserContext().type = domi::CAFFE;
  130. std::map<string, string> options;
  131. options.insert(std::pair<string, string>(string(ge::FRAMEWORK_TYPE), to_string(domi::CAFFE)));
  132. // load custom plugin so and proto
  133. AclGrphParseUtil acl_graph_parse_util;
  134. domi::Status status = acl_graph_parse_util.AclParserInitialize(options);
  135. if (status != domi::SUCCESS) {
  136. REPORT_CALL_ERROR("E19999", "AclParserInitialize failed, ret:%d.", status);
  137. GELOGE(GRAPH_FAILED, "[Parser][Initialize] failed ret:%d.", status);
  138. return GRAPH_FAILED;
  139. }
  140. string output_name;
  141. if (acl_graph_parse_util.ParseParamsBeforeGraph(parser_params, output_name) != ge::SUCCESS) {
  142. GELOGE(ge::FAILED, "[Parse][Params]Before Graph failed.");
  143. return ge::FAILED;
  144. }
  145. // Create an empty computegraph
  146. string graph_name = output_name.empty() ? "tmpGraph" : output_name;
  147. ge::ComputeGraphPtr compute_graph = ge::parser::MakeShared<ge::ComputeGraph>(graph_name);
  148. GE_CHECK_NOTNULL(compute_graph);
  149. graph = ge::GraphUtils::CreateGraphFromComputeGraph(compute_graph);
  150. auto model_parser = domi::ModelParserFactory::Instance()->CreateModelParser(domi::CAFFE);
  151. GE_CHECK_NOTNULL(model_parser);
  152. // parse caffe model_file and weights_file to GE graph
  153. ge::graphStatus ret = model_parser->Parse(model_file, graph);
  154. if (ret != ge::SUCCESS) {
  155. REPORT_CALL_ERROR("E19999", "Parse param:model_file %s failed, graph:%s",
  156. model_file, ParserUtils::GetGraphName(graph).c_str());
  157. GELOGE(ret, "[Parser][Param]ModelFile %s failed, graph %s.",
  158. model_file, ParserUtils::GetGraphName(graph).c_str());
  159. return ge::FAILED;
  160. }
  161. GELOGI("Parser graph %s success.", ParserUtils::GetGraphName(graph).c_str());
  162. if (acl_graph_parse_util.ParseParamsAfterGraph(graph, parser_params) != ge::SUCCESS) {
  163. REPORT_CALL_ERROR("E19999", "ParseParamsAfterGraph failed, graph:%s.", ParserUtils::GetGraphName(graph).c_str());
  164. GELOGE(ge::FAILED, "[Parser][Params] after graph failed, graph:%s.", ParserUtils::GetGraphName(graph).c_str());
  165. return ge::FAILED;
  166. }
  167. auto weights_parser = domi::WeightsParserFactory::Instance()->CreateWeightsParser(domi::CAFFE);
  168. GE_CHECK_NOTNULL(weights_parser);
  169. ret = weights_parser->Parse(weights_file, graph);
  170. if (ret != ge::SUCCESS) {
  171. REPORT_CALL_ERROR("E19999", "parse param:weights_file %s failed, graph: %s",
  172. weights_file, ParserUtils::GetGraphName(graph).c_str());
  173. GELOGE(ret, "[Parse][Param]WeightsFile %s failed. graph: %s",
  174. weights_file, ParserUtils::GetGraphName(graph).c_str());
  175. return ret;
  176. }
  177. GELOGI("Weights parse success. graph: %s", ParserUtils::GetGraphName(graph).c_str());
  178. if (acl_graph_parse_util.SetOutputNodeInfo(graph, parser_params) != ge::SUCCESS) {
  179. REPORT_CALL_ERROR("E19999", "SetOutputNodeInfo failed, graph:%s", ParserUtils::GetGraphName(graph).c_str());
  180. GELOGE(ge::FAILED, "[Invoke][SetOutputNodeInfo]Set graph %s default output node failed.",
  181. ParserUtils::GetGraphName(graph).c_str());
  182. return ge::FAILED;
  183. }
  184. GELOGI("AclgrphParse graph %s success.", ParserUtils::GetGraphName(graph).c_str());
  185. return ge::SUCCESS;
  186. }
  187. } // namespace ge
  188. namespace ge {
  189. namespace {
  190. const int32_t kAnchorIndexOne = 1;
  191. const int32_t kAnchorIndexTwo = 2;
  192. const int32_t kAnchorIndexThree = 3;
  193. const int32_t kNumOne = 1;
  194. const size_t kTensorNum = 2;
  195. const int32_t kMinLineWorldSize = 3;
  196. const int32_t kMaxIdentifier = 536870911; // 2^29 - 1
  197. const int32_t kBase = 10;
  198. const char *const kPython = "Python";
  199. const char *const kProposalLayer = "ProposalLayer";
  200. const char *const kDetectionOutput = "DetectionOutput";
  201. const char *const kProjectRoot = "project_root";
  202. const char *const kBeginningMessageType = "domi.caffe.NetParameter";
  203. const char *const kLayerMessageType = "domi.caffe.LayerParameter";
  204. const char *const kLayerName = "layer";
  205. const char *const kLayersName = "layers";
  206. const char *const kFieldName = "name";
  207. const char *const kFieldType = "type";
  208. const char *const kFieldBottom = "bottom";
  209. const char *const kFieldTop = "top";
  210. const char *const kFieldBlobs = "blobs";
  211. const char *const kFieldShape = "shape";
  212. const char *const kFieldConvParam = "convolution_param";
  213. const char *const kFieldInnerPro = "inner_product_param";
  214. const char *const kFieldDim = "dim";
  215. const char *const kFieldBiasTerm = "bias_term";
  216. const char *const kDevNull = "/dev/null";
  217. const char *const kCustom = "custom";
  218. const char *const kBuiltin = "built-in";
  219. std::vector<std::string> kAddTensorIrSkipNodes = {ge::parser::DATA, ge::parser::YOLODETECTIONOUTPUT,
  220. ge::parser::NETOUTPUT};
  221. const std::set<std::string> kCustomProtoLayerCommonField = {"name", "type"};
  222. const std::set<std::string> kCaffeProtoLayerCommonField = {"name", "type", "bottom", "top", "phase",
  223. "loss_weight", "param", "blobs", "propagate_down",
  224. "include", "exclude"};
  225. Status CheckPathValid(const char *model_path, const string &custom_proto, string &custom_proto_path,
  226. string &custom_proto_name) {
  227. string path_model = ge::parser::RealPath(model_path);
  228. if (path_model.empty()) {
  229. char_t err_buf[kMaxErrStrLen + 1U] = {};
  230. const auto err_msg = mmGetErrorFormatMessage(mmGetErrorCode(), &err_buf[0], kMaxErrStrLen);
  231. ErrorManager::GetInstance().ATCReportErrMessage("E19000", {"path", "errmsg"}, {model_path, err_msg});
  232. GELOGE(FAILED, "[Check][Param]ModelPath %s is Invalid path of model", model_path);
  233. return FAILED;
  234. }
  235. custom_proto_name = kProjectRoot;
  236. auto pos = custom_proto.find_last_of("/\\");
  237. if (pos == string::npos) {
  238. custom_proto_path = "./";
  239. custom_proto_name += '/' + custom_proto;
  240. } else {
  241. custom_proto_path = custom_proto.substr(0, pos);
  242. custom_proto_name += '/' + custom_proto.substr(pos + 1);
  243. }
  244. GELOGI("Check validity of model file: %s and proto file: %s success.", model_path, custom_proto.c_str());
  245. return SUCCESS;
  246. }
  247. } // namespace
  248. /*
  249. MultiLabelLMDB?The negligible layer for weight analysis in license plate recognition network of Safe city.
  250. Python: Currently, python custom layer only supports proposal,
  251. and there is no corresponding data in the proposal weight file, so Python layer is ignored.
  252. */
  253. const set<string> CaffeWeightsParser::skiped_layer_type_ = {"Split", "SoftmaxWithLoss", "Accuracy", "Data",
  254. "Dropout", "MultiLabelLMDB", "Python", "AnnotatedData"};
  255. Status CaffeModelParser::ParseInput(domi::caffe::NetParameter &proto_message, bool &input_data_flag) const {
  256. if (proto_message.input_size() <= 0) {
  257. return SUCCESS;
  258. }
  259. GELOGI("This net exsit input.");
  260. if (proto_message.input_dim_size() > 0) {
  261. if (proto_message.input_shape_size() > 0) {
  262. ErrorManager::GetInstance().ATCReportErrMessage("E11001");
  263. GELOGE(FAILED, "[Check][Size]input_dim and input_shape can not both exist!");
  264. return FAILED;
  265. }
  266. const int32_t input_dim_size = proto_message.input_dim_size();
  267. const bool is_input_invalid = (((input_dim_size / proto_message.input_size()) != parser::DIM_DEFAULT_SIZE) ||
  268. ((input_dim_size % proto_message.input_size()) != 0));
  269. if (is_input_invalid) {
  270. ErrorManager::GetInstance().ATCReportErrMessage("E11003", {"input_dim_size", "input_size"},
  271. {std::to_string(input_dim_size), std::to_string(proto_message.input_size())});
  272. GELOGE(FAILED, "[Check][Size]Model input_dim size[%d] is not 4 times of input size[%d].",
  273. input_dim_size, proto_message.input_size());
  274. return FAILED;
  275. }
  276. for (int i = 0; i < proto_message.input_size(); i++) {
  277. domi::caffe::LayerParameter *layer = proto_message.add_layer();
  278. GE_CHECK_NOTNULL(layer);
  279. layer->set_name(proto_message.input(i));
  280. layer->set_type(ge::parser::INPUT_TYPE);
  281. layer->add_top(proto_message.input(i));
  282. domi::caffe::InputParameter *input_param = layer->mutable_input_param();
  283. GE_CHECK_NOTNULL(input_param);
  284. domi::caffe::BlobShape *shape = input_param->add_shape();
  285. GE_CHECK_NOTNULL(shape);
  286. for (int j = 0; j < parser::DIM_DEFAULT_SIZE; j++) {
  287. // Can guarantee that it will not cross the border
  288. shape->add_dim(static_cast<int64_t>(proto_message.input_dim(j + i * parser::DIM_DEFAULT_SIZE)));
  289. }
  290. input_data_flag = true;
  291. }
  292. } else if (proto_message.input_shape_size() > 0) {
  293. if (proto_message.input_shape_size() != proto_message.input_size()) {
  294. ErrorManager::GetInstance().ATCReportErrMessage("E11004", {"input_shape_size", "input_size"},
  295. {std::to_string(proto_message.input_shape_size()),
  296. std::to_string(proto_message.input_size())});
  297. GELOGE(FAILED, "[Check][Size]caffe net input_shape size(%d) is not equal input size(%d).",
  298. proto_message.input_shape_size(), proto_message.input_size());
  299. return FAILED;
  300. }
  301. for (int i = 0; i < proto_message.input_size(); i++) {
  302. int dim_size = proto_message.input_shape(i).dim_size();
  303. domi::caffe::LayerParameter *layer = proto_message.add_layer();
  304. GE_CHECK_NOTNULL(layer);
  305. layer->set_name(proto_message.input(i));
  306. layer->set_type(ge::parser::INPUT_TYPE);
  307. layer->add_top(proto_message.input(i));
  308. domi::caffe::InputParameter *input_param = layer->mutable_input_param();
  309. GE_CHECK_NOTNULL(input_param);
  310. domi::caffe::BlobShape *shape = input_param->add_shape();
  311. GE_CHECK_NOTNULL(shape);
  312. for (int j = 0; j < dim_size; j++) {
  313. // Can guarantee that it will not cross the border
  314. shape->add_dim(static_cast<int64_t>(proto_message.input_shape(i).dim(j)));
  315. }
  316. input_data_flag = true;
  317. }
  318. } else {
  319. const ge::ParserContext &ctx = ge::GetParserContext();
  320. std::map<std::string, std::vector<int64_t>> input_dims = ctx.input_dims;
  321. for (int i = 0; i < proto_message.input_size(); i++) {
  322. string name = proto_message.input(i);
  323. if (input_dims.count(name) == 0) { // Input defined by model does not exist in input of external input
  324. REPORT_INPUT_ERROR("E11005", std::vector<std::string>({"input"}), std::vector<std::string>({name}));
  325. GELOGE(FAILED, "[Find][Dim]Model has no input shape.");
  326. return FAILED;
  327. }
  328. std::vector<int64_t> dims = input_dims.at(name);
  329. size_t dim_size = dims.size();
  330. domi::caffe::LayerParameter *layer = proto_message.add_layer();
  331. GE_CHECK_NOTNULL(layer);
  332. layer->set_name(name);
  333. layer->set_type(ge::parser::INPUT_TYPE);
  334. layer->add_top(proto_message.input(i));
  335. domi::caffe::InputParameter *input_param = layer->mutable_input_param();
  336. GE_CHECK_NOTNULL(input_param);
  337. domi::caffe::BlobShape *shape = input_param->add_shape();
  338. GE_CHECK_NOTNULL(shape);
  339. for (size_t j = 0; j < dim_size; j++) {
  340. shape->add_dim(dims.at(j));
  341. }
  342. input_data_flag = true;
  343. }
  344. }
  345. return SUCCESS;
  346. }
  347. Status CaffeModelParser::ParseNetModelByCustomProto(const char *model_path, const string &custom_proto_path,
  348. const string &custom_proto_name,
  349. vector<ge::Operator> &operators) const {
  350. google::protobuf::compiler::DiskSourceTree source_tree;
  351. source_tree.MapPath(kProjectRoot, custom_proto_path);
  352. google::protobuf::compiler::Importer importer(&source_tree, nullptr);
  353. importer.Import(custom_proto_name.c_str());
  354. GELOGI("Import custom proto %s success.", custom_proto_path.c_str());
  355. const google::protobuf::Descriptor *descriptor = importer.pool()->FindMessageTypeByName(kBeginningMessageType);
  356. GE_CHECK_NOTNULL(descriptor);
  357. google::protobuf::DynamicMessageFactory factory;
  358. const google::protobuf::Message *proto = factory.GetPrototype(descriptor);
  359. GE_CHECK_NOTNULL(proto);
  360. google::protobuf::Message *message = proto->New();
  361. GE_CHECK_NOTNULL(message);
  362. if (ReadModelWithoutWarning(model_path, message) != SUCCESS) {
  363. delete message;
  364. GELOGE(FAILED, "[Invoke][ReadModelWithoutWarning] %s failed.", model_path);
  365. return FAILED;
  366. }
  367. GELOGI("Start to parse model file: %s.", model_path);
  368. const google::protobuf::Descriptor *layer_descriptor = importer.pool()->FindMessageTypeByName(kLayerMessageType);
  369. if (layer_descriptor == nullptr) {
  370. delete message;
  371. REPORT_INPUT_ERROR("E11032", std::vector<std::string>({"message_type", "name", "reason"}),
  372. std::vector<std::string>({"model", "LayerParameter",
  373. "Does not find domi.caffe.LayerParameter in google::protobuf::Descriptor"}));
  374. GELOGE(FAILED, "[Invoke][FindMessageTypeByName]Does not find domi.caffe.LayerParameter"
  375. "in google::protobuf::Descriptor");
  376. return FAILED;
  377. }
  378. if (ParseLayerParameter(*layer_descriptor, *message, operators) != SUCCESS) {
  379. delete message;
  380. GELOGE(FAILED, "[Parse][LayerParameter] failed, model path:%s.", model_path);
  381. return FAILED;
  382. }
  383. delete message;
  384. GELOGI("Parse model: %s by proto: %s success.", model_path, custom_proto_path.c_str());
  385. return SUCCESS;
  386. }
  387. Status CaffeModelParser::CustomProtoParse(const char *model_path, const string &custom_proto,
  388. const string &caffe_proto, vector<ge::Operator> &operators) {
  389. (void)caffe_proto;
  390. string custom_proto_path = ge::parser::RealPath(custom_proto.c_str());
  391. if (custom_proto_path.empty()) {
  392. GELOGW("Valid custom proto: %s does not exist, skip parsing custom proto", custom_proto.c_str());
  393. return SUCCESS;
  394. }
  395. string custom_proto_name;
  396. if (CheckPathValid(model_path, custom_proto, custom_proto_path, custom_proto_name) != SUCCESS) {
  397. GELOGE(FAILED, "[Check][PathValid] of model and proto failed, path:%s.", model_path);
  398. return FAILED;
  399. }
  400. GELOGI("Start to parse model: %s by custom proto: %s.", model_path, custom_proto.c_str());
  401. Status ret = ParseNetModelByCustomProto(model_path, custom_proto_path, custom_proto_name, operators);
  402. if (ret != SUCCESS) {
  403. GELOGE(FAILED, "[Parse][NetModel]By CustomProto failed, path:%s.", model_path);
  404. }
  405. return ret;
  406. }
  407. Status CaffeModelParser::ReadModelWithoutWarning(const char *model_path, google::protobuf::Message *message) const {
  408. int32_t copy_fd = mmDup(STDERR_FILENO);
  409. if (copy_fd < 0) {
  410. char_t err_buf[kMaxErrStrLen + 1U] = {};
  411. const auto err_msg = mmGetErrorFormatMessage(mmGetErrorCode(), &err_buf[0], kMaxErrStrLen);
  412. REPORT_CALL_ERROR("E19999", "Duplicate to file STDERR_FILENO failed, errmsg:%s", err_msg);
  413. GELOGE(FAILED, "[Invoke][Dup] failed:%d, reason:%s", copy_fd, err_msg);
  414. return FAILED;
  415. }
  416. int32_t fd = mmOpen(kDevNull, M_RDWR);
  417. if (fd < 0) {
  418. (void)mmClose(copy_fd);
  419. char_t err_buf[kMaxErrStrLen + 1U] = {};
  420. const auto err_msg = mmGetErrorFormatMessage(mmGetErrorCode(), &err_buf[0], kMaxErrStrLen);
  421. ErrorManager::GetInstance().ATCReportErrMessage("E19001", {"file", "errmsg"}, {kDevNull, err_msg});
  422. GELOGE(FAILED, "[Open][File] %s failed. reason:%s", kDevNull, err_msg);
  423. return FAILED;
  424. }
  425. if (mmDup2(fd, STDERR_FILENO) < 0) {
  426. (void)mmClose(fd);
  427. (void)mmClose(copy_fd);
  428. char_t err_buf[kMaxErrStrLen + 1U] = {};
  429. const auto err_msg = mmGetErrorFormatMessage(mmGetErrorCode(), &err_buf[0], kMaxErrStrLen);
  430. REPORT_CALL_ERROR("E19999", "Duplicate to file STDERR_FILENO failed, errmsg:%s", err_msg);
  431. GELOGE(FAILED, "[Invoke][Dup2] Re-orient failed. reason:%s", err_msg);
  432. return FAILED;
  433. }
  434. if (ReadCaffeModelFromText(model_path, message) != SUCCESS) {
  435. (void)mmClose(fd);
  436. (void)mmClose(copy_fd);
  437. GELOGE(FAILED, "[Read][CaffeModel] From Text %s failed.", model_path);
  438. return FAILED;
  439. }
  440. if (mmDup2(copy_fd, STDERR_FILENO) < 0) {
  441. (void)mmClose(fd);
  442. (void)mmClose(copy_fd);
  443. char_t err_buf[kMaxErrStrLen + 1U] = {};
  444. const auto err_msg = mmGetErrorFormatMessage(mmGetErrorCode(), &err_buf[0], kMaxErrStrLen);
  445. REPORT_CALL_ERROR("E19999", "Duplicate to file STDERR_FILENO failed, errmsg:%s", err_msg);
  446. GELOGE(FAILED, "[Invoke][Dup2] Re-orient failed. reason:%s", err_msg);
  447. return FAILED;
  448. }
  449. (void)mmClose(fd);
  450. (void)mmClose(copy_fd);
  451. return SUCCESS;
  452. }
  453. Status CaffeModelParser::ReadCaffeModelFromText(const char *model_path, google::protobuf::Message *message) const {
  454. GE_CHECK_NOTNULL(model_path);
  455. GE_CHECK_NOTNULL(message);
  456. GELOGI("Start to read model file: %s.", model_path);
  457. std::ifstream fs(model_path, std::ifstream::in);
  458. if (!fs.is_open()) {
  459. ErrorManager::GetInstance().ATCReportErrMessage("E19001", {"file", "errmsg"}, {model_path, "ifstream open failed"});
  460. GELOGE(FAILED, "[Open][File] %s failed.", model_path);
  461. return FAILED;
  462. }
  463. google::protobuf::io::IstreamInputStream input(&fs);
  464. google::protobuf::TextFormat::Parser model_parser;
  465. model_parser.AllowUnknownField(true);
  466. if (!model_parser.Parse(&input, message)) {
  467. fs.close();
  468. ErrorManager::GetInstance().ATCReportErrMessage("E19005", {"file"}, {model_path});
  469. GELOGE(FAILED, "[Parse][ModelFile] %s failed.", model_path);
  470. return FAILED;
  471. }
  472. fs.close();
  473. GELOGI("Read model file: %s success.", model_path);
  474. return SUCCESS;
  475. }
  476. Status CaffeModelParser::ParseLayerParameter(const google::protobuf::Descriptor &layer_descriptor,
  477. const google::protobuf::Message &message,
  478. vector<ge::Operator> &operators) const {
  479. auto field_name = layer_descriptor.FindFieldByName(kFieldName);
  480. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(field_name, "Does not find name in google::protobuf::Descriptor");
  481. auto field_type = layer_descriptor.FindFieldByName(kFieldType);
  482. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(field_type, "Does not find type in google::protobuf::Descriptor");
  483. const google::protobuf::Reflection *reflection = message.GetReflection();
  484. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(reflection, "Get Reflection failed in google::protobuf::Message");
  485. vector<const google::protobuf::FieldDescriptor *> field_desc;
  486. reflection->ListFields(message, &field_desc);
  487. for (auto &field : field_desc) {
  488. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(field, "Get FieldDescriptor failed in google::protobuf::Message");
  489. // Only care about layers
  490. if (field->name() != kLayerName) {
  491. continue;
  492. }
  493. if (!field->is_repeated()) {
  494. REPORT_INPUT_ERROR("E11032", std::vector<std::string>({"message_type", "name", "reason"}),
  495. std::vector<std::string>({"model", field->name(), "LayerParameter should be repeated"}));
  496. GELOGE(FAILED, "[Check][Param] LayerParameter should be repeated.");
  497. return FAILED;
  498. }
  499. int field_size = reflection->FieldSize(message, field);
  500. GELOGI("Total Layer num of model file is %d", field_size);
  501. for (int i = 0; i < field_size; ++i) {
  502. const google::protobuf::Message &layer_message = reflection->GetRepeatedMessage(message, field, i);
  503. const google::protobuf::Reflection *layer_reflection = layer_message.GetReflection();
  504. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(layer_reflection, "Get Reflection failed in google::protobuf::Message");
  505. GE_CHECK_NOTNULL(layer_reflection);
  506. string op_name = layer_reflection->GetString(layer_message, field_name);
  507. string op_type = layer_reflection->GetString(layer_message, field_type);
  508. if (domi::OpRegistry::Instance()->GetParseParamByOperatorFunc(op_type) == nullptr) {
  509. continue;
  510. }
  511. if (CreateCustomOperator(op_name, op_type, &layer_message, i, operators) != SUCCESS) {
  512. GELOGE(FAILED, "[Create][CustomOperator] failed, name: %s, type: %s.", op_name.c_str(), op_type.c_str());
  513. return FAILED;
  514. }
  515. }
  516. }
  517. return SUCCESS;
  518. }
  519. Status CaffeModelParser::CreateCustomOperator(string op_name, string op_type, const google::protobuf::Message *message,
  520. int index, vector<ge::Operator> &operators) const {
  521. if (op_name.empty() || op_type.empty()) {
  522. REPORT_INNER_ERROR("E19999", "[Check][Param]Name or type of layer is empty, name: %s, type: %s.",
  523. op_name.c_str(), op_type.c_str());
  524. GELOGE(FAILED, "[Check][Param]Name or type of layer is empty, name: %s, type: %s.",
  525. op_name.c_str(), op_type.c_str());
  526. return FAILED;
  527. }
  528. GELOGI("Start to create new operator, name: %s, type: %s, index: %d.", op_name.c_str(), op_type.c_str(), index);
  529. ge::Operator ops(op_name.c_str(), op_type.c_str());
  530. if (ParserUtils::GetOperatorName(ops) != op_name) {
  531. REPORT_INNER_ERROR("E19999", "Create Operator failed, name: %s, type: %s, index: %d.",
  532. op_name.c_str(), op_type.c_str(), index);
  533. GELOGE(FAILED, "[Create][Operator] failed, name: %s, type: %s, index: %d.",
  534. op_name.c_str(), op_type.c_str(), index);
  535. return FAILED;
  536. }
  537. if (Message2Operator::ParseOperatorAttrs(message, 1, ops) != SUCCESS) {
  538. GELOGE(FAILED, "[Parse][OperatorAttrs] of %s failed.", op_name.c_str());
  539. return FAILED;
  540. }
  541. operators.emplace_back(ops);
  542. GELOGI("Create new operator success, name: %s, type: %s, index: %d.", op_name.c_str(), op_type.c_str(), index);
  543. return SUCCESS;
  544. }
  545. void CaffeModelParser::AddOutputInfoToContext(string layer_name, int32_t top_index) const {
  546. auto iter_node_name = ge::GetParserContext().out_nodes_map.find(layer_name);
  547. if (iter_node_name != ge::GetParserContext().out_nodes_map.end()) {
  548. iter_node_name->second.emplace_back(top_index);
  549. } else {
  550. std::vector<int32_t> index_v;
  551. index_v.emplace_back(top_index);
  552. ge::GetParserContext().out_nodes_map.emplace(layer_name, index_v);
  553. }
  554. ge::GetParserContext().user_out_nodes.push_back(std::make_pair(layer_name, top_index));
  555. }
  556. Status CaffeModelParser::ParseOutputNodeTopInfo(const domi::caffe::NetParameter &proto_message) const {
  557. if (ge::GetParserContext().user_out_tensors.empty()) {
  558. return SUCCESS;
  559. }
  560. ge::GetParserContext().out_nodes_map.clear();
  561. ge::GetParserContext().user_out_nodes.clear();
  562. int32_t layer_count = proto_message.layer_size();
  563. const std::vector<string> &user_out_tensors =
  564. ge::GetParserContext().user_out_tensors;
  565. for (const auto &top_name : user_out_tensors) {
  566. bool find_node_falg = false;
  567. string layer_name;
  568. int32_t top_index = 0;
  569. for (int32_t i = layer_count - 1; i >= 0; --i) {
  570. domi::caffe::LayerParameter &layer =
  571. const_cast<domi::caffe::LayerParameter &>(proto_message.layer(i));
  572. for (int j = 0; j < layer.top_size(); ++j) {
  573. string top_blob_name = layer.top(j);
  574. if (top_blob_name != top_name) {
  575. continue;
  576. }
  577. find_node_falg = true;
  578. layer_name.assign(layer.name());
  579. top_index = static_cast<int32_t>(j);
  580. break;
  581. }
  582. if (find_node_falg) {
  583. break;
  584. }
  585. }
  586. if (!find_node_falg || layer_name.empty()) {
  587. REPORT_INPUT_ERROR("E11017", std::vector<std::string>({"opname"}), std::vector<std::string>({top_name}));
  588. GELOGE(PARAM_INVALID, "[Check][Param]Cannot find top_name[%s], which is invalid", top_name.c_str());
  589. return PARAM_INVALID;
  590. }
  591. GELOGD("Node[%s] find top_name[%s], top_index[%d]", layer_name.c_str(), top_name.c_str(), top_index);
  592. AddOutputInfoToContext(layer_name, top_index);
  593. }
  594. return SUCCESS;
  595. }
  596. Status CaffeModelParser::AddBlobsToMap(const domi::caffe::LayerParameter &layer,
  597. std::map<std::string, std::string> &inplace_blob_name_remapping) {
  598. if (layer.top_size() <= 0) {
  599. ErrorManager::GetInstance().ATCReportErrMessage("E11037", {"opname"}, {layer.name()});
  600. GELOGE(FAILED, "[Check][Size]The output size of layer %s needs to be greater than zero.", layer.name().c_str());
  601. return FAILED;
  602. }
  603. // Need to check if the input is the output of 'inplace'
  604. for (int i = 0; i < layer.bottom_size(); ++i) {
  605. std::string blob_name = layer.bottom(i);
  606. auto iter = inplace_blob_name_remapping.find(blob_name);
  607. if (iter != inplace_blob_name_remapping.end()) {
  608. blob_name = iter->second;
  609. }
  610. bottom_blobs_map_[blob_name].emplace_back(std::make_pair(layer.name(), i));
  611. }
  612. // Handling 'inplace' scenarios
  613. for (int j = 0; j < layer.top_size(); ++j) {
  614. std::string top_blob_name = layer.top(j);
  615. if (IsInplaceTopBlob(layer, top_blob_name)) {
  616. std::string remapped_blob_name = RemapTopNameByLayer(layer, top_blob_name, j);
  617. inplace_blob_name_remapping[top_blob_name] = remapped_blob_name;
  618. top_blob_name = remapped_blob_name;
  619. }
  620. top_blobs_map_[top_blob_name].emplace_back(std::make_pair(layer.name(), j));
  621. }
  622. return SUCCESS;
  623. }
  624. bool CaffeModelParser::IsOpAttrEmpty(const ge::Operator &op, const std::string &type) const {
  625. std::map<AscendString, AscendString> attrs;
  626. (void)op.GetAllAttrNamesAndTypes(attrs);
  627. if (type == kCustom) {
  628. for (const auto &attr : attrs) {
  629. if (kCustomProtoLayerCommonField.count(attr.first.GetString()) == 0) {
  630. GELOGI("Custom op[%s] attr name[%s] exists, not empty.",
  631. ParserUtils::GetOperatorName(op).c_str(), attr.first.GetString());
  632. return false;
  633. }
  634. }
  635. } else if (type == kBuiltin) {
  636. for (const auto &attr : attrs) {
  637. if (kCaffeProtoLayerCommonField.count(attr.first.GetString()) == 0) {
  638. GELOGI("Built-in op[%s] attr name[%s] exists, not empty.",
  639. ParserUtils::GetOperatorName(op).c_str(), attr.first.GetString());
  640. return false;
  641. }
  642. }
  643. }
  644. return true;
  645. }
  646. Status CaffeModelParser::GetCustomOp(const domi::caffe::LayerParameter &layer, vector<ge::Operator> &operators) {
  647. string op_type = layer.type();
  648. string op_name = layer.name();
  649. bool is_search_built_in_layer = false;
  650. for (ge::Operator &custom_op : custom_operator_) {
  651. if (ParserUtils::GetOperatorName(custom_op) == layer.name() && ParserUtils::GetOperatorType(custom_op) == op_type) {
  652. if (IsOpAttrEmpty(custom_op, kCustom)) {
  653. GELOGW("Custom op attr is empty, should try to get op params from built-in layer.");
  654. is_search_built_in_layer = true;
  655. } else {
  656. operators.emplace_back(custom_op);
  657. GELOGI("Find custom op success.");
  658. return SUCCESS;
  659. }
  660. break;
  661. }
  662. }
  663. if (custom_operator_.empty()) {
  664. GELOGW("Custom operator is empty, should try to get op params from built-in layer.");
  665. is_search_built_in_layer = true;
  666. }
  667. if (is_search_built_in_layer) {
  668. const google::protobuf::Message *layer_message = PtrToPtr<const domi::caffe::LayerParameter,
  669. const google::protobuf::Message>(&layer);
  670. Status status = CreateCustomOperator(op_name, op_type, layer_message, 0, operators);
  671. if (status != SUCCESS || operators.empty()) {
  672. GELOGE(status, "[Create][CustomOperator] failed, name: %s, type: %s.", op_name.c_str(), op_type.c_str());
  673. return FAILED;
  674. }
  675. if (IsOpAttrEmpty(operators[0], kBuiltin)) {
  676. GELOGW("Custom and built-in op attr param is empty, name: %s, type: %s.", op_name.c_str(), op_type.c_str());
  677. }
  678. GELOGI("Search built-in layer success.");
  679. }
  680. return SUCCESS;
  681. }
  682. Status CaffeModelParser::ParseOpParam(const domi::caffe::LayerParameter &layer, ge::OpDescPtr &op,
  683. std::shared_ptr<OpParser> &op_parser) {
  684. GE_CHECK_NOTNULL(op);
  685. GE_CHECK_NOTNULL(op_parser);
  686. string op_type = layer.type();
  687. Status status = FAILED;
  688. ParseParamByOpFunc parse_param_func = domi::OpRegistry::Instance()->GetParseParamByOperatorFunc(op_type);
  689. if (parse_param_func == nullptr) {
  690. // Parsing weight information through opparser
  691. status = op_parser->ParseParams(&layer, op);
  692. } else {
  693. // The custom op defined by customer deals with parse params separately
  694. std::shared_ptr<ge::CaffeCustomParserAdapter> caffe_custom_op_parser =
  695. std::dynamic_pointer_cast<ge::CaffeCustomParserAdapter>(op_parser);
  696. vector<ge::Operator> custom_operator;
  697. status = GetCustomOp(layer, custom_operator);
  698. if (status != SUCCESS || custom_operator.empty()) {
  699. REPORT_CALL_ERROR("E19999", "Get CustomOp failed for op:%s(%s)", layer.name().c_str(), op_type.c_str());
  700. GELOGE(status, "[Get][CustomOp]failed for op [%s], optype [%s]",
  701. layer.name().c_str(), op_type.c_str());
  702. return status;
  703. }
  704. status = caffe_custom_op_parser->ParseParams(custom_operator[0], op);
  705. }
  706. if (status != SUCCESS) {
  707. REPORT_CALL_ERROR("E19999", "Parse param for op:%s(%s) failed", layer.name().c_str(), op_type.c_str());
  708. GELOGE(status, "[Parse][Params] for op [%s] fail, optype [%s]", layer.name().c_str(), op_type.c_str());
  709. return status;
  710. }
  711. return SUCCESS;
  712. }
  713. Status CaffeModelParser::AddNode(const domi::caffe::LayerParameter &layer, ge::ComputeGraphPtr &graph) {
  714. GE_CHECK_NOTNULL(graph);
  715. // Release in node destructor
  716. string op_type;
  717. op_type = layer.type();
  718. // User defined duplicate name operator processing
  719. auto m_iter = ge::GetParserContext().op_conf_map.find(op_type);
  720. // User specified configuration item found
  721. if (m_iter != ge::GetParserContext().op_conf_map.end()) {
  722. op_type = m_iter->second;
  723. }
  724. // General layer layer, search optype
  725. auto iter = caffe_op_map.find(op_type);
  726. if (iter == caffe_op_map.end()) {
  727. if (op_type == kDetectionOutput) {
  728. ErrorManager::GetInstance().ATCReportErrMessage("E11008");
  729. GELOGE(FAILED, "[Check][Type] Op type 'DetectionOutput' is confused. Suggest you modify the model file "
  730. "and use a explicit type, such as 'FSRDetectionOutput' or 'SSDDetectionOutput'.");
  731. } else {
  732. ErrorManager::GetInstance().ATCReportErrMessage("E11009", {"opname", "optype"}, {layer.name(), op_type});
  733. GELOGE(FAILED, "[Check][Type]Unsupport op[%s] optype[%s], you should customize the op at first.",
  734. layer.name().c_str(), op_type.c_str());
  735. }
  736. return FAILED;
  737. }
  738. op_type = iter->second;
  739. GELOGD("Caffe layer name:%s, layer type %s", layer.name().c_str(), op_type.c_str());
  740. // create OpParser
  741. std::shared_ptr<OpParserFactory> factory = OpParserFactory::Instance(domi::CAFFE);
  742. GE_CHECK_NOTNULL(factory);
  743. std::shared_ptr<OpParser> op_parser = factory->CreateOpParser(op_type);
  744. if (op_parser == nullptr) {
  745. ErrorManager::GetInstance().ATCReportErrMessage("E11009", {"opname", "optype"}, {layer.name(), op_type});
  746. GELOGE(FAILED, "op_parser is null, op_type: %s.", op_type.c_str());
  747. return FAILED;
  748. }
  749. ge::OpDescPtr op;
  750. // Process change of tensordesc initialization of opdesc,
  751. // The previous process tensordesc was constructed according to the graph structure in the builder stage
  752. // The current process requires tensordesc to determine before the opdesc of the operator is added to the graph
  753. GE_RETURN_IF_ERROR(AddTensorDescToOpDescByIr(op, layer, op_type));
  754. GELOGI("After AddTensorDescToOpDescByIr op[%s] type[%s] have input size: %zu, output size: %zu",
  755. op->GetName().c_str(), op->GetType().c_str(), op->GetInputsSize(), op->GetOutputsSize());
  756. // op parser execute
  757. GE_RETURN_IF_ERROR(ParseOpParam(layer, op, op_parser));
  758. GELOGI("After op parser op[%s] type[%s] have input size: %zu, output size: %zu", op->GetName().c_str(),
  759. op->GetType().c_str(), op->GetInputsSize(), op->GetOutputsSize());
  760. // Caffe has also been plug-in at present. Here it is directly set to NCHW
  761. // Set input and output format
  762. GELOGI("Enter caffe parser. op name:%s, type:%s", op->GetName().c_str(), op->GetType().c_str());
  763. // inputDescsPtr and outputDescsPtr are guaranteed not to be nullptr
  764. auto inputDescsPtr = op->GetAllInputsDescPtr();
  765. auto outputDescsPtr = op->GetAllOutputsDescPtr();
  766. ge::Format format = ge::FORMAT_NCHW;
  767. for (auto &inputDescPtr : inputDescsPtr) {
  768. GE_CHECK_NOTNULL(inputDescPtr);
  769. inputDescPtr->SetFormat(format);
  770. inputDescPtr->SetOriginFormat(format);
  771. }
  772. for (auto &outputDescPtr : outputDescsPtr) {
  773. GE_CHECK_NOTNULL(outputDescPtr);
  774. outputDescPtr->SetFormat(format);
  775. outputDescPtr->SetOriginFormat(format);
  776. }
  777. ge::NodePtr node = graph->AddNode(op);
  778. if (node == nullptr) {
  779. REPORT_INNER_ERROR("E19999", "AddNode failed, op name:%s, type:%s", op->GetName().c_str(), op->GetType().c_str());
  780. GELOGE(FAILED, "[Add][Node] failed, op name:%s, type:%s", op->GetName().c_str(), op->GetType().c_str());
  781. return FAILED;
  782. }
  783. // Caffe's reshape is different from IR definition, which has only one input.
  784. // In caffe process, after constructing reshape according to IR, the second input of reshape is empty.
  785. // So a constant node needs to be added to reshape as the second input.
  786. // AddConstInput is a function defined in caffe_op_parser, override in caffe_reshape_parser.
  787. std::shared_ptr<CaffeOpParser> caffe_op_parser = std::static_pointer_cast<CaffeOpParser>(op_parser);
  788. GE_CHECK_NOTNULL(caffe_op_parser);
  789. Status status = caffe_op_parser->AddConstInput(node);
  790. if (status != SUCCESS) {
  791. REPORT_CALL_ERROR("E19999", "AddConstInput failed for node:%s", node->GetOpDesc()->GetName().c_str());
  792. GELOGE(FAILED, "[Add][ConstInput] to node %s fail.", node->GetOpDesc()->GetName().c_str());
  793. return status;
  794. }
  795. node_map[layer.name()] = node;
  796. return SUCCESS;
  797. }
  798. Status CaffeModelParser::AddTensorDescToOpDesc(ge::OpDescPtr &op_desc, const domi::caffe::LayerParameter &layer) const {
  799. GE_CHECK_NOTNULL(op_desc);
  800. // Data node input and output tensordesc added in parserparam
  801. if (op_desc->GetType() == ge::parser::DATA) {
  802. return SUCCESS;
  803. }
  804. for (int i = 0; i < layer.bottom_size(); i++) {
  805. ge::GeTensorDesc input_tensor;
  806. GE_RETURN_IF_ERROR(op_desc->AddInputDesc(input_tensor));
  807. }
  808. GELOGD("AddTensorInputDescToOpDesc, op name: %s, type: %s, input num: %d", op_desc->GetName().c_str(),
  809. op_desc->GetType().c_str(), layer.bottom_size());
  810. // Output number
  811. int32_t output_tensor_num = layer.top_size();
  812. GELOGD("AddTensorOutputDescToOpDesc, op name: %s, type: %s, output num: %d", op_desc->GetName().c_str(),
  813. op_desc->GetType().c_str(), output_tensor_num);
  814. for (int32_t j = 0; j < output_tensor_num; j++) {
  815. ge::GeTensorDesc output_tensor;
  816. GE_RETURN_IF_ERROR(op_desc->AddOutputDesc(output_tensor));
  817. }
  818. // yolo v2 YoloDetectionOutput
  819. if (op_desc->GetType() == ge::parser::YOLODETECTIONOUTPUT) {
  820. ge::GeTensorDesc input_tensor;
  821. GE_RETURN_IF_ERROR(op_desc->AddInputDesc(input_tensor));
  822. GE_RETURN_IF_ERROR(op_desc->AddInputDesc(input_tensor));
  823. GELOGD(
  824. "Current op type is YOLODETECTIONOUTPUT, add 2 additional inputs"
  825. "while it's original input num is: %d",
  826. layer.bottom_size());
  827. }
  828. return SUCCESS;
  829. }
  830. Status CaffeModelParser::AddTensorDescToOpDescByIr(ge::OpDescPtr &op_desc, const domi::caffe::LayerParameter &layer,
  831. const string &op_type) const {
  832. if (std::find(kAddTensorIrSkipNodes.begin(), kAddTensorIrSkipNodes.end(), op_type) != kAddTensorIrSkipNodes.end()) {
  833. op_desc = ge::parser::MakeShared<ge::OpDesc>(layer.name(), op_type);
  834. GE_CHECK_NOTNULL(op_desc);
  835. Status ret = AddTensorDescToOpDesc(op_desc, layer);
  836. if (ret != SUCCESS) {
  837. GELOGE(FAILED, "[Add][TensorDesc]To OpDesc failed for op[%s] type[%s].", layer.name().c_str(), op_type.c_str());
  838. }
  839. return ret;
  840. }
  841. // Get opDesc by ir
  842. string layer_name = layer.name();
  843. ge::Operator op_factory = ge::OperatorFactory::CreateOperator(layer_name.c_str(), op_type.c_str());
  844. if (ParserUtils::GetOperatorName(op_factory) != layer.name()) {
  845. ErrorManager::GetInstance().ATCReportErrMessage("E10501", {"opname", "optype"}, {layer_name, op_type});
  846. GELOGE(FAILED, "[Invoke][CreateOperator]IR for op[%s] optype[%s] is not registered.",
  847. layer_name.c_str(), op_type.c_str());
  848. return FAILED;
  849. } else {
  850. op_desc = ge::OpDescUtils::GetOpDescFromOperator(op_factory);
  851. GE_CHECK_NOTNULL(op_desc);
  852. auto valid_input_size = layer.bottom_size();
  853. auto blob_size = layer.blobs_size();
  854. GELOGI("After GetOpDescFromOperator op[%s] type[%s] have all input size: %zu, "
  855. "caffe_input_size:%d blob_size %d output size: %zu",
  856. op_desc->GetName().c_str(), op_desc->GetType().c_str(),
  857. op_desc->GetAllInputsSize(), valid_input_size,
  858. blob_size, op_desc->GetOutputsSize());
  859. bool update_in_turn = (static_cast<int64_t >(op_desc->GetAllInputsSize()) == (valid_input_size + blob_size));
  860. for (int i = 0; i < valid_input_size; i++) {
  861. ge::GeTensorDesc input_tensor;
  862. std::string input_name;
  863. ge::graphStatus ret = ge::GRAPH_SUCCESS;
  864. // Below cases are supported fow now when there are optional inputs
  865. // x means optional, o means requierd input
  866. // a. ooxxx, number of o and x>=layer.bottom_size+layer.blobs_size>=number of o
  867. // b. oxoxoxox, layer.bottom_size+layer.blobs_size=number of o
  868. // c. oxoxoxox, layer.bottom_size+layer.blobs_size=number of o and x
  869. if (update_in_turn) {
  870. ret = op_desc->UpdateInputDesc(op_desc->GetInputNameByIndex(static_cast<uint32_t>(i)), input_tensor);
  871. } else {
  872. if (static_cast<size_t>(i) >= op_desc->GetInputsSize()) {
  873. ret = op_desc->UpdateInputDesc(static_cast<uint32_t>(i), input_tensor);
  874. } else {
  875. input_name = op_desc->GetValidInputNameByIndex(static_cast<uint32_t>(i));
  876. ret = op_desc->UpdateInputDesc(input_name, input_tensor);
  877. }
  878. }
  879. GELOGI("op [%s], type[%s], update input(%d) with name %s %s", op_desc->GetName().c_str(),
  880. op_desc->GetType().c_str(), i, input_name.c_str(), ret == ge::GRAPH_SUCCESS ? "success" : "not success");
  881. }
  882. for (int i = 0; i < layer.top_size(); i++) {
  883. ge::GeTensorDesc output_tensor;
  884. auto ret = op_desc->UpdateOutputDesc(op_desc->GetOutputNameByIndex(static_cast<uint32_t>(i)), output_tensor);
  885. GELOGI("op [%s], type[%s], update output(%d) with name %s %s",
  886. op_desc->GetName().c_str(), op_desc->GetType().c_str(),
  887. i, op_desc->GetOutputNameByIndex(i).c_str(),
  888. ret == ge::GRAPH_SUCCESS ? "success" : "not success");
  889. }
  890. }
  891. return SUCCESS;
  892. }
  893. Status CaffeModelParser::AddEdges(ge::ComputeGraphPtr &graph) {
  894. GE_CHECK_NOTNULL(graph);
  895. // Traversal input
  896. for (auto b_iter = bottom_blobs_map_.begin(); b_iter != bottom_blobs_map_.end(); b_iter++) {
  897. // Find the top blob corresponding to the bottom blob
  898. auto t_iter = top_blobs_map_.find(b_iter->first);
  899. // Unable to find the output corresponding to the input, error reported
  900. if (t_iter == top_blobs_map_.end()) {
  901. ErrorManager::GetInstance().ATCReportErrMessage("E11012", {"bottom_blob", "layer", "bottom_index"},
  902. {b_iter->first, b_iter->second[0].first,
  903. std::to_string(b_iter->second[0].second)});
  904. GELOGE(FAILED, "[Find][Blob]Unknown bottom blob '%s', in layer '%s', bottom index:%d.", b_iter->first.c_str(),
  905. b_iter->second[0].first.c_str(), b_iter->second[0].second);
  906. return PARAM_INVALID;
  907. }
  908. vector<pair<string, int32_t>> &top_blob_layers = t_iter->second;
  909. vector<pair<string, int32_t>> &bottom_blob_layers = b_iter->second;
  910. // 1.Traversal output, all input layers of the current blob
  911. for (auto &top_blob_layer_pair : top_blob_layers) {
  912. // 2.Traversal input, all output layers of the current blob
  913. for (auto &bottom_blob_layer_pair : bottom_blob_layers) {
  914. // Find the layer for this output
  915. auto top_node_iter = node_map.find(top_blob_layer_pair.first);
  916. // Find the layer for this input
  917. std::map<std::string, ge::NodePtr>::const_iterator bottom_node_iter =
  918. node_map.find(bottom_blob_layer_pair.first);
  919. if (top_node_iter != node_map.end() && bottom_node_iter != node_map.end()) {
  920. // Output node top_node_iter->second,
  921. // Output index top_blob_layer_pair.second
  922. // input node bottom_node_iter->second
  923. // input index bottom_blob_layer_pair.second
  924. GELOGD("Start add edge: From %s:%d To %s:%d.", top_node_iter->second->GetName().c_str(),
  925. top_blob_layer_pair.second, bottom_node_iter->second->GetName().c_str(),
  926. bottom_blob_layer_pair.second);
  927. ge::OutDataAnchorPtr out_archor_ptr = top_node_iter->second->GetOutDataAnchor(top_blob_layer_pair.second);
  928. GE_CHECK_NOTNULL(out_archor_ptr);
  929. ge::InDataAnchorPtr in_archor_ptr = bottom_node_iter->second->GetInDataAnchor(bottom_blob_layer_pair.second);
  930. GE_CHECK_NOTNULL(in_archor_ptr);
  931. GE_IF_BOOL_EXEC(ge::GraphUtils::AddEdge(out_archor_ptr, in_archor_ptr) != ge::GRAPH_SUCCESS,
  932. REPORT_CALL_ERROR("E19999", "Add edge between %s and %s failed",
  933. top_node_iter->second->GetName().c_str(),
  934. bottom_node_iter->second->GetName().c_str());
  935. GELOGE(INTERNAL_ERROR, "[Invoke][AddEdge]Add link failed from op[%s] to op[%s].",
  936. top_node_iter->second->GetName().c_str(), bottom_node_iter->second->GetName().c_str());
  937. return INTERNAL_ERROR;);
  938. auto op_desc = bottom_node_iter->second->GetOpDesc();
  939. GE_CHECK_NOTNULL(op_desc);
  940. auto out_op_desc = top_node_iter->second->GetOpDesc();
  941. GE_CHECK_NOTNULL(out_op_desc);
  942. (void) op_desc->UpdateInputDesc((static_cast<uint32_t>(in_archor_ptr->GetIdx())),
  943. out_op_desc->GetOutputDesc(static_cast<uint32_t>(out_archor_ptr->GetIdx())));
  944. }
  945. GE_IF_BOOL_EXEC(top_node_iter == node_map.end(),
  946. ErrorManager::GetInstance().ATCReportErrMessage("E11014", {"opname"},
  947. {top_blob_layer_pair.first});
  948. GELOGE(INTERNAL_ERROR, "[Find][TopLayer] %s failed.", top_blob_layer_pair.first.c_str());
  949. return ge::FAILED;)
  950. GE_IF_BOOL_EXEC(bottom_node_iter == node_map.end(),
  951. ErrorManager::GetInstance().ATCReportErrMessage("E11015", {"opname"},
  952. {bottom_blob_layer_pair.first});
  953. GELOGE(INTERNAL_ERROR, "[Find][BottomLayer] %s failed.", bottom_blob_layer_pair.first.c_str());
  954. return ge::FAILED;)
  955. }
  956. }
  957. }
  958. return SUCCESS;
  959. }
  960. bool CaffeModelParser::IsOutputTop(const string &op_name, const int32_t index) const {
  961. bool ret = false;
  962. auto iter = ge::GetParserContext().out_nodes_map.find(op_name);
  963. if (iter != ge::GetParserContext().out_nodes_map.end()) {
  964. std::vector<int32_t> tmp_index_v;
  965. for (int32_t id : iter->second) {
  966. if (index == id) {
  967. ret = true;
  968. } else {
  969. tmp_index_v.emplace_back(id);
  970. }
  971. }
  972. // To prevent specifying network output again in the build phase, need to delete the output node in the map list.
  973. if (ret) {
  974. ge::GetParserContext().out_nodes_map.erase(op_name);
  975. ge::GetParserContext().out_nodes_map.emplace(op_name, tmp_index_v);
  976. }
  977. }
  978. return ret;
  979. }
  980. Status CaffeModelParser::AddUserOutNodesTop() {
  981. int32_t index = 0;
  982. const std::vector<std::pair<std::string, int32_t>> &user_out_nodes = ge::GetParserContext().user_out_nodes;
  983. int net_output_num = user_out_nodes.size();
  984. for (const auto &out_pair : user_out_nodes) {
  985. std::map<std::string, std::vector<std::string>>::const_iterator layer_iter = layer_tops_map_.find(out_pair.first);
  986. GELOGI("Add to output, node name: %s", out_pair.first.c_str());
  987. if (layer_iter != layer_tops_map_.end()) {
  988. if (static_cast<uint32_t>(out_pair.second) >= (layer_iter->second).size()) {
  989. ErrorManager::GetInstance().ATCReportErrMessage(
  990. "E11016", {"opname", "outputindex", "totlaloutputindex", "inputindex", "totlalinputindex"},
  991. {out_pair.first.c_str(), std::to_string(out_pair.second), std::to_string((layer_iter->second).size()),
  992. std::to_string(index), std::to_string(net_output_num)});
  993. GELOGE(INTERNAL_ERROR, "[Check][Size]Add op %s to NetOutput faild, current node output index:%d should < %zu. "
  994. "NetOutput input_index:%d should < %u.", out_pair.first.c_str(), out_pair.second,
  995. (layer_iter->second).size(), index, net_output_num);
  996. return INTERNAL_ERROR;
  997. }
  998. string top_name = layer_iter->second[out_pair.second];
  999. std::map<std::string, ge::NodePtr>::const_iterator top_node_iter = node_map.find(out_pair.first);
  1000. if (top_node_iter != node_map.end()) {
  1001. ge::GetParserContext().out_tensor_names.push_back(top_name);
  1002. GELOGI("The top of out node [%s] is [%s]", out_pair.first.c_str(), top_name.c_str());
  1003. }
  1004. ++index;
  1005. } else {
  1006. ErrorManager::GetInstance().ATCReportErrMessage("E11017", {"opname"}, {out_pair.first});
  1007. GELOGE(PARAM_INVALID, "[Find][Node]Can not find out_node:%s, you should check --out_nodes.",
  1008. out_pair.first.c_str());
  1009. return PARAM_INVALID;
  1010. }
  1011. }
  1012. return SUCCESS;
  1013. }
  1014. Status CaffeModelParser::AddOutputTop(const domi::caffe::NetParameter &proto_message) {
  1015. for (int32_t layer_index = 0; layer_index < proto_message.layer_size(); ++layer_index) {
  1016. const domi::caffe::LayerParameter &layer = proto_message.layer(layer_index);
  1017. if (!CheckValidLayer(layer)) {
  1018. continue;
  1019. }
  1020. for (int32_t i = 0; i < layer.top_size(); i++) {
  1021. string top = layer.top(i);
  1022. string top_origin = top;
  1023. // Handling 'inplace' scenarios
  1024. if (IsInplaceTopBlob(layer, top)) {
  1025. top = RemapTopNameByLayer(layer, top, i);
  1026. }
  1027. std::map<std::string, std::vector<std::pair<std::string, int32_t>>>::const_iterator t_iter =
  1028. top_blobs_map_.find(top);
  1029. GE_RETURN_WITH_LOG_IF_FALSE(t_iter != top_blobs_map_.end(),
  1030. "[Check][Param]Failed to find top: %s, layer name:%s", top.c_str(),
  1031. layer.name().c_str());
  1032. // Find the bottom blob corresponding to the top blob
  1033. auto b_iter = bottom_blobs_map_.find(t_iter->first);
  1034. if (b_iter != bottom_blobs_map_.end() && !IsOutputTop(layer.name(), i)) {
  1035. continue;
  1036. }
  1037. // If not found, add to the output side of the output
  1038. // Find the layer for this output
  1039. std::map<std::string, ge::NodePtr>::const_iterator top_node_iter = node_map.find(layer.name());
  1040. GELOGI("output in top_blob: %s", layer.name().c_str());
  1041. if (top_node_iter != node_map.end()) {
  1042. ge::GetParserContext().out_tensor_names.push_back(top_origin);
  1043. ge::GetParserContext().default_out_nodes.push_back(std::make_pair(layer.name(), i));
  1044. GELOGI("The top of out node [%s] is [%s]", layer.name().c_str(), top_origin.c_str());
  1045. }
  1046. }
  1047. }
  1048. return SUCCESS;
  1049. }
  1050. bool CaffeModelParser::CheckValidLayer(const domi::caffe::LayerParameter &layer) const {
  1051. if (layer.include_size() != 0) {
  1052. bool filter_flag = false;
  1053. for (int32_t j = 0; j < layer.include_size(); j++) {
  1054. // Determine whether there is a data node for train in a Caffe model
  1055. if (layer.include(j).phase() == domi::caffe::TRAIN) {
  1056. filter_flag = true;
  1057. break;
  1058. }
  1059. }
  1060. if (filter_flag) {
  1061. // If the phase of the data node's include is train, the data node ignores
  1062. return false;
  1063. }
  1064. }
  1065. return true;
  1066. }
  1067. bool CaffeModelParser::IsInplaceTopBlob(const domi::caffe::LayerParameter &layer, const std::string &top_name) const {
  1068. for (auto &bottom_name : layer.bottom()) {
  1069. if (top_name == bottom_name) {
  1070. return true;
  1071. }
  1072. }
  1073. return false;
  1074. }
  1075. std::string CaffeModelParser::RemapTopNameByLayer(const domi::caffe::LayerParameter &layer, const std::string &top_name,
  1076. int index) const {
  1077. return (top_name + "_" + layer.name() + "_" + std::to_string(index));
  1078. }
  1079. Status CaffeModelParser::PreCheck(const domi::caffe::NetParameter &net) const {
  1080. // Add layer in the model to PreChecker and check the general parameters
  1081. PreChecker::Instance().SetModelName(net.name());
  1082. for (int i = 0; i < net.layer_size(); i++) {
  1083. const LayerParameter &layer = net.layer(i);
  1084. // Skip training related layers and python layers
  1085. if (!CheckValidLayer(layer) || layer.type() == kPython) {
  1086. continue;
  1087. }
  1088. // validate opname
  1089. string mode = "^[A-Za-z0-9./_-]+$";
  1090. if (!ge::parser::ValidateStr(layer.name(), mode)) {
  1091. ErrorManager::GetInstance().ATCReportErrMessage("E11018", {"opname"}, {layer.name()});
  1092. GELOGE(ge::FAILED, "[Invoke][ValidateStr]Parse caffe pbtxt validate op[%s] failed, opname can only contain "
  1093. "'a-z' 'A-Z' '0-9' '-' '.' '_' '/'", layer.name().c_str());
  1094. return ge::FAILED;
  1095. }
  1096. GE_RETURN_WITH_LOG_IF_ERROR(PreChecker::Instance().AddOp(&layer, layer.name(), layer.type()),
  1097. "[Invoke][AddOp]Add layer to PreChecker failed, layer name: %s.",
  1098. layer.name().c_str());
  1099. if (PreChecker::Instance().CheckName(&layer) != SUCCESS) {
  1100. GELOGE(FAILED, "[Invoke][CheckName]Check op[%s] failed, name repeat in caffe prototxt.", layer.name().c_str());
  1101. return FAILED;
  1102. }
  1103. if (PreChecker::Instance().CheckType(&layer) != SUCCESS) {
  1104. GELOGE(FAILED, "[Invoke][CheckType]Check op[%s]'s optype failed, type is not supported.", layer.name().c_str());
  1105. return FAILED;
  1106. }
  1107. }
  1108. return SUCCESS;
  1109. }
  1110. Status CaffeModelParser::ParseFromMemory(const char *data, uint32_t size, ge::ComputeGraphPtr &graph) {
  1111. ErrorManager::GetInstance().SetStage(error_message::kModelCompile, error_message::kParser);
  1112. bool has_error = false;
  1113. GE_CHK_BOOL_RET_STATUS(data != nullptr, FAILED, "[Check][Param]model data is nullptr.");
  1114. GE_CHK_BOOL_RET_STATUS(graph != nullptr, FAILED, "[Check][Param]graph is nullptr.");
  1115. domi::caffe::NetParameter proto_message;
  1116. // Get Caffe network model information
  1117. if (!ge::parser::ReadProtoFromMem(data, static_cast<int>(size), &proto_message)) {
  1118. GELOGE(FAILED, "[Read][ProtoFromMem] ret fail");
  1119. return FAILED;
  1120. }
  1121. GE_CHK_BOOL_RET_STATUS(!(proto_message.layer_size() == 0 && proto_message.layers_size() > 0), FAILED,
  1122. "[Check][Size]The model file is consisted of layers-structure which is deprecated in caffe and unsupport in OMG."
  1123. "It is recommended to convert layers-structure to layer-structure by caffe tool.");
  1124. GE_CHK_BOOL_RET_STATUS((proto_message.layer_size() != 0), FAILED,
  1125. "[Check][Size]net layer num is zero, prototxt file may be invalid.");
  1126. GE_RETURN_WITH_LOG_IF_ERROR(ProtoTypePassManager::Instance().Run(&proto_message, domi::CAFFE),
  1127. "Run ProtoType Pass Failed");
  1128. // Set network name
  1129. GE_IF_BOOL_EXEC((proto_message.has_name()), graph->SetName(proto_message.name()));
  1130. // Add layer in the model to PreChecker, and perform general checks
  1131. GE_RETURN_IF_ERROR(PreCheck(proto_message));
  1132. has_error = PreChecker::Instance().HasError();
  1133. if (ReorderInput(proto_message) != SUCCESS) {
  1134. GELOGE(INTERNAL_ERROR, "[Reorder][Input] failed.");
  1135. return INTERNAL_ERROR;
  1136. }
  1137. bool input_data_flag = false;
  1138. // Process input of type input
  1139. CHECK_FALSE_EXEC(ParseInput(proto_message, input_data_flag) == SUCCESS, has_error = true;
  1140. GELOGE(FAILED, "[Parse][Input] ret fail."));
  1141. int32_t layer_count = proto_message.layer_size();
  1142. std::map<std::string, std::string> inplace_blob_name_remapping;
  1143. // Map of operator name and occurrence times
  1144. std::map<std::string, int32_t> layer_name_map;
  1145. // <layername,paramnames>
  1146. std::map<std::string, std::vector<std::string>> layer_params_map;
  1147. // same param name set <paramnames,layernames>
  1148. // std::map<std::vector<std::string>, std::vector<std::string>> params_share_map;
  1149. for (int32_t layer_index = 0; layer_index < layer_count; ++layer_index) {
  1150. domi::caffe::LayerParameter &layer = const_cast<domi::caffe::LayerParameter &>(proto_message.layer(layer_index));
  1151. if (!CheckValidLayer(layer)) {
  1152. GELOGI("[Check][Layer]layer phase is train, skip this layer, name:%s, type:%s.",
  1153. layer.name().c_str(), layer.type().c_str());
  1154. continue;
  1155. }
  1156. CHECK_FALSE_EXEC(!((layer.type() == ge::parser::DATA_TYPE) && input_data_flag), has_error = true;
  1157. REPORT_INNER_ERROR("E19999", "net %s has input and data layer simultaneously, check invalid."
  1158. "layer name:%s, layer type:%s", proto_message.name().c_str(),
  1159. layer.name().c_str(), layer.type().c_str());
  1160. GELOGE(FAILED, "[Check][Layer]net %s has input and data layer simultaneously, check invalid."
  1161. "layer name:%s, layer type:%s", proto_message.name().c_str(),
  1162. layer.name().c_str(), layer.type().c_str()));
  1163. // All layer names cannot be duplicate
  1164. // 20181208 Modified to support the existence of duplicate operators in Caffe model
  1165. GE_IF_BOOL_EXEC(layer_name_map.find(layer.name()) != layer_name_map.end(),
  1166. // duplicate operator modification
  1167. string new_name = layer.name() + "_same_" + std::to_string(layer_name_map[layer.name()]);
  1168. // Times accumulation of duplicate operators
  1169. layer_name_map[layer.name()]++;
  1170. // Set the name in proto and layer
  1171. domi::caffe::LayerParameter *duplicate_name_layer = proto_message.mutable_layer(layer_index);
  1172. duplicate_name_layer->set_name(new_name);
  1173. layer.set_name(new_name);)
  1174. // Insert the new operator name, the number of times of duplicate name is recorded as 1
  1175. layer_name_map.insert(std::make_pair(layer.name(), kNumOne));
  1176. // Do not exit immediately when there is an error, wait until all errors are collected before exiting
  1177. Status ret = AddNode(layer, graph);
  1178. if (ret != SUCCESS) {
  1179. GELOGE(FAILED, "[Add][Node]failed for layer:%s.", layer.name().c_str());
  1180. has_error = true;
  1181. continue;
  1182. }
  1183. // parse ParamSpec
  1184. std::vector<string> v_param_names;
  1185. for (int32_t i = 0; i < layer.param_size(); i++) {
  1186. const domi::caffe::ParamSpec &param = layer.param(i);
  1187. GE_IF_BOOL_EXEC((param.has_name()), v_param_names.emplace_back(param.name()));
  1188. }
  1189. // Save the layer with param name parameter to map
  1190. GE_IF_BOOL_EXEC((v_param_names.size() > 0), layer_params_map.emplace(layer.name(), v_param_names));
  1191. GE_RETURN_WITH_LOG_IF_ERROR(AddBlobsToMap(layer, inplace_blob_name_remapping),
  1192. "[Add][Blobs]To Map ret fail, layer:%s.", layer.name().c_str());
  1193. }
  1194. // Find a layer with the same param name and save it to graph
  1195. GE_RETURN_WITH_LOG_IF_ERROR(FindShareParamLayers(layer_params_map),
  1196. "[Find][ShareParamLayers] by Caffe parser ret fail.");
  1197. // Exit if an error occurs
  1198. GE_IF_BOOL_EXEC(has_error, return FAILED);
  1199. GE_CHK_BOOL_RET_STATUS(top_blobs_map_.size() > 0, FAILED, "[Check][Size]current net has no output!");
  1200. GE_RETURN_WITH_LOG_IF_ERROR(AddEdges(graph), "[Add][Edges] failed by Caffe parser, graph:%s.",
  1201. graph->GetName().c_str());
  1202. if (!(ge::GetParserContext().user_out_nodes.empty())) {
  1203. GE_RETURN_WITH_LOG_IF_ERROR(AddUserOutNodesTop(), "[Add][UserOutNodesTop] by Caffe parser failed.");
  1204. } else {
  1205. GE_RETURN_WITH_LOG_IF_ERROR(AddOutputTop(proto_message), "[Add][OutputTop] by Caffe parser failed.");
  1206. }
  1207. GE_RETURN_WITH_LOG_IF_ERROR(graph->TopologicalSorting(),
  1208. "[Call][TopologicalSorting] by Caffe parser failed, graph:%s.",
  1209. graph->GetName().c_str());
  1210. auto nodes = graph->GetDirectNode();
  1211. GELOGI("graph node size = %zu.", nodes.size());
  1212. for (auto &node : nodes) {
  1213. GELOGI("node name = %s.", node->GetName().c_str());
  1214. for (auto &out_node : node->GetOutDataNodes()) {
  1215. GELOGI("out node name = %s.", out_node->GetName().c_str());
  1216. }
  1217. }
  1218. return SUCCESS;
  1219. }
  1220. Status CaffeModelParser::Parse(const char *model_path, ge::Graph &graph) {
  1221. ErrorManager::GetInstance().SetStage(error_message::kModelCompile, error_message::kParser);
  1222. GE_CHECK_NOTNULL(model_path);
  1223. ge::ComputeGraphPtr compute_graph = ge::GraphUtils::GetComputeGraph(graph);
  1224. GE_CHECK_NOTNULL(compute_graph);
  1225. Status ret = Parse(model_path, compute_graph);
  1226. if (ret != SUCCESS) {
  1227. GELOGE(ret, "[Parser][Model] %s for graph %s failed.", model_path, ParserUtils::GetGraphName(graph).c_str());
  1228. return ret;
  1229. }
  1230. GELOGI("Parser model for graph %s success.", ParserUtils::GetGraphName(graph).c_str());
  1231. return SUCCESS;
  1232. }
  1233. void CaffeModelParser::SaveOrigionLayerTops(domi::caffe::LayerParameter &layer) {
  1234. string name = layer.name();
  1235. vector<string> tops;
  1236. for (auto top : layer.top()) {
  1237. tops.push_back(top);
  1238. }
  1239. std::map<std::string, std::vector<std::string>>::const_iterator it = layer_tops_map_.find(name);
  1240. if (it == layer_tops_map_.end()) {
  1241. layer_tops_map_[name] = tops;
  1242. }
  1243. return;
  1244. }
  1245. Status CaffeModelParser::SaveDataLayerTops(const domi::caffe::LayerParameter &layer) {
  1246. string name = layer.name();
  1247. if (node_map.find(name) == node_map.end()) {
  1248. REPORT_INNER_ERROR("E19999", "layer:%s not find in node_map after AddNode, exist error before", name.c_str());
  1249. GELOGE(FAILED, "[Find][Node]Node can not be found by layer name: %s", name.c_str());
  1250. return FAILED;
  1251. }
  1252. ge::NodePtr node = node_map[name];
  1253. GE_CHECK_NOTNULL(node);
  1254. if (node->GetType() == ge::parser::DATA) {
  1255. if (layer.top_size() != 1) {
  1256. ErrorManager::GetInstance().ATCReportErrMessage("E11035", {"opname", "size"},
  1257. {name, std::to_string(layer.top_size())});
  1258. GELOGE(FAILED, "[Check][Type]Data layer[%s] top size must be 1, real size: %d", name.c_str(), layer.top_size());
  1259. return FAILED;
  1260. }
  1261. string top_name = layer.top(0);
  1262. auto data_tensor_names = ge::GetParserContext().data_tensor_names;
  1263. if (find(data_tensor_names.begin(), data_tensor_names.end(), top_name) != data_tensor_names.end()) {
  1264. ErrorManager::GetInstance().ATCReportErrMessage("E11036", {"topname"}, {top_name});
  1265. GELOGE(FAILED, "[Check][Node]Different data node can not have same top name: %s.", top_name.c_str());
  1266. return FAILED;
  1267. }
  1268. ge::GetParserContext().data_tensor_names.push_back(top_name);
  1269. }
  1270. return SUCCESS;
  1271. }
  1272. Status CaffeModelParser::ReportLayerInvalid(const domi::caffe::NetParameter &proto, const std::string &path) const {
  1273. if (proto.layers_size() > 0) {
  1274. ErrorManager::GetInstance().ATCReportErrMessage("E11021", {"realpath"}, {path});
  1275. GELOGE(FAILED, "[Check][Size]The model file[%s] is consisted of layers-structure which is deprecated in Caffe "
  1276. "and unsupported in ATC. The \"layers\" should be changed to \"layer\".", path.c_str());
  1277. } else {
  1278. ErrorManager::GetInstance().ATCReportErrMessage("E11022");
  1279. GELOGE(FAILED, "[Check][Size]net layer num is zero, prototxt file may be invalid.");
  1280. }
  1281. return FAILED;
  1282. }
  1283. Status CaffeModelParser::Parse(const char *model_path, ge::ComputeGraphPtr &graph) {
  1284. bool has_error = false;
  1285. GE_CHECK_NOTNULL(model_path);
  1286. GE_CHECK_NOTNULL(graph);
  1287. GELOGI("Caffe Parse model file [%s]", model_path);
  1288. PreChecker::Instance().Clear();
  1289. domi::caffe::NetParameter proto_message;
  1290. // Get Caffe network model information
  1291. if (ReadModelWithoutWarning(model_path, &proto_message) != SUCCESS) {
  1292. GELOGE(FAILED, "[Read][Model] from text ret fail, model path: %s.", model_path);
  1293. return FAILED;
  1294. }
  1295. // parse network model by custom proto and get custom operators
  1296. string custom_proto_path = ge::GetParserContext().custom_proto_path + "custom.proto";
  1297. string caffe_proto_path = ge::GetParserContext().caffe_proto_path + "caffe.proto";
  1298. GE_CHK_STATUS(CustomProtoParse(model_path, custom_proto_path, caffe_proto_path, custom_operator_),
  1299. "[Parse][Model] by custom proto failed, model path: %s.", model_path);
  1300. if (proto_message.layer_size() == 0) {
  1301. return ReportLayerInvalid(proto_message, model_path);
  1302. }
  1303. GE_RETURN_WITH_LOG_IF_ERROR(ProtoTypePassManager::Instance().Run(&proto_message, domi::CAFFE),
  1304. "Run ProtoType Pass Failed");
  1305. // Set network name
  1306. GE_IF_BOOL_EXEC((proto_message.has_name() && !proto_message.name().empty()), graph->SetName(proto_message.name()));
  1307. // Add layer in the model to PreChecker, and perform general checks
  1308. GE_RETURN_IF_ERROR(PreCheck(proto_message));
  1309. if (PreChecker::Instance().HasError()) {
  1310. REPORT_INNER_ERROR("E19999", "Precheck failed. a report of json format will be create, Please read it.");
  1311. GELOGE(INTERNAL_ERROR, "[Has][Error]Precheck failed. a report of json format will be create, Please read it.");
  1312. return FAILED;
  1313. }
  1314. if (ReorderInput(proto_message) != SUCCESS) {
  1315. GELOGE(INTERNAL_ERROR, "[Reorder][Input] failed.");
  1316. return INTERNAL_ERROR;
  1317. }
  1318. bool input_data_flag = false;
  1319. // Process input of type input
  1320. CHECK_FALSE_EXEC(ParseInput(proto_message, input_data_flag) == SUCCESS, has_error = true;
  1321. GELOGE(FAILED, "[Parse][Input] ret fail."));
  1322. int32_t layer_count = proto_message.layer_size();
  1323. if (!ge::GetParserContext().user_out_tensors.empty()) {
  1324. GELOGW("The out_put info has top_name items.");
  1325. GE_RETURN_WITH_LOG_IF_ERROR(ParseOutputNodeTopInfo(proto_message),
  1326. "[Parse][OutputNodeTopInfo] failed.");
  1327. ge::GetParserContext().user_out_tensors.clear();
  1328. }
  1329. std::map<std::string, std::string> inplace_blob_name_remapping;
  1330. // Map of operator name and occurrence times
  1331. std::map<std::string, int32_t> layer_name_map;
  1332. GetParserContext().data_tensor_names.clear();
  1333. // <layername,paramnames>
  1334. std::map<std::string, std::vector<std::string>> layer_params_map;
  1335. // same param name set <paramnames,layernames>
  1336. for (int32_t layer_index = 0; layer_index < layer_count; ++layer_index) {
  1337. domi::caffe::LayerParameter &layer = const_cast<domi::caffe::LayerParameter &>(proto_message.layer(layer_index));
  1338. SaveOrigionLayerTops(layer);
  1339. if (!CheckValidLayer(layer)) {
  1340. GELOGI("[Check][Layer]layer phase is train, skip this layer, name:%s, type:%s.",
  1341. layer.name().c_str(), layer.type().c_str());
  1342. continue;
  1343. }
  1344. CHECK_FALSE_EXEC(!((layer.type() == ge::parser::DATA_TYPE) && input_data_flag), has_error = true;
  1345. GELOGE(FAILED, "[Check][Layer]net %s has input and data layer simultaneously, check invalid."
  1346. "layer name:%s, layer type:%s", proto_message.name().c_str(),
  1347. layer.name().c_str(), layer.type().c_str()));
  1348. // All layer names cannot be duplicate
  1349. // Modified to support the existence of duplicate operators in Caffe model
  1350. GE_IF_BOOL_EXEC(layer_name_map.find(layer.name()) != layer_name_map.end(),
  1351. // duplicate operator modification
  1352. string new_name = layer.name() + "_same_" + std::to_string(layer_name_map[layer.name()]);
  1353. // Times accumulation of duplicate operators
  1354. layer_name_map[layer.name()]++;
  1355. // Set the name in proto and layer
  1356. domi::caffe::LayerParameter *duplicate_name_layer = proto_message.mutable_layer(layer_index);
  1357. duplicate_name_layer->set_name(new_name);
  1358. layer.set_name(new_name);)
  1359. // Insert the new operator name, the number of times of duplicate name is recorded as 1
  1360. layer_name_map.insert(std::make_pair(layer.name(), kNumOne));
  1361. // Do not exit immediately when there is an error, wait until all errors are collected before exiting
  1362. Status ret = AddNode(layer, graph);
  1363. if (ret != SUCCESS) {
  1364. GELOGE(FAILED, "[Add][Node] fail, layer:%s.", layer.name().c_str());
  1365. has_error = true;
  1366. continue;
  1367. }
  1368. // parse ParamSpec
  1369. std::vector<string> v_param_names;
  1370. for (int32_t i = 0; i < layer.param_size(); i++) {
  1371. const domi::caffe::ParamSpec &param = layer.param(i);
  1372. GE_IF_BOOL_EXEC((param.has_name()), v_param_names.emplace_back(param.name()));
  1373. }
  1374. // Save the layer with param name parameter to map
  1375. GE_IF_BOOL_EXEC((v_param_names.size() > 0), layer_params_map.emplace(layer.name(), v_param_names));
  1376. GE_RETURN_WITH_LOG_IF_ERROR(AddBlobsToMap(layer, inplace_blob_name_remapping),
  1377. "[Add][blobs] to map ret fail, layer:%s.", layer.name().c_str());
  1378. if (SaveDataLayerTops(layer) != SUCCESS) {
  1379. GELOGE(FAILED, "[Save][DataLayerTops] failed, layer:%s.", layer.name().c_str());
  1380. return FAILED;
  1381. }
  1382. }
  1383. // Find a layer with the same param name and save it to graph
  1384. GE_RETURN_WITH_LOG_IF_ERROR(FindShareParamLayers(layer_params_map),
  1385. "[Find][ShareParamLayers] ret fail.");
  1386. // Exit if an error occurs
  1387. GE_IF_BOOL_EXEC(has_error, return FAILED);
  1388. GE_CHK_BOOL_RET_STATUS(top_blobs_map_.size() > 0, FAILED, "[Check][Size]current net has no output!");
  1389. GE_RETURN_WITH_LOG_IF_ERROR(AddEdges(graph), "[Add][Edges] fail, graph:%s.", graph->GetName().c_str());
  1390. if (!(ge::GetParserContext().user_out_nodes.empty())) {
  1391. GE_RETURN_WITH_LOG_IF_ERROR(AddUserOutNodesTop(), "[Add][UserOutNodesTop] failed.");
  1392. } else {
  1393. GE_RETURN_WITH_LOG_IF_ERROR(AddOutputTop(proto_message), "[Add][OutputTop] failed.");
  1394. }
  1395. GE_RETURN_WITH_LOG_IF_ERROR(graph->TopologicalSorting(), "[Call][TopologicalSorting] failed, graph:%s.",
  1396. graph->GetName().c_str());
  1397. auto nodes = graph->GetDirectNode();
  1398. GELOGI("graph node size = %zu.", nodes.size());
  1399. for (auto &node : nodes) {
  1400. GELOGI("node name = %s.", node->GetName().c_str());
  1401. for (auto &out_node : node->GetOutDataNodes()) {
  1402. GELOGI("out node name = %s.", out_node->GetName().c_str());
  1403. }
  1404. }
  1405. return SUCCESS;
  1406. }
  1407. Status CaffeModelParser::FindShareParamLayers(
  1408. const std::map<std::string, std::vector<std::string>> &layer_params_map) const {
  1409. for (auto p_iter = layer_params_map.begin(); p_iter != layer_params_map.end(); ++p_iter) {
  1410. for (auto p2_iter = p_iter; p2_iter != layer_params_map.end(); ++p2_iter) {
  1411. if (p_iter->first != p2_iter->first && p_iter->second == p2_iter->second) {
  1412. if (params_share_map.find(p_iter->second) == params_share_map.end()) { // Unsaved layer
  1413. vector<string> tmp_v;
  1414. tmp_v.push_back(p_iter->first);
  1415. tmp_v.push_back(p2_iter->first);
  1416. params_share_map.emplace(p_iter->second, tmp_v);
  1417. } else {
  1418. vector<string>::iterator iter =
  1419. find(params_share_map[p_iter->second].begin(), params_share_map[p_iter->second].end(), p2_iter->first);
  1420. if (iter == params_share_map[p_iter->second].end()) {
  1421. params_share_map[p_iter->second].push_back(p2_iter->first);
  1422. }
  1423. }
  1424. }
  1425. }
  1426. }
  1427. return SUCCESS;
  1428. }
  1429. Status CaffeModelParser::ToJson(const char *model_file, const char *json_file) {
  1430. GE_CHK_BOOL_RET_STATUS(model_file != nullptr, FAILED, "[Check][Param]model_file is nullptr.");
  1431. GE_CHK_BOOL_RET_STATUS(json_file != nullptr, FAILED, "[Check][Param]json_file is nullptr.");
  1432. domi::caffe::NetParameter net;
  1433. nlohmann::json j;
  1434. GE_RETURN_WITH_LOG_IF_FALSE(ReadModelWithoutWarning(model_file, &net) == SUCCESS,
  1435. "[Read][Model]Without Warning failed, Please Check file:%s.", model_file);
  1436. Pb2Json::Message2Json(net, set<string>(), j, true);
  1437. return ModelSaver::SaveJsonToFile(json_file, j);
  1438. }
  1439. Status CaffeModelParser::ReorderInput(domi::caffe::NetParameter &net) const {
  1440. int layer_size = net.layer_size();
  1441. for (int i = 0; i < layer_size; ++i) {
  1442. domi::caffe::LayerParameter *layer = net.mutable_layer(i);
  1443. const std::vector<domi::RemoveInputConfigure> &move_input_vec =
  1444. domi::OpRegistry::Instance()->GetRemoveInputConfigure(layer->type());
  1445. if (move_input_vec.empty()) {
  1446. continue;
  1447. }
  1448. for (const auto &it : move_input_vec) {
  1449. if (it.moveType == domi::OMG_INPUT_REORDER) {
  1450. auto inputs = layer->bottom();
  1451. if (static_cast<size_t>(inputs.size()) != it.input_order.size()) {
  1452. REPORT_INNER_ERROR("E19999", "Size of input is mismatched, check invalid,"
  1453. "new order size is %zu, input size is %d.", it.input_order.size(), inputs.size());
  1454. GELOGE(INTERNAL_ERROR, "[Check][Size]Size of input is mismatched, new order size is %zu, input size is %d.",
  1455. it.input_order.size(), inputs.size());
  1456. return INTERNAL_ERROR;
  1457. }
  1458. for (size_t j = 0; j < it.input_order.size(); ++j) {
  1459. int new_index = it.input_order[j];
  1460. if (new_index < 0 || new_index >= inputs.size()) {
  1461. REPORT_INNER_ERROR("E19999", "New order of %s has invalid index %d, which is out of range, "
  1462. "inputs size:%d.", layer->name().c_str(), new_index, inputs.size());
  1463. GELOGE(INTERNAL_ERROR, "[Check][Param]New order of %s has invalid index %d, which is out of range, "
  1464. "inputs size:%d.", layer->name().c_str(), new_index, inputs.size());
  1465. return INTERNAL_ERROR;
  1466. }
  1467. layer->set_bottom(j, inputs[new_index]);
  1468. }
  1469. GELOGI("The input sequence of the node has been rearranged, node name:%s.", layer->name().c_str());
  1470. }
  1471. }
  1472. }
  1473. return SUCCESS;
  1474. }
  1475. Status CaffeWeightsParser::ParseFromMemory(const char *data, uint32_t size, ge::ComputeGraphPtr &graph) {
  1476. ErrorManager::GetInstance().SetStage(error_message::kModelCompile, error_message::kParser);
  1477. if (data == nullptr) {
  1478. REPORT_INNER_ERROR("E19999", "param data is nullptr.");
  1479. GELOGE(PARAM_INVALID, "[Check][Param]Caffe weights data is nullptr");
  1480. return PARAM_INVALID;
  1481. }
  1482. if (graph == nullptr) {
  1483. REPORT_INNER_ERROR("E19999", "param graph is nullptr.");
  1484. GELOGE(PARAM_INVALID, "[Check][Param]Caffe weights graph is nullptr");
  1485. return PARAM_INVALID;
  1486. }
  1487. // Resolve proto file to netparameter
  1488. NetParameter proto;
  1489. bool success = ge::parser::ReadProtoFromArray(data, static_cast<int>(size), &proto);
  1490. if (!success) {
  1491. REPORT_CALL_ERROR("E19999", "ReadProtoFromArray failed.");
  1492. GELOGE(domi::PARSE_WEIGHTS_FAILED, "[Read][Proto] from Memory fail");
  1493. return domi::PARSE_WEIGHTS_FAILED;
  1494. }
  1495. // Convert netparameter to opdef and save to graph
  1496. Status status = ConvertNetParameter(proto, graph);
  1497. GE_IF_BOOL_EXEC(status != SUCCESS, GELOGE(FAILED, "[Convert][NetParameter] failed, status=%d", status);
  1498. return domi::PARSE_WEIGHTS_FAILED;);
  1499. return SUCCESS;
  1500. }
  1501. Status CaffeWeightsParser::Parse(const char *file, ge::Graph &graph) {
  1502. ErrorManager::GetInstance().SetStage(error_message::kModelCompile, error_message::kParser);
  1503. GE_CHECK_NOTNULL(file);
  1504. ge::ComputeGraphPtr compute_graph = ge::GraphUtils::GetComputeGraph(graph);
  1505. GE_CHECK_NOTNULL(compute_graph);
  1506. Status ret = Parse(file, compute_graph);
  1507. if (ret != SUCCESS) {
  1508. GELOGE(ret, "[Parser][Weight] %s for graph %s failed.", file, ParserUtils::GetGraphName(graph).c_str());
  1509. return ret;
  1510. }
  1511. GELOGI("Parser weight for graph %s success.", ParserUtils::GetGraphName(graph).c_str());
  1512. return SUCCESS;
  1513. }
  1514. Status CaffeWeightsParser::Parse(const char *file, ge::ComputeGraphPtr &graph) {
  1515. if (file == nullptr) {
  1516. REPORT_INNER_ERROR("E19999", "param file is nullptr, check invalid.");
  1517. GELOGE(FAILED, "[Check][Param]Caffe weights parse fail, Parameter file invalid");
  1518. return PARAM_INVALID;
  1519. }
  1520. if (graph == nullptr) {
  1521. REPORT_INNER_ERROR("E19999", "param graph is nullptr, check invalid.");
  1522. GELOGE(FAILED, "[Check][Param]Caffe weights parse fail, Parameter graph invalid");
  1523. return PARAM_INVALID;
  1524. }
  1525. GELOGI("Parse weights file:%s", file);
  1526. string caffe_proto_path = ge::GetParserContext().caffe_proto_path + "caffe.proto";
  1527. string custom_proto_path = ge::GetParserContext().custom_proto_path + "custom.proto";
  1528. ProtoFileParser proto_file_parser;
  1529. GELOGD("caffe_proto_path:%s custom_proto_path:%s", caffe_proto_path.c_str(), custom_proto_path.c_str());
  1530. string fusion_proto_file;
  1531. string custom_proto_file = ge::parser::RealPath(custom_proto_path.c_str());
  1532. if (custom_proto_file.empty()) {
  1533. GELOGW("custom_proto_path:%s is not existed", custom_proto_path.c_str());
  1534. fusion_proto_file = caffe_proto_path;
  1535. } else {
  1536. if (proto_file_parser.CombineProtoFile(caffe_proto_path.c_str(), custom_proto_path.c_str(),\
  1537. fusion_proto_file) != SUCCESS) {
  1538. REPORT_INNER_ERROR("E19999", "CombineProtoFile failed, caffe_proto_path:%s, custom_proto_path:%s.",
  1539. caffe_proto_path.c_str(), custom_proto_path.c_str());
  1540. GELOGE(FAILED, "[Invoke][CombineProtoFile]Create tmp fusion proto file from caffe and custom proto failed.");
  1541. return FAILED;
  1542. }
  1543. }
  1544. string fusion_proto_path = ge::parser::RealPath(fusion_proto_file.c_str());
  1545. GELOGI("Get fusion proto file[%s]-[%s].", fusion_proto_file.c_str(), fusion_proto_path.c_str());
  1546. if (fusion_proto_path.empty()) {
  1547. REPORT_INNER_ERROR("E19999", "Fusion proto file path [%s] is not real existed.",
  1548. fusion_proto_file.c_str());
  1549. GELOGE(FAILED, "[Invoke][RealPath]Fusion proto file path [%s]-[%s] is not real existed.",
  1550. fusion_proto_file.c_str(), fusion_proto_path.c_str());
  1551. return FAILED;
  1552. }
  1553. string fusion_proto_name;
  1554. if (CheckPathValid(file, fusion_proto_file, fusion_proto_path, fusion_proto_name) != SUCCESS) {
  1555. GELOGE(FAILED, "[Check][PathValid] of weight file[%s] and tmp proto[%s] failed.", file,
  1556. fusion_proto_file.c_str());
  1557. return FAILED;
  1558. }
  1559. GELOGI("Start to parse weight: %s by fusion proto: %s.", file, fusion_proto_file.c_str());
  1560. Status status = ParseWeightByFusionProto(file, fusion_proto_path, fusion_proto_name, graph);
  1561. if (status != SUCCESS) {
  1562. GELOGE(FAILED, "[Invoke][ParseWeightByFusionProto] failed. ret:%u", status);
  1563. return status;
  1564. }
  1565. status = CheckNodes(graph);
  1566. if (status != SUCCESS) {
  1567. GELOGE(ge::GRAPH_FAILED, "[Check][Nodes] failed, status=%u", status);
  1568. return domi::PARSE_WEIGHTS_FAILED;
  1569. }
  1570. return SUCCESS;
  1571. }
  1572. Status CaffeWeightsParser::ParseWeightByFusionProto(const char *weight_path, const string &fusion_proto_path,
  1573. const string &fusion_proto_name, ge::ComputeGraphPtr &graph) {
  1574. google::protobuf::compiler::DiskSourceTree source_tree;
  1575. source_tree.MapPath(kProjectRoot, fusion_proto_path);
  1576. google::protobuf::compiler::Importer importer(&source_tree, nullptr);
  1577. importer.Import(fusion_proto_name.c_str());
  1578. GELOGI("Import fusion proto %s success, proto_name %s.", fusion_proto_path.c_str(), fusion_proto_name.c_str());
  1579. const google::protobuf::Descriptor *descriptor = importer.pool()->FindMessageTypeByName(kBeginningMessageType);
  1580. if (descriptor == nullptr) {
  1581. REPORT_INPUT_ERROR("E11032", std::vector<std::string>({"message_type", "name", "reason"}),
  1582. std::vector<std::string>({"weight", "NetParameter",
  1583. "Does not find domi.caffe.NetParameter in google::protobuf::Descriptor."}));
  1584. GELOGE(FAILED, "[Invoke][FindMessageTypeByName]Does not find domi.caffe.NetParameter in "
  1585. "google::protobuf::Descriptor, which may be caused by problematic fusion proto.");
  1586. return FAILED;
  1587. }
  1588. google::protobuf::DynamicMessageFactory factory;
  1589. const google::protobuf::Message *proto = factory.GetPrototype(descriptor);
  1590. GE_CHECK_NOTNULL(proto);
  1591. google::protobuf::Message *message = proto->New();
  1592. GE_CHECK_NOTNULL(message);
  1593. if (!ge::parser::ReadProtoFromBinaryFile(weight_path, message)) {
  1594. delete message;
  1595. message = nullptr;
  1596. REPORT_CALL_ERROR("E19999", "ReadProtoFromBinaryFile based on fusion proto failed from weight file:%s.",
  1597. weight_path);
  1598. GELOGE(FAILED, "[Invoke][ReadProtoFromBinaryFile] %s failed.", weight_path);
  1599. return FAILED;
  1600. }
  1601. GELOGI("Start to parse weight file: %s.", weight_path);
  1602. const google::protobuf::Descriptor *layer_descriptor = importer.pool()->FindMessageTypeByName(kLayerMessageType);
  1603. if (layer_descriptor == nullptr) {
  1604. delete message;
  1605. message = nullptr;
  1606. REPORT_INPUT_ERROR("E11032", std::vector<std::string>({"message_type", "name", "reason"}),
  1607. std::vector<std::string>({"weight", "NetParameter",
  1608. "Does not find domi.caffe.LayerParameter in google::protobuf::Descriptor"}));
  1609. GELOGE(FAILED,
  1610. "[Invoke][FindMessageTypeByName]Does not find domi.caffe.LayerParameter in google::protobuf::Descriptor");
  1611. return FAILED;
  1612. }
  1613. if (CheckLayersSize(*message) != SUCCESS) {
  1614. delete message;
  1615. message = nullptr;
  1616. return FAILED;
  1617. }
  1618. if (ParseLayerParameter(*layer_descriptor, *message, graph) != SUCCESS) {
  1619. delete message;
  1620. message = nullptr;
  1621. REPORT_CALL_ERROR("E19999", "ParseLayerParameter failed failed from weight file:%s.", weight_path);
  1622. GELOGE(FAILED, "[Parse][LayerParameter] failed.");
  1623. return FAILED;
  1624. }
  1625. delete message;
  1626. message = nullptr;
  1627. GELOGI("Parse weight: %s by proto: %s success.", weight_path, fusion_proto_path.c_str());
  1628. return SUCCESS;
  1629. }
  1630. Status CaffeWeightsParser::ParseLayerParameter(const google::protobuf::Descriptor &layer_descriptor,
  1631. const google::protobuf::Message &message,
  1632. ge::ComputeGraphPtr &graph) {
  1633. auto field_name = layer_descriptor.FindFieldByName(kFieldName);
  1634. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(field_name, "Does not find name in google::protobuf::Descriptor");
  1635. auto field_type = layer_descriptor.FindFieldByName(kFieldType);
  1636. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(field_type, "Does not find type in google::protobuf::Descriptor");
  1637. const google::protobuf::Reflection *reflection = message.GetReflection();
  1638. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(reflection, "Get Reflection failed in google::protobuf::Message");
  1639. vector<const google::protobuf::FieldDescriptor *> field_desc;
  1640. reflection->ListFields(message, &field_desc);
  1641. NetParameter tmp_net;
  1642. for (auto &field : field_desc) {
  1643. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(field, "Get FieldDescriptor failed in google::protobuf::Message");
  1644. // Only care about layers
  1645. GE_CHECK_NOTNULL(field);
  1646. if (field->name() != kLayerName) {
  1647. continue;
  1648. }
  1649. if (!field->is_repeated()) {
  1650. REPORT_INPUT_ERROR("E11032", std::vector<std::string>({"message_type", "name", "reason"}),
  1651. std::vector<std::string>({"weight", field->name(), "LayerParameter should be repeated"}));
  1652. GELOGE(FAILED, "[Check][Param] LayerParameter should be repeated, field:%s.", field->name().c_str());
  1653. return FAILED;
  1654. }
  1655. int field_size = reflection->FieldSize(message, field);
  1656. GELOGI("Total Layer num of model file is %d", field_size);
  1657. for (int i = 0; i < field_size; ++i) {
  1658. const google::protobuf::Message &layer_message = reflection->GetRepeatedMessage(message, field, i);
  1659. LayerParameter *layer = tmp_net.add_layer();
  1660. if (ConvertLayerProto(layer_message, layer) != SUCCESS) {
  1661. GELOGE(FAILED, "[Invoke][ConvertLayerProto] Convert message to layer proto failed.");
  1662. return FAILED;
  1663. }
  1664. const string &layer_name = layer->name();
  1665. if (skiped_layer_type_.find(layer->type()) != skiped_layer_type_.end()) {
  1666. GELOGI("Skip layer %s", layer_name.c_str());
  1667. continue;
  1668. }
  1669. GELOGI("Parse layer %s", layer_name.c_str());
  1670. auto ret = ConvertLayerParameter(layer, graph);
  1671. if (ret != SUCCESS) {
  1672. return ret;
  1673. }
  1674. }
  1675. }
  1676. return SUCCESS;
  1677. }
  1678. Status CaffeWeightsParser::ConvertLayerProto(const google::protobuf::Message &message,
  1679. google::protobuf::Message *layer) {
  1680. const google::protobuf::Reflection *layer_reflection = message.GetReflection();
  1681. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(layer_reflection, "Get Reflection failed in google::protobuf::Message");
  1682. vector<const google::protobuf::FieldDescriptor *> field_desc;
  1683. layer_reflection->ListFields(message, &field_desc);
  1684. for (auto &field : field_desc) {
  1685. GE_CHECK_NOTNULL(field);
  1686. if (ParseLayerField(*layer_reflection, message, *field, layer) != SUCCESS) {
  1687. GELOGE(FAILED, "[Invoke][ParseLayerField] Parse field %s failed.", field->name().c_str());
  1688. return FAILED;
  1689. }
  1690. }
  1691. return SUCCESS;
  1692. }
  1693. Status CaffeWeightsParser::ParseLayerField(const google::protobuf::Reflection &reflection,
  1694. const google::protobuf::Message &message,
  1695. const google::protobuf::FieldDescriptor &field,
  1696. google::protobuf::Message *layer) const {
  1697. GELOGD("Start to parse field: %s.", field.name().c_str());
  1698. domi::caffe::LayerParameter *layer_proto = PtrToPtr<google::protobuf::Message, domi::caffe::LayerParameter>(layer);
  1699. string filed_name = field.name();
  1700. #define CASE_FIELD_NAME(kName, method, inner_message, field_ptr) \
  1701. if (filed_name == kField##kName) { \
  1702. string value = reflection.GetString(inner_message, field_ptr); \
  1703. GELOGD("Parse res: (%s : %s)", filed_name.c_str(), value.c_str()); \
  1704. layer_proto->set_##method(value); \
  1705. return SUCCESS; \
  1706. }
  1707. CASE_FIELD_NAME(Name, name, message, &field);
  1708. CASE_FIELD_NAME(Type, type, message, &field);
  1709. #undef CASE_FIELD_NAME
  1710. #define CASE_FIELD_NAME_REPEATED(kName, method, inner_message, field_ptr) \
  1711. if (filed_name == kField##kName) { \
  1712. int field_size = reflection.FieldSize(inner_message, field_ptr); \
  1713. for (int i = 0; i < field_size; ++i) { \
  1714. auto value = reflection.GetRepeatedString(inner_message, field_ptr, i); \
  1715. layer_proto->add_##method(value); \
  1716. } \
  1717. return SUCCESS; \
  1718. }
  1719. CASE_FIELD_NAME_REPEATED(Bottom, bottom, message, &field);
  1720. CASE_FIELD_NAME_REPEATED(Top, top, message, &field);
  1721. #undef CASE_FIELD_NAME_REPEATED
  1722. if (filed_name == kFieldBlobs) {
  1723. int field_size = reflection.FieldSize(message, &field);
  1724. for (int i = 0; i < field_size; ++i) {
  1725. domi::caffe::BlobProto *item_message = layer_proto->add_blobs();
  1726. const google::protobuf::Message &sub_message = reflection.GetRepeatedMessage(message, &field, i);
  1727. if (ConvertBlobsProto(sub_message, item_message) != SUCCESS) {
  1728. GELOGE(FAILED, "[Invoke][ConvertBlobsProto] ParseLayerField of field: %s failed.", field.name().c_str());
  1729. return FAILED;
  1730. }
  1731. }
  1732. return SUCCESS;
  1733. }
  1734. if (filed_name == kFieldConvParam) {
  1735. const google::protobuf::Message &sub_message = reflection.GetMessage(message, &field);
  1736. ConvolutionParameter *conv_param = layer_proto->mutable_convolution_param();
  1737. ConvertConvParamProto(sub_message, conv_param);
  1738. }
  1739. if (filed_name == kFieldInnerPro) {
  1740. const google::protobuf::Message &sub_message = reflection.GetMessage(message, &field);
  1741. InnerProductParameter *inner_product = layer_proto->mutable_inner_product_param();
  1742. ConvertInnerProdcutProto(sub_message, inner_product);
  1743. }
  1744. return SUCCESS;
  1745. }
  1746. Status CaffeWeightsParser::ConvertBlobsProto(const google::protobuf::Message &message,
  1747. google::protobuf::Message *blobs) const {
  1748. const google::protobuf::Reflection *blobs_reflection = message.GetReflection();
  1749. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(blobs_reflection, "Get Reflection failed in google::protobuf::Message");
  1750. vector<const google::protobuf::FieldDescriptor *> field_desc;
  1751. blobs_reflection->ListFields(message, &field_desc);
  1752. domi::caffe::BlobProto *blobs_proto = PtrToPtr<google::protobuf::Message, domi::caffe::BlobProto>(blobs);
  1753. for (auto &field : field_desc) {
  1754. GE_CHECK_NOTNULL(field);
  1755. string feild_name = field->name();
  1756. #define CASE_BLOBS_FIELD_NAME_REPEATED(kName, method, valuetype, name, inner_message, inner_field) \
  1757. if (feild_name == #kName) { \
  1758. int field_size = blobs_reflection->FieldSize(inner_message, inner_field); \
  1759. for (int i = 0; i < field_size; ++i) { \
  1760. valuetype value = blobs_reflection->GetRepeated##method(inner_message, inner_field, i); \
  1761. blobs_proto->add_##name(value); \
  1762. } \
  1763. continue; \
  1764. }
  1765. CASE_BLOBS_FIELD_NAME_REPEATED(data, Float, float, data, message, field);
  1766. CASE_BLOBS_FIELD_NAME_REPEATED(diff, Float, float, diff, message, field);
  1767. CASE_BLOBS_FIELD_NAME_REPEATED(double_data, Double, double, double_data, message, field);
  1768. CASE_BLOBS_FIELD_NAME_REPEATED(double_diff, Double, double, double_diff, message, field);
  1769. CASE_BLOBS_FIELD_NAME_REPEATED(int32_data, Int32, int32_t, int32_data, message, field);
  1770. CASE_BLOBS_FIELD_NAME_REPEATED(uint64_data, UInt64, uint64_t, uint64_data, message, field);
  1771. #undef CASE_BLOBS_FIELD_NAME_REPEATED
  1772. #define CASE_BLOBS_FIELD_NAME(kName, method, valuetype, name, inner_message, inner_field) \
  1773. if (feild_name == #kName) { \
  1774. valuetype value = blobs_reflection->Get##method(inner_message, inner_field); \
  1775. blobs_proto->set_##name(value); \
  1776. continue; \
  1777. }
  1778. CASE_BLOBS_FIELD_NAME(int8_data, String, string, int8_data, message, field);
  1779. CASE_BLOBS_FIELD_NAME(num, Int32, int32_t, num, message, field);
  1780. CASE_BLOBS_FIELD_NAME(channels, Int32, int32_t, channels, message, field);
  1781. CASE_BLOBS_FIELD_NAME(height, Int32, int32_t, height, message, field);
  1782. CASE_BLOBS_FIELD_NAME(width, Int32, int32_t, width, message, field);
  1783. #undef CASE_BLOBS_FIELD_NAME
  1784. if (feild_name == kFieldShape) {
  1785. const google::protobuf::Message &sub_message = blobs_reflection->GetMessage(message, field);
  1786. domi::caffe::BlobShape *blob_shape = blobs_proto->mutable_shape();
  1787. ConvertBlobShapeProto(sub_message, blob_shape);
  1788. }
  1789. }
  1790. return SUCCESS;
  1791. }
  1792. Status CaffeWeightsParser::ConvertBlobShapeProto(const google::protobuf::Message &message,
  1793. google::protobuf::Message *dest_message) const {
  1794. const google::protobuf::Reflection *reflection = message.GetReflection();
  1795. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(reflection, "Get Reflection failed in google::protobuf::Message");
  1796. vector<const google::protobuf::FieldDescriptor *> field_desc;
  1797. reflection->ListFields(message, &field_desc);
  1798. domi::caffe::BlobShape *shape_proto = PtrToPtr<google::protobuf::Message, domi::caffe::BlobShape>(dest_message);
  1799. for (auto &field : field_desc) {
  1800. if (field->name() != kFieldDim) {
  1801. continue;
  1802. }
  1803. int field_size = reflection->FieldSize(message, field);
  1804. for (int i = 0; i < field_size; ++i) {
  1805. int64_t value = reflection->GetRepeatedInt64(message, field, i);
  1806. shape_proto->add_dim(value);
  1807. }
  1808. }
  1809. return SUCCESS;
  1810. }
  1811. Status CaffeWeightsParser::ConvertConvParamProto(const google::protobuf::Message &message,
  1812. google::protobuf::Message *dest_message) const {
  1813. const google::protobuf::Reflection *reflection = message.GetReflection();
  1814. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(reflection, "Get Reflection failed in google::protobuf::Message");
  1815. vector<const google::protobuf::FieldDescriptor *> field_desc;
  1816. reflection->ListFields(message, &field_desc);
  1817. domi::caffe::ConvolutionParameter *conv_param_proto =
  1818. PtrToPtr<google::protobuf::Message, domi::caffe::ConvolutionParameter>(dest_message);
  1819. for (auto &field : field_desc) {
  1820. if (field->name() != kFieldBiasTerm) {
  1821. continue;
  1822. }
  1823. bool value = reflection->GetBool(message, field);
  1824. conv_param_proto->set_bias_term(value);
  1825. }
  1826. return SUCCESS;
  1827. }
  1828. Status CaffeWeightsParser::ConvertInnerProdcutProto(const google::protobuf::Message &message,
  1829. google::protobuf::Message *dest_message) const {
  1830. const google::protobuf::Reflection *reflection = message.GetReflection();
  1831. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(reflection, "Get Reflection failed in google::protobuf::Message");
  1832. vector<const google::protobuf::FieldDescriptor *> field_desc;
  1833. reflection->ListFields(message, &field_desc);
  1834. domi::caffe::InnerProductParameter *inner_product_proto =
  1835. PtrToPtr<google::protobuf::Message, domi::caffe::InnerProductParameter>(dest_message);
  1836. for (auto &field : field_desc) {
  1837. if (field->name() != kFieldBiasTerm) {
  1838. continue;
  1839. }
  1840. bool value = reflection->GetBool(message, field);
  1841. inner_product_proto->set_bias_term(value);
  1842. }
  1843. return SUCCESS;
  1844. }
  1845. Status CaffeWeightsParser::CheckLayersSize(const google::protobuf::Message &message) const {
  1846. const google::protobuf::Reflection *reflection = message.GetReflection();
  1847. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(reflection, "Get Reflection failed in google::protobuf::Message");
  1848. vector<const google::protobuf::FieldDescriptor *> field_desc;
  1849. reflection->ListFields(message, &field_desc);
  1850. int num_layer = 0;
  1851. int num_layers = 0;
  1852. for (auto &field : field_desc) {
  1853. CAFFE_CHECK_NULL_AND_REPROT_ERRORMSG(field, "Get FieldDescriptor failed in google::protobuf::Message");
  1854. // Only care about layers
  1855. if (field->name() != kLayerName && field->name() != kLayersName) {
  1856. continue;
  1857. }
  1858. if (!field->is_repeated()) {
  1859. REPORT_INPUT_ERROR("E11032", std::vector<std::string>({"message_type", "name", "reason"}),
  1860. std::vector<std::string>({"weight", field->name(), "LayerParameter should be repeated"}));
  1861. GELOGE(FAILED, "[Check][Param] LayerParameter should be repeated. field:%s", field->name().c_str());
  1862. return FAILED;
  1863. }
  1864. int field_size = reflection->FieldSize(message, field);
  1865. if (field->name() == kLayerName) {
  1866. num_layer = field_size;
  1867. } else {
  1868. num_layers = field_size;
  1869. }
  1870. }
  1871. if (num_layer == 0 && num_layers > 0) {
  1872. ErrorManager::GetInstance().ATCReportErrMessage("E11023");
  1873. GELOGE(FAILED, "[Check][Param]The weight file is consisted of layers-structure which is deprecated "
  1874. "in Caffe and unsupported in ATC. The \"layers\" should be changed to \"layer\".");
  1875. return FAILED;
  1876. }
  1877. if (num_layer == 0) {
  1878. ErrorManager::GetInstance().ATCReportErrMessage("E11024");
  1879. GELOGE(FAILED, "[Check][Param] Weight layer num is zero, weight file may be invalid.");
  1880. return FAILED;
  1881. }
  1882. return SUCCESS;
  1883. }
  1884. Status CaffeWeightsParser::ConvertLayerParameter(const google::protobuf::Message *layer_message,
  1885. ge::ComputeGraphPtr &graph) {
  1886. vector<string> need_share_layers;
  1887. const domi::caffe::LayerParameter *layer =
  1888. PtrToPtr<google::protobuf::Message, domi::caffe::LayerParameter>(layer_message);
  1889. const string &shared_layer_name = layer->name();
  1890. const string &layer_type = layer->type();
  1891. for (auto p_iter = params_share_map.begin(); p_iter != params_share_map.end(); ++p_iter) {
  1892. if (find(p_iter->second.begin(), p_iter->second.end(), shared_layer_name) != p_iter->second.end()) {
  1893. GELOGI("layer:%s need share weights !", shared_layer_name.c_str());
  1894. need_share_layers = p_iter->second;
  1895. }
  1896. }
  1897. if (need_share_layers.size() == 0) {
  1898. need_share_layers.push_back(shared_layer_name);
  1899. }
  1900. for (auto share_iter = need_share_layers.begin(); share_iter != need_share_layers.end(); ++share_iter) {
  1901. // Find created nodes
  1902. string layer_name = *share_iter;
  1903. GE_IF_BOOL_EXEC(layer_name_record_map_.find(layer_name) != layer_name_record_map_.end(),
  1904. string temp_layer_name = layer_name;
  1905. // duplicate operator modification
  1906. layer_name = temp_layer_name + "_same_" + std::to_string(layer_name_record_map_[temp_layer_name]);
  1907. // Times accumulation of duplicate operators
  1908. layer_name_record_map_[temp_layer_name]++;
  1909. // Set the name in proto and layer
  1910. )
  1911. ge::NodePtr node = graph->FindNode(layer_name);
  1912. layer_name_record_map_.insert(std::make_pair(layer_name, kNumOne));
  1913. if (node == nullptr) {
  1914. // If there are redundant layers in the weight file, they should be skipped rather than returned with an error.
  1915. GELOGI("Layer %s not found in graph", layer_name.c_str());
  1916. continue;
  1917. }
  1918. // The weight processing also needs to judge the duplicate operator, which is reserved here and processed later.
  1919. std::map<std::string, std::string>::const_iterator iter = caffe_op_map.find(layer_type);
  1920. if (iter == caffe_op_map.end()) {
  1921. GELOGW("Unrecognized layer type %s , layer name: %s, layer ignored.", layer_type.c_str(), layer_name.c_str());
  1922. continue;
  1923. }
  1924. GELOGD("Caffe layer name: %s , layer type: %s.", layer_name.c_str(), layer_type.c_str());
  1925. string op_type = iter->second;
  1926. // create OpParser
  1927. std::shared_ptr<OpParserFactory> factory = OpParserFactory::Instance(domi::CAFFE);
  1928. GE_CHECK_NOTNULL(factory);
  1929. std::shared_ptr<OpParser> op_parser = factory->CreateOpParser(op_type);
  1930. if (op_parser.get() == nullptr) {
  1931. REPORT_INPUT_ERROR("E11009", std::vector<std::string>({"opname", "optype"}),
  1932. std::vector<std::string>({layer_name, op_type}));
  1933. GELOGE(FAILED, "[Create][OpParser] failed for Op[%s], optype is %s", layer_name.c_str(), op_type.c_str());
  1934. return FAILED;
  1935. }
  1936. // Parsing weight information through op parser
  1937. Status status = op_parser->ParseWeights(layer_message, node);
  1938. if (status != SUCCESS) {
  1939. REPORT_CALL_ERROR("E19999", "Parse weight for op:%s(%s) failed", layer_name.c_str(), op_type.c_str());
  1940. GELOGE(FAILED, "[Parse][Weights] for op[%s] failed", layer_name.c_str());
  1941. return status;
  1942. }
  1943. }
  1944. return SUCCESS;
  1945. }
  1946. Status CaffeWeightsParser::CheckNodes(ge::ComputeGraphPtr &graph) {
  1947. GE_CHECK_NOTNULL(graph);
  1948. for (const ge::NodePtr &node : graph->GetAllNodes()) {
  1949. GE_CHECK_NOTNULL(node);
  1950. auto op_desc = node->GetOpDesc();
  1951. GE_CHECK_NOTNULL(op_desc);
  1952. for (const auto &in_anchor_ptr : node->GetAllInDataAnchors()) {
  1953. if (op_desc->GetType() == ge::parser::DATA || op_desc->GetType() == ge::parser::CONSTANT) {
  1954. continue;
  1955. }
  1956. auto index = in_anchor_ptr->GetIdx();
  1957. auto input_desc = op_desc->MutableInputDesc(index);
  1958. if (in_anchor_ptr->GetPeerAnchors().empty() && input_desc != nullptr) {
  1959. if (layer_name_record_map_.find(node->GetName()) == layer_name_record_map_.end()) {
  1960. ErrorManager::GetInstance().ATCReportErrMessage("E11029", {"opname"}, {node->GetName()});
  1961. GELOGE(ge::GRAPH_FAILED, "[Find][Node] Op[%s] in model file does not exist in weight file.",
  1962. node->GetName().c_str());
  1963. PreChecker::Instance().RefreshErrorMessageByName(node->GetName(), PreChecker::ErrorCode::PARAM_INVALID,
  1964. "Node does not exist in weight file.");
  1965. } else {
  1966. REPORT_INNER_ERROR("E19999", "Op:%s(%s)'s input %d is not linked, check invalid",
  1967. node->GetName().c_str(), node->GetType().c_str(), in_anchor_ptr->GetIdx());
  1968. GELOGE(ge::GRAPH_FAILED, "[Check][Param] Op[%s]'s input %d is not linked.", node->GetName().c_str(),
  1969. in_anchor_ptr->GetIdx());
  1970. string check_msg = "input " + to_string(in_anchor_ptr->GetIdx()) + "is not linked in weight file";
  1971. PreChecker::Instance().RefreshErrorMessageByName(node->GetName(), PreChecker::ErrorCode::PARAM_INVALID,
  1972. check_msg);
  1973. }
  1974. return FAILED;
  1975. }
  1976. }
  1977. }
  1978. return SUCCESS;
  1979. }
  1980. Status CaffeWeightsParser::ConvertNetParameter(const NetParameter &param, ge::ComputeGraphPtr &graph) {
  1981. GE_CHECK_NOTNULL(graph);
  1982. int num_layer = param.layer_size();
  1983. int num_layers = param.layers_size();
  1984. // Operator name and occurrence map, handle duplicate operators
  1985. std::map<std::string, int32_t> layer_name_map;
  1986. if (num_layer == 0 && num_layers > 0) {
  1987. ErrorManager::GetInstance().ATCReportErrMessage("E11023");
  1988. GELOGE(FAILED, "[Check][Param] The weight file is consisted of layers-structure "
  1989. "which is deprecated in Caffe and unsupported in ATC. "
  1990. "The \"layers\" should be changed to \"layer\".");
  1991. return FAILED;
  1992. }
  1993. if (num_layer == 0) {
  1994. ErrorManager::GetInstance().ATCReportErrMessage("E11024");
  1995. GELOGE(FAILED, "weight layer num is zero, weight file may be invalid.");
  1996. return FAILED;
  1997. }
  1998. for (int i = 0; i < num_layer; ++i) {
  1999. const LayerParameter &layer = param.layer(i);
  2000. const string &param_layer_name = layer.name();
  2001. // Skip some layer types
  2002. if (skiped_layer_type_.find(layer.type()) != skiped_layer_type_.end()) {
  2003. GELOGI("Skip layer %s", param_layer_name.c_str());
  2004. continue;
  2005. }
  2006. GELOGI("Parse layer %s", param_layer_name.c_str());
  2007. vector<string> need_share_layers;
  2008. for (auto p_iter = params_share_map.begin(); p_iter != params_share_map.end(); ++p_iter) {
  2009. if (find(p_iter->second.begin(), p_iter->second.end(), param_layer_name) != p_iter->second.end()) {
  2010. GELOGI("Layer: %s need share weights !", param_layer_name.c_str());
  2011. need_share_layers = p_iter->second;
  2012. }
  2013. }
  2014. if (need_share_layers.size() == 0) {
  2015. need_share_layers.push_back(param_layer_name);
  2016. }
  2017. for (auto share_iter = need_share_layers.begin(); share_iter != need_share_layers.end(); ++share_iter) {
  2018. // Find created nodes
  2019. string layer_name = *share_iter;
  2020. GE_IF_BOOL_EXEC(layer_name_map.find(layer_name) != layer_name_map.end(), string temp_layer_name = layer_name;
  2021. // duplicate operator modification
  2022. layer_name = temp_layer_name + "_same_" + std::to_string(layer_name_map[temp_layer_name]);
  2023. // Times accumulation of duplicate operators
  2024. layer_name_map[temp_layer_name]++;
  2025. // Set the name in proto and layer
  2026. )
  2027. ge::NodePtr node = graph->FindNode(layer_name);
  2028. layer_name_map.insert(std::make_pair(layer_name, kNumOne));
  2029. if (node == nullptr) {
  2030. // If there are redundant layers in the weight file, they should be skipped rather than returned with an error.
  2031. GELOGI("Layer %s not found in graph", layer_name.c_str());
  2032. continue;
  2033. }
  2034. // The weight processing also needs to judge the duplicate operator, which is reserved here and processed later.
  2035. std::map<std::string, std::string>::const_iterator iter = caffe_op_map.find(layer.type());
  2036. if (iter == caffe_op_map.end()) {
  2037. GELOGW("Unrecognized layer type %s , layer name: %s, layer ignored.", layer.type().c_str(), layer_name.c_str());
  2038. continue;
  2039. }
  2040. GELOGD("Caffe layer name: %s , layer type: %s.", layer_name.c_str(), layer.type().c_str());
  2041. string op_type = iter->second;
  2042. // create OpParser
  2043. std::shared_ptr<OpParserFactory> factory = OpParserFactory::Instance(domi::CAFFE);
  2044. GE_CHECK_NOTNULL(factory);
  2045. std::shared_ptr<OpParser> op_parser = factory->CreateOpParser(op_type);
  2046. if (op_parser.get() == nullptr) {
  2047. REPORT_INPUT_ERROR("E11009", std::vector<std::string>({"opname", "optype"}),
  2048. std::vector<std::string>({layer_name, op_type}));
  2049. GELOGE(FAILED, "[Create][OpParser] failed for Op[%s], optype is %s", layer_name.c_str(), op_type.c_str());
  2050. return FAILED;
  2051. }
  2052. // Parsing weight information through op parser
  2053. Status status = op_parser->ParseWeights(&layer, node);
  2054. if (status != SUCCESS) {
  2055. REPORT_CALL_ERROR("E19999", "Parse weight for op:%s(%s) failed", layer_name.c_str(), op_type.c_str());
  2056. GELOGE(FAILED, "[Parse][Weights] for op[%s] failed", layer_name.c_str());
  2057. return status;
  2058. }
  2059. }
  2060. }
  2061. return SUCCESS;
  2062. }
  2063. Status CaffeModelParser::ParseProto(const google::protobuf::Message *proto, ge::ComputeGraphPtr &graph) {
  2064. (void)proto;
  2065. (void)graph;
  2066. return SUCCESS;
  2067. }
  2068. Status CaffeModelParser::ParseProtoWithSubgraph(const google::protobuf::Message *root_proto,
  2069. domi::GetGraphCallback callback,
  2070. ge::ComputeGraphPtr &graph) {
  2071. (void)root_proto;
  2072. (void)callback;
  2073. (void)graph;
  2074. return SUCCESS;
  2075. }
  2076. } // namespace ge
  2077. namespace domi {
  2078. REGISTER_MODEL_PARSER_CREATOR(CAFFE, ge::CaffeModelParser);
  2079. REGISTER_WEIGHTS_PARSER_CREATOR(CAFFE, ge::CaffeWeightsParser);
  2080. }