Browse Source

parser component for npu onnx graph op plugin

pull/366/head
Fu Jingguo 4 years ago
parent
commit
80d30c9509
1 changed files with 85 additions and 0 deletions
  1. +85
    -0
      parser/tensorflow/tensorflow_parser.cc

+ 85
- 0
parser/tensorflow/tensorflow_parser.cc View File

@@ -54,6 +54,7 @@
#include "register/op_registry.h"
#include "register/scope/scope_graph_impl.h"
#include "register/scope/scope_pass_registry_impl.h"
#include "parser/common/auto_mapping_subgraph_io_index_func.h"

using ge::const_op_update_vec;
using ge::OpParserFactory;
@@ -302,6 +303,80 @@ Status PostOpProcessForSubgraph(const ParseArg &arg) {
}
return SUCCESS;
}

Status MappingAndAddSubGraph(const NodePtr &node, const Graph &graph, ComputeGraphPtr &root_graph){
// Inner function, input params have been checked by caller
Status status = AutoMappingSubgraphIndexByDataNodeAndOutputNodesInfo(graph,
[](int in, int &out)->Status {
out = in;
return SUCCESS;
},
[](int in, int &out)->Status {
out = in;
return SUCCESS;
});
if (status != SUCCESS) {
GELOGE(INTERNAL_ERROR, "[Mapping][Subgraph]node:%s, sub graph name:%s.",
node->GetName().c_str(), graph.GetName().c_str());
REPORT_CALL_ERROR("E19999", "Failed to map sub graph input and output, node:%s, sub graph name:%s.",
node->GetName().c_str(), graph.GetName().c_str());
return INTERNAL_ERROR;
}

ComputeGraphPtr compute_graph = GraphUtils::GetComputeGraph(graph);
GE_CHECK_NOTNULL(compute_graph);
// Inner function, GetOpDesc has been checked by caller
(void)node->GetOpDesc()->AddSubgraphName("f");
auto ret = NodeUtils::SetSubgraph(*node, 0, compute_graph);
if (ret != GRAPH_SUCCESS) {
GELOGE(INTERNAL_ERROR, "[Set][Subgraph]Node:%s, sub graph name:%s.",
node->GetName().c_str(), compute_graph->GetName().c_str());
REPORT_CALL_ERROR("E19999", "Failed to set sub graph, node: %s, sub graph name: %s.",
node->GetName().c_str(), compute_graph->GetName().c_str());
return INTERNAL_ERROR;
}
for (const auto &sub_graph : compute_graph->GetAllSubgraphs()) {
ret = root_graph->AddSubGraph(sub_graph);
if (ret != GRAPH_SUCCESS) {
GELOGE(INTERNAL_ERROR, "[Add][Subgraph]Node:%s, sub graph name:%s, sub sub graph name:%s.",
node->GetName().c_str(), compute_graph->GetName().c_str(), sub_graph->GetName().c_str());
REPORT_CALL_ERROR("E19999", "Failed to add sub graph to root graph, node:%s, sub graph name:%s.",
node->GetName().c_str(), sub_graph->GetName().c_str());
return INTERNAL_ERROR;
}
compute_graph->RemoveSubgraph(sub_graph);
GELOGD("Add subgraph[%s] to root graph[%s].", sub_graph->GetName().c_str(), root_graph->GetName().c_str());
}
return SUCCESS;
}

Status AddExternalGraph(ComputeGraphPtr &root_graph) {
GE_CHECK_NOTNULL(root_graph);
for (const NodePtr &node : root_graph->GetAllNodes()) {
if (node == nullptr || node->GetOpDesc() == nullptr) {
continue;
}
std::string model_data;
if (AttrUtils::GetStr(node->GetOpDesc(), "_external_model", model_data) && !model_data.empty()) {
ge::Model model;
auto load_ret = ge::Model::Load(reinterpret_cast<const uint8_t *>(model_data.data()), model_data.size(), model);
if (load_ret != GRAPH_SUCCESS) {
GELOGE(INTERNAL_ERROR, "[Parse][ExternalModel]Node:%s.", node->GetName().c_str());
REPORT_CALL_ERROR("E19999", "Failed to parse external model, node:%s.", node->GetName().c_str());
return INTERNAL_ERROR;
}
Graph graph = model.GetGraph();
GELOGD("Get subgraph[%s] from model[%s].", graph.GetName().c_str(), node->GetName().c_str());
Status ret = MappingAndAddSubGraph(node, graph, root_graph);
if (ret != SUCCESS) {
GELOGE(INTERNAL_ERROR, "[Mapping][Subgraph]Node:%s.", node->GetName().c_str());
REPORT_CALL_ERROR("E19999", "Failed to map and add sub graph, node:%s.", node->GetName().c_str());
return INTERNAL_ERROR;
}
}
}
return SUCCESS;
}
} // namespace

/**
@@ -2397,6 +2472,11 @@ Status TensorFlowModelParser::ParseProtoWithSubgraph(const google::protobuf::Mes
return ret;
}
}
auto add_ret = AddExternalGraph(root_graph);
if (add_ret != SUCCESS) {
GELOGE(add_ret, "Failed to add external graph for root graph %s.", root_graph->GetName().c_str());
return add_ret;
}
PARSER_TIMESTAMP_EVENT_END(ParseProtoWithSubgraph, "TensorFlowModelParser::ParseProtoWithSubgraph");
return SUCCESS;
}
@@ -2460,6 +2540,11 @@ Status TensorFlowModelParser::ParseProtoWithSubgraph(const std::string &root_pro
return ret;
}
}
auto add_ret = AddExternalGraph(root_graph);
if (add_ret != SUCCESS) {
GELOGE(add_ret, "Failed to add external graph for root graph %s.", root_graph->GetName().c_str());
return add_ret;
}
PARSER_TIMESTAMP_EVENT_END(ParseProtoWithSubgraph, "TensorFlowModelParser::ParseProtoWithSubgraph");
return SUCCESS;
}


Loading…
Cancel
Save