From af1bee3cbb22a3e189f5b3d13d41af4915eb3859 Mon Sep 17 00:00:00 2001 From: wuyongkang Date: Fri, 3 Jul 2020 17:20:44 +0800 Subject: [PATCH] Add record for transform status --- mindspore/ccsrc/optimizer/opt.cc | 37 +++++++++++++++++++++++++-- mindspore/ccsrc/optimizer/optimizer.h | 11 +++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/mindspore/ccsrc/optimizer/opt.cc b/mindspore/ccsrc/optimizer/opt.cc index 4c2e85157f0..462d08ad3c1 100644 --- a/mindspore/ccsrc/optimizer/opt.cc +++ b/mindspore/ccsrc/optimizer/opt.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include "ir/anf.h" #include "ir/manager.h" @@ -191,15 +192,30 @@ bool SubstitutionList::operator()(const FuncGraphPtr &func_graph, const Optimize FuncGraphManagerPtr manager = optimizer->manager(); manager->AddFuncGraph(func_graph); + // for transform status counting + size_t space = 0; + std::unordered_map> status; + if (optimizer->is_on_debug_) { + for (size_t i = 0; i < list_.size(); i++) { + status[list_[i]->name_ + std::to_string(i)] = {}; + } + } + bool loop = false; bool changes = false; do { loop = false; - for (auto const &transform : list_) { - auto change = ApplyTransform(optimizer, func_graph->output(), transform); + for (size_t i = 0; i < list_.size(); i++) { + auto change = ApplyTransform(optimizer, func_graph->output(), list_[i]); changes = changes || change; loop = loop || change; + + // record the status of each transform + if (optimizer->is_on_debug_) { + status[list_[i]->name_ + std::to_string(i)].push_back(change); + space = std::max(list_[i]->name_.size(), space); + } } if (is_once_) { @@ -207,6 +223,23 @@ bool SubstitutionList::operator()(const FuncGraphPtr &func_graph, const Optimize } } while (loop); + // display the status of each transform + if (optimizer->is_on_debug_) { + std::stringstream ss; + ss << std::endl + << "Pass: " << optimizer->name() << "(" << optimizer->CurPass_.counter << ")_" << optimizer->CurPass_.name + << std::endl; + for (size_t i = 0; i < list_.size(); i++) { + auto name = list_[i]->name_; + ss << std::left << std::setw(space + 4) << name << "\t"; + for (auto change : status[name + std::to_string(i)]) { + ss << change << " "; + } + ss << std::endl; + } + MS_LOG(DEBUG) << ss.str(); + } + return changes; } } // namespace opt diff --git a/mindspore/ccsrc/optimizer/optimizer.h b/mindspore/ccsrc/optimizer/optimizer.h index 77d4589c5ee..dc423ed3147 100644 --- a/mindspore/ccsrc/optimizer/optimizer.h +++ b/mindspore/ccsrc/optimizer/optimizer.h @@ -95,6 +95,7 @@ class Optimizer : public std::enable_shared_from_this { void Init(const OptPassGroupMap &passes, bool run_only_once) { run_only_once_ = run_only_once; is_watch_renormalize_ = false; + is_on_debug_ = IS_OUTPUT_ON(mindspore::DEBUG); for (auto &iter : passes) { const std::string &name = iter.first; @@ -144,6 +145,7 @@ class Optimizer : public std::enable_shared_from_this { auto run_runc = [&counter, &func_graph, &changes, use_profile, this]() { for (size_t i = 0; i < passes_.size(); ++i) { const OptPass &opt = passes_[i]; + CurPass_ = {counter, pass_names_[i]}; auto opt_func = [&func_graph, &changes, &opt, this]() { if (opt.is_renormalize()) { auto resource_ptr = std::dynamic_pointer_cast(resource_); @@ -173,7 +175,7 @@ class Optimizer : public std::enable_shared_from_this { } }; use_profile ? (WITH(MsProfile::GetProfile()->Step(pass_names_[i])) opt_func) : opt_func(); - if (IS_OUTPUT_ON(mindspore::DEBUG) && MsContext::GetInstance()->save_graphs_flag()) { + if (is_on_debug_ && MsContext::GetInstance()->save_graphs_flag()) { MS_LOG(DEBUG) << "The opt " << name_ << " round " << counter << " OptPass " << pass_names_[i] << " end."; auto fg_name = "opt_substep_" + name_ + "_r" + std::to_string(counter) + "_" + std::to_string(i) + "_" + pass_names_[i]; @@ -217,6 +219,13 @@ class Optimizer : public std::enable_shared_from_this { bool is_watch_renormalize() { return is_watch_renormalize_; } void set_enable(bool enable) { is_enable_ = enable; } + struct { + int counter; + std::string name; + } CurPass_; + + bool is_on_debug_{false}; + private: const std::string name_; pipeline::ResourceBasePtr resource_;