From 0e6402ada99e1f1707a969ac2461c8bdaa29ada3 Mon Sep 17 00:00:00 2001 From: wangyue01 Date: Mon, 19 Oct 2020 14:30:18 +0800 Subject: [PATCH] Specify the dump name of constant nodes the same with proto file. --- .../ccsrc/backend/session/gpu_session.cc | 9 +-- .../ccsrc/debug/data_dump/e2e_dump_util.cc | 72 +++++++++++++++++-- .../ccsrc/debug/data_dump/e2e_dump_util.h | 5 +- 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/mindspore/ccsrc/backend/session/gpu_session.cc b/mindspore/ccsrc/backend/session/gpu_session.cc index 551561a2347..7dd6c4f7983 100644 --- a/mindspore/ccsrc/backend/session/gpu_session.cc +++ b/mindspore/ccsrc/backend/session/gpu_session.cc @@ -246,10 +246,6 @@ GraphId GPUSession::CompileGraphImpl(const AnfNodePtrList &lst, const AnfNodePtr HardwareOptimize(graph); // Graph kernel fusion optimization GraphKernelOptimize(graph); - // Dump .pb graph after graph optimization - if (save_graphs) { - DumpIRProto(graph, "after_opt_" + std::to_string(graph_id)); - } #if (ENABLE_CPU && (ENABLE_D || ENABLE_GPU)) // Assign parameter keys. @@ -271,6 +267,11 @@ GraphId GPUSession::CompileGraphImpl(const AnfNodePtrList &lst, const AnfNodePtr SetSummaryNodes(graph.get()); // Remove NopOp from execution graph opt::RemoveNopNode(graph.get()); + // Dump .pb graph after graph optimization + if (save_graphs) { + DumpIRProto(graph, "after_opt_" + std::to_string(graph_id)); + } + // Set graph manager. MS_EXCEPTION_IF_NULL(context_); FuncGraphManagerPtr manager = MakeManager({graph}); diff --git a/mindspore/ccsrc/debug/data_dump/e2e_dump_util.cc b/mindspore/ccsrc/debug/data_dump/e2e_dump_util.cc index 9d9fc597b71..b86d8642e4c 100644 --- a/mindspore/ccsrc/debug/data_dump/e2e_dump_util.cc +++ b/mindspore/ccsrc/debug/data_dump/e2e_dump_util.cc @@ -15,7 +15,11 @@ */ #include "debug/data_dump/e2e_dump_util.h" + #include +#include +#include + #include "debug/data_dump/dump_json_parser.h" #include "common/trans.h" #include "backend/session/anf_runtime_algorithm.h" @@ -165,20 +169,75 @@ void E2eDumpUtil::DumpInput(const session::KernelGraph *graph, const std::string } } +void SetConstNodeId(const AnfNodePtr &node, std::map *const_map) { + if (!node->isa()) { + return; + } + auto iter = const_map->find(node->fullname_with_scope()); + if (iter == const_map->end()) { + auto const_idx = const_map->size() + 1; + (*const_map)[node->fullname_with_scope()] = const_idx; + } +} + +void GetCNodeConstantId(const session::KernelGraph *graph, const CNodePtr &node, + std::map *const_map) { + auto &inputs = node->inputs(); + if (inputs.size() < 1) { + MS_LOG(EXCEPTION) << "Inputs of apply node is empty"; + } + AnfNodePtr op = inputs[0]; + + // CNode/ConstGraph/Const/Parameter + if (op->isa() || IsValueNode(op) || op->isa()) { + MS_LOG(WARNING) << "Operator must be a primitive."; + } else { + // process OP inputs + for (size_t i = 1; i < inputs.size(); ++i) { + SetConstNodeId(inputs[i], const_map); + } + } +} + +void GetConstantId(const session::KernelGraph *graph, std::map *const_map) { + std::vector nodes = TopoSort(graph->get_return(), SuccIncoming, AlwaysInclude); + for (const AnfNodePtr &node : nodes) { + MS_EXCEPTION_IF_NULL(node); + if (!node->isa()) { + continue; + } + auto cnode = node->cast(); + if (cnode != graph->get_return()) { + GetCNodeConstantId(graph, cnode, const_map); + } else { + SetConstNodeId(cnode->input(1), const_map); + } + } +} + void E2eDumpUtil::DumpSingleAnfnode(const AnfNodePtr &anf_node, const size_t output_index, const std::string &dump_path, - bool trans_flag, Debugger *debugger) { + bool trans_flag, std::map *const_map, Debugger *debugger) { MS_EXCEPTION_IF_NULL(anf_node); auto &dump_json_parser = DumpJsonParser::GetInstance(); if (!anf_node->isa() && !anf_node->isa()) { return; } std::string node_name = anf_node->fullname_with_scope(); + std::string dump_name = node_name; + if (anf_node->isa()) { + auto iter = const_map->find(node_name); + if (iter == const_map->end()) { + return; + } + dump_name = std::string("cst") + std::to_string(iter->second); + } + if (!dump_json_parser.NeedDump(node_name)) { return; } DumpJsonParser::GetInstance().MatchKernel(node_name); GetFileKernelName(NOT_NULL(&node_name)); - // check if output adde exists, if not, return; + // check if output address exists, if not, return; if (!AnfAlgo::OutputAddrExist(anf_node, output_index)) { return; } @@ -188,7 +247,7 @@ void E2eDumpUtil::DumpSingleAnfnode(const AnfNodePtr &anf_node, const size_t out GetDumpIntShape(anf_node, output_index, trans_flag, NOT_NULL(&int_shapes)); auto type = AnfAlgo::GetOutputInferDataType(anf_node, output_index); - std::string file_path = dump_path + '/' + node_name + '_' + "output_0"; + std::string file_path = dump_path + '/' + dump_name + '_' + "output_0"; if (IsDeviceTargetGPU()) { DumpGPUMemToFile(file_path, node_name, NOT_NULL(addr), trans_flag, int_shapes, type, 0, debugger); } else { @@ -202,15 +261,18 @@ void E2eDumpUtil::DumpParametersAndConst(const session::KernelGraph *graph, cons auto &dump_json_parser = DumpJsonParser::GetInstance(); MS_LOG(INFO) << "Start e2e dump parameters and Const values"; bool trans_flag = dump_json_parser.trans_flag(); + std::map const_map; + GetConstantId(graph, &const_map); + // dump parameters const auto ¶meters = graph->inputs(); for (auto &item : parameters) { - DumpSingleAnfnode(item, PRAMATER_OUTPUT_INDEX, dump_path, trans_flag, debugger); + DumpSingleAnfnode(item, PRAMATER_OUTPUT_INDEX, dump_path, trans_flag, &const_map, debugger); } // dump const values auto value_nodes = graph->graph_value_nodes(); for (const auto &value_node : value_nodes) { - DumpSingleAnfnode(value_node, VALUE_NODE_OUTPUT_INDEX, dump_path, trans_flag, debugger); + DumpSingleAnfnode(value_node, VALUE_NODE_OUTPUT_INDEX, dump_path, trans_flag, &const_map, debugger); } } diff --git a/mindspore/ccsrc/debug/data_dump/e2e_dump_util.h b/mindspore/ccsrc/debug/data_dump/e2e_dump_util.h index f6a8e067abf..5af506be289 100644 --- a/mindspore/ccsrc/debug/data_dump/e2e_dump_util.h +++ b/mindspore/ccsrc/debug/data_dump/e2e_dump_util.h @@ -17,10 +17,13 @@ #ifndef MINDSPORE_MINDSPORE_CCSRC_DEBUG_DATA_DUMP_E_2_E_DUMP_UTIL_H_ #define MINDSPORE_MINDSPORE_CCSRC_DEBUG_DATA_DUMP_E_2_E_DUMP_UTIL_H_ +#include #include + #include "backend/session/kernel_graph.h" #include "runtime/device/device_address.h" #include "debug/data_dump/dump_json_parser.h" + #ifndef ENABLE_DEBUGGER class Debugger; #endif @@ -46,7 +49,7 @@ class E2eDumpUtil { static void GetDumpIntShape(const AnfNodePtr &node, size_t index, bool trans_flag, NotNull int_shapes); static bool IsDeviceTargetGPU(); static void DumpSingleAnfnode(const AnfNodePtr &anf_node, const size_t output_index, const std::string &dump_path, - bool trans_flag, Debugger *debugger); + bool trans_flag, std::map *const_map, Debugger *debugger); }; } // namespace mindspore #endif // MINDSPORE_MINDSPORE_CCSRC_DEBUG_DATA_DUMP_E_2_E_DUMP_UTIL_H_