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.

scope_graph_impl.h 8.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * Copyright 2020 Huawei Technologies Co., Ltd
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #ifndef REGISTER_SCOPE_SCOPE_GRAPH_IMPL_H_
  17. #define REGISTER_SCOPE_SCOPE_GRAPH_IMPL_H_
  18. #include "external/register/scope/scope_fusion_pass_register.h"
  19. #include "graph/operator_factory.h"
  20. #include "proto/tensorflow/graph.pb.h"
  21. #include "proto/tensorflow/node_def.pb.h"
  22. #include "graph/utils/type_utils.h"
  23. namespace ge {
  24. using FusionInnerNodesInfo = std::vector<std::tuple<std::string, std::string, // name, type
  25. std::vector<std::pair<std::string, int32_t>>, // inputs
  26. std::vector<std::pair<std::string, int32_t>>, // outputs
  27. const ge::Operator *>>; // operator
  28. class Scope::ScopeImpl {
  29. public:
  30. ScopeImpl() : father_scope_(nullptr) {}
  31. Status Init(const std::string &name, const std::string &sub_type = "", Scope *father_scope = nullptr);
  32. ~ScopeImpl();
  33. const std::string &Name() const { return name_; }
  34. const std::string &SubType() const { return sub_type_; }
  35. void SetSubType(const std::string &sub_type) { sub_type_ = sub_type; }
  36. void ClearTypeAndSubType();
  37. void AddNode(ge::OperatorPtr &node_def);
  38. const std::vector<ge::OperatorPtr> &Nodes() const { return nodes_; }
  39. const std::unordered_map<std::string, ge::OperatorPtr> &AllNodesMap();
  40. void AddSubScope(Scope *scope) { sub_scopes_[scope->Name()] = scope; }
  41. Scope *GetSubScope(const std::string &scope_name) const;
  42. const std::unordered_map<std::string, Scope *> &GetSubScopes() const { return sub_scopes_; }
  43. const std::vector<Scope *> &GetAllSubScopes();
  44. int32_t GetOpTypeNum(const std::string &op_type) const;
  45. void OpsNumInc(const std::string &op_type);
  46. const std::string LastName() const;
  47. const Scope *GetFatherScope() const { return father_scope_; }
  48. // trim scope_index
  49. static std::string TrimScopeIndex(const std::string &scope_name);
  50. private:
  51. std::string name_;
  52. std::string sub_type_;
  53. Scope *father_scope_;
  54. std::unordered_map<std::string, int32_t> op_nums_;
  55. std::unordered_map<std::string, Scope *> sub_scopes_;
  56. std::vector<ge::OperatorPtr> nodes_;
  57. std::unordered_map<std::string, ge::OperatorPtr> all_nodes_map_;
  58. std::vector<Scope *> all_sub_scopes_;
  59. };
  60. class FusionScopesResult::InnerNodeInfo::InnerNodeInfoImpl {
  61. public:
  62. explicit InnerNodeInfoImpl(const std::string &fusion_node_name) : fusion_node_name_(fusion_node_name) {}
  63. InnerNodeInfoImpl(const std::string &fusion_node_name, const std::string &name, const std::string &type)
  64. : fusion_node_name_(fusion_node_name), name_(name), type_(type) {
  65. SetName(name);
  66. }
  67. ~InnerNodeInfoImpl();
  68. std::string GetFullNodeName(const std::string &relative_name);
  69. void SetName(const std::string &name) { name_ = GetFullNodeName(name); }
  70. void SetType(const std::string &type) { type_ = type; }
  71. void InsertInput(const std::string &input_node, int32_t peer_out_idx);
  72. void InsertOutput(const std::string &output_node, int32_t peer_in_idx);
  73. ge::graphStatus BuildOperator();
  74. ge::graphStatus SetInputFormat(const std::string &input_name, const std::string &format) ;
  75. ge::graphStatus SetOutputFormat(const std::string &output_name, const std::string &format);
  76. ge::graphStatus SetDynamicInputFormat(const std::string &input_name, uint32_t index, const std::string &format);
  77. ge::graphStatus SetDynamicOutputFormat(const std::string &output_name, uint32_t index, const std::string &format);
  78. std::string GetName() const { return name_; }
  79. std::string GetType() const { return type_; }
  80. std::vector<std::pair<std::string, int32_t>> GetInputs() const { return inner_node_inputs_; }
  81. std::vector<std::pair<std::string, int32_t>> GetOutputs() const { return inner_node_outputs_; }
  82. ge::Operator *MutableOperator() { return &operator_; }
  83. public:
  84. ge::Operator operator_;
  85. private:
  86. std::string fusion_node_name_;
  87. std::string name_;
  88. std::string type_;
  89. std::vector<std::pair<std::string, int32_t>> inner_node_inputs_;
  90. std::vector<std::pair<std::string, int32_t>> inner_node_outputs_;
  91. };
  92. class FusionScopesResult::FusionScopesResultImpl {
  93. public:
  94. FusionScopesResultImpl() {}
  95. ~FusionScopesResultImpl(){};
  96. void SetName(const std::string &name) { name_ = name; }
  97. void SetType(const std::string &type) { type_ = type; }
  98. void SetDescription(const std::string &description) { description_ = description; }
  99. const std::string &Name() const { return name_; }
  100. const std::string &Type() const { return type_; }
  101. const std::string &Description() const { return description_; }
  102. void AddNodes(std::vector<ge::OperatorPtr> nodes);
  103. const std::vector<ge::OperatorPtr> &Nodes() const { return nodes_; }
  104. void AddScopes(const std::vector<Scope *> &scopes) { scopes_.insert(scopes_.end(), scopes.begin(), scopes.end()); }
  105. const std::vector<Scope *> &Scopes() const { return scopes_; }
  106. const std::unordered_map<std::string, std::vector<int32_t>> &GetInputs() const { return inputs_; }
  107. const std::unordered_map<std::string, std::vector<int32_t>> &GetOutputs() const { return outputs_; }
  108. void InsertInputs(const std::string &inner_op_name, const std::vector<int32_t> &index_map);
  109. void InsertOutputs(const std::string &inner_op_name, const std::vector<int32_t> &index_map);
  110. bool FindNodes(const std::string &node_name) const;
  111. bool FindScopes(const std::string &scope_name) const;
  112. InnerNodeInfo *AddInnerNode(const string &name, const string &type);
  113. InnerNodeInfo *MutableRecentInnerNode();
  114. InnerNodeInfo *MutableInnerNode(uint32_t index);
  115. FusionInnerNodesInfo GetInnerNodesInfo();
  116. ge::graphStatus CheckInnerNodesInfo();
  117. private:
  118. std::string name_;
  119. std::string type_;
  120. std::string description_;
  121. std::vector<Scope *> scopes_;
  122. std::vector<ge::OperatorPtr> nodes_;
  123. std::unordered_map<std::string, std::vector<int32_t>> inputs_;
  124. std::unordered_map<std::string, std::vector<int32_t>> outputs_;
  125. std::vector<InnerNodeInfo> inner_node_infos_;
  126. };
  127. class ScopeTree::ScopeTreeImpl {
  128. public:
  129. ScopeTreeImpl() : root_(nullptr) {}
  130. ScopeTreeImpl(const ScopeTreeImpl &) = delete;
  131. ScopeTreeImpl &operator=(const ScopeTreeImpl &) = delete;
  132. Status Init();
  133. ~ScopeTreeImpl();
  134. void AddNodeToScope(ge::OperatorPtr &node_def);
  135. const std::vector<Scope *> &GetAllScopes() const { return scopes_; }
  136. const Scope *Root() const { return root_; }
  137. private:
  138. std::vector<std::string> SplitNodeName(const std::string &node_name, char delim) const;
  139. Scope *root_;
  140. std::vector<Scope *> scopes_;
  141. };
  142. struct ScopeFusionOpInfo {
  143. std::string node_name;
  144. std::string fusion_node_name;
  145. std::string fusion_op_type;
  146. std::string description;
  147. bool scope_pass = true;
  148. };
  149. class ScopeGraph::ScopeGraphImpl {
  150. public:
  151. ScopeGraphImpl() : scope_tree_(nullptr) {}
  152. ScopeGraphImpl(const ScopeGraphImpl &) = delete;
  153. ScopeGraphImpl &operator=(const ScopeGraphImpl &) = delete;
  154. Status Init();
  155. ~ScopeGraphImpl();
  156. const ScopeTree *GetScopeTree() const { return scope_tree_; }
  157. void BuildScopeGraph(domi::tensorflow::GraphDef *graph_def);
  158. void AddFusionScopesResult(FusionScopesResult *result);
  159. const std::unordered_map<std::string, FusionScopesResult *> &FusionScopesResults() const { return fusion_results_; }
  160. FusionScopesResult *GetFusionScopesResults(const domi::tensorflow::NodeDef *node_def) const;
  161. FusionScopesResult *GetFusionScopesResults(const string &node_name) const;
  162. const std::unordered_map<std::string, ge::OperatorPtr> &GetNodesMap() const { return nodes_map_; }
  163. bool IsFusionOpChild(const std::string &node_name, std::vector<ScopeFusionOpInfo> &info_list);
  164. bool FusionOpChildIgnore(const ScopeFusionOpInfo &info);
  165. bool IsFusionOp(const domi::tensorflow::NodeDef *node_def);
  166. Status GetInputOrOutputIndex(const ScopeFusionOpInfo &info, int32_t old_index, bool input, int32_t &new_index);
  167. private:
  168. std::vector<int32_t> GetFusionResultInputOrOutput(const ScopeFusionOpInfo &info,
  169. bool input); // input:true,output:false
  170. void CheckScopesResult(FusionScopesResult *fusion_node);
  171. std::unordered_map<std::string, FusionScopesResult *> fusion_results_;
  172. std::unordered_map<std::string, ge::OperatorPtr> nodes_map_;
  173. ScopeTree *scope_tree_;
  174. };
  175. } // namespace ge
  176. #endif // REGISTER_SCOPE_SCOPE_GRAPH_IMPL_H_

图引擎模块(GE)是MindSpore的一个子模块,其代码由C++实现,位于前端模块ME和底层硬件之间,起到承接作用。图引擎模块以ME下发的图作为输入,然后进行一系列的深度图优化操作,最后输出一张可以在底层硬件上高效运行的图。GE针对昇腾AI处理器的硬件结构特点,做了特定的优化工作,以此来充分发挥出昇腾AI处理器的强大算力。在进行模型训练/推理时,GE会被自动调用而用户并不感知。GE主要由GE API和GE Core两部分组成,详细的架构图如下所示