|
|
|
@ -651,62 +651,13 @@ Status GraphManager::ReplaceSubgraphWithOriGraph(const ComputeGraphPtr &compute_
|
|
|
|
|
Status GraphManager::SetSubgraph(uint64_t session_id, ComputeGraphPtr compute_graph, GraphPartitioner &partitioner) {
|
|
|
|
|
GE_CHECK_NOTNULL(compute_graph);
|
|
|
|
|
auto sub_graph_map = partitioner.GetSubGraphMap();
|
|
|
|
|
std::string buffer_optimize;
|
|
|
|
|
graphStatus graph_status = ge::GetContext().GetOption(BUFFER_OPTIMIZE, buffer_optimize);
|
|
|
|
|
bool need_lx_fusion = (graph_status == GRAPH_SUCCESS) && (buffer_optimize != kOffOptimize);
|
|
|
|
|
if (options_.build_mode.empty() && need_lx_fusion) {
|
|
|
|
|
GELOGI("Enter normal mode with buffer_optimize:%s.", buffer_optimize.c_str());
|
|
|
|
|
/// 1. Copy subgraph for buffer optimize while lx fusion failed.
|
|
|
|
|
/// 2. Set graph with attr "lx_fusion" for fusion optimize.
|
|
|
|
|
std::unordered_map<std::string, ComputeGraphPtr> copy_graphs;
|
|
|
|
|
GE_TIMESTAMP_START(CopySubGraphAndMarkFusion);
|
|
|
|
|
Status ret = CopySubGraphAndMarkFusion(compute_graph, sub_graph_map, copy_graphs);
|
|
|
|
|
GE_TIMESTAMP_EVENT_END(CopySubGraphAndMarkFusion, "SetSubgraph:CopySubGraphAndMarkFusion");
|
|
|
|
|
if (ret != SUCCESS) {
|
|
|
|
|
GELOGE(ret, "CopySubGraphAndMarkFusion failed.");
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Multiply optimize subgraph with lx fusion
|
|
|
|
|
ret = OptimizeSubGraphWithMultiThreads(compute_graph, sub_graph_map, session_id);
|
|
|
|
|
if (ret != SUCCESS) {
|
|
|
|
|
GELOGE(ret, "Multiply optimize subgraph with lx fusion failed.");
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check whether all subgraph lx fusion success
|
|
|
|
|
GE_TIMESTAMP_START(CheckAllFusionOptimizeSuccess);
|
|
|
|
|
if (CheckAllFusionOptimizeSuccess(compute_graph, sub_graph_map)) {
|
|
|
|
|
GE_TIMESTAMP_EVENT_END(CheckAllFusionOptimizeSuccess, "SetSubgraph:CheckAllFusionOptimizeSuccess");
|
|
|
|
|
return SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Replace subgraph with original graph for lx buffer
|
|
|
|
|
ret = ReplaceSubgraphWithOriGraph(compute_graph, sub_graph_map, copy_graphs);
|
|
|
|
|
if (ret != SUCCESS) {
|
|
|
|
|
GELOGE(ret, "Replace subgraph with original graph failed.");
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Multiply optimize subgraph with lx buffer
|
|
|
|
|
ret = OptimizeSubGraphWithMultiThreads(compute_graph, sub_graph_map, session_id);
|
|
|
|
|
if (ret != SUCCESS) {
|
|
|
|
|
GELOGE(ret, "Multiply optimize subgraph with lx buffer failed.");
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
/// Multiply optimize subgraph:
|
|
|
|
|
/// 1. run lx buffer while build_mode is normal and buffer_optimize is empty or "off_optimize";
|
|
|
|
|
/// 2. run lx fusion or buffer according build_mode and build_step in fe.
|
|
|
|
|
GELOGD("Directly optimize subgraph with build mode:%s, and step:%s, buffer_optimize:%s.",
|
|
|
|
|
options_.build_mode.c_str(),
|
|
|
|
|
options_.build_step.c_str(),
|
|
|
|
|
buffer_optimize.c_str());
|
|
|
|
|
Status ret = OptimizeSubGraphWithMultiThreads(compute_graph, sub_graph_map, session_id);
|
|
|
|
|
if (ret != SUCCESS) {
|
|
|
|
|
GELOGE(ret, "Multiply optimize subgraph with lx buffer");
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
GELOGD("Directly optimize subgraph with build mode:%s, and step:%s.",
|
|
|
|
|
options_.build_mode.c_str(),
|
|
|
|
|
options_.build_step.c_str());
|
|
|
|
|
Status ret = OptimizeSubGraphWithMultiThreads(compute_graph, sub_graph_map, session_id);
|
|
|
|
|
if (ret != SUCCESS) {
|
|
|
|
|
GELOGE(ret, "Multiply optimize subgraph failed");
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
return SUCCESS;
|
|
|
|
|
}
|
|
|
|
|