fix core dump when case run together

This commit is contained in:
lvliang 2021-05-12 09:47:09 +08:00 committed by chujinjin
parent fe591f3b71
commit ff32f68513
6 changed files with 48 additions and 17 deletions

View File

@ -37,12 +37,30 @@
namespace mindspore {
namespace ad {
extern KPrim g_k_prims;
using CacheKey = std::pair<std::string, size_t>;
static ValuePtr add_ops;
static ValuePtr ones_like_ops;
static ValuePtr zeros_like_ops;
static std::shared_ptr<const opt::irpass::OptimizeIRPassLib> irpass;
static std::map<CacheKey, FuncGraphPtr> bprop_func_graph_cache;
static std::unordered_map<abstract::AbstractBasePtrList, FuncGraphPtr, abstract::AbstractBasePtrListHasher,
abstract::AbstractBasePtrListEqual>
zeros_like_funcgraph_cache;
static std::unordered_map<abstract::AbstractBasePtrList, FuncGraphPtr, abstract::AbstractBasePtrListHasher,
abstract::AbstractBasePtrListEqual>
add_backward_funcgraph_cache;
static std::unordered_map<abstract::AbstractBasePtrList, FuncGraphPtr, abstract::AbstractBasePtrListHasher,
abstract::AbstractBasePtrListEqual>
ones_like_funcgraph_cache;
namespace {
FuncGraphPtr ZerosLikePrimOptPass(const pipeline::ResourcePtr &res) {
static const opt::irpass::OptimizeIRPassLib irpass;
if (irpass == nullptr) {
irpass = std::make_shared<opt::irpass::OptimizeIRPassLib>();
}
opt::OptPassConfig eliminate_zeros_like_prim_pass = opt::OptPassConfig({
irpass.zero_like_fill_zero_,
irpass->zero_like_fill_zero_,
});
opt::OptPassGroupMap map({{"eliminate_zeros_like_prim_", eliminate_zeros_like_prim_pass}});
@ -56,10 +74,9 @@ FuncGraphPtr ZerosLikePrimOptPass(const pipeline::ResourcePtr &res) {
}
FuncGraphPtr GetZerosLike(const abstract::AbstractBasePtrList &args_spec) {
static ValuePtr zeros_like_ops = prim::GetPythonOps("zeros_like");
static std::unordered_map<abstract::AbstractBasePtrList, FuncGraphPtr, abstract::AbstractBasePtrListHasher,
abstract::AbstractBasePtrListEqual>
zeros_like_funcgraph_cache;
if (zeros_like_ops == nullptr) {
zeros_like_ops = prim::GetPythonOps("zeros_like");
}
auto iter = zeros_like_funcgraph_cache.find(args_spec);
if (iter != zeros_like_funcgraph_cache.end()) {
MS_LOG(DEBUG) << "Cache hit for zeros_like: " << mindspore::ToString(args_spec);
@ -81,10 +98,9 @@ FuncGraphPtr GetZerosLike(const abstract::AbstractBasePtrList &args_spec) {
}
FuncGraphPtr GetHyperAdd(const abstract::AbstractBasePtrList &args_spec) {
static ValuePtr add_ops = prim::GetPythonOps("hyper_add");
static std::unordered_map<abstract::AbstractBasePtrList, FuncGraphPtr, abstract::AbstractBasePtrListHasher,
abstract::AbstractBasePtrListEqual>
add_backward_funcgraph_cache;
if (add_ops == nullptr) {
add_ops = prim::GetPythonOps("hyper_add");
}
auto iter = add_backward_funcgraph_cache.find(args_spec);
if (iter != add_backward_funcgraph_cache.end()) {
MS_LOG(DEBUG) << "Cache hit for hyper_add: " << mindspore::ToString(args_spec);
@ -122,10 +138,9 @@ AnfNodePtr BuildZerosLikeValue(const FuncGraphPtr &tape, const ValuePtr &out) {
}
FuncGraphPtr GetOnesLike(const abstract::AbstractBasePtrList &args_spec) {
static ValuePtr ones_like_ops = prim::GetPythonOps("ones_like");
static std::unordered_map<abstract::AbstractBasePtrList, FuncGraphPtr, abstract::AbstractBasePtrListHasher,
abstract::AbstractBasePtrListEqual>
ones_like_funcgraph_cache;
if (ones_like_ops == nullptr) {
ones_like_ops = prim::GetPythonOps("ones_like");
}
auto iter = ones_like_funcgraph_cache.find(args_spec);
if (iter != ones_like_funcgraph_cache.end()) {
MS_LOG(DEBUG) << "Cache hit for ones_like: " << mindspore::ToString(args_spec);
@ -880,8 +895,6 @@ FuncGraphPtr KPynativeCellImpl::BuildBPropCutFuncGraph(const PrimitivePtr &prim,
}
FuncGraphPtr KPynativeCellImpl::BuildMakeSequenceBprop(const PrimitivePtr &prim, const CNodePtr &cnode) {
using CacheKey = std::pair<std::string, size_t>;
static std::map<CacheKey, FuncGraphPtr> bprop_func_graph_cache;
auto inputs_num = cnode->size() - 1;
CacheKey key{prim->name(), inputs_num};
auto bprop_func_graph_iter = bprop_func_graph_cache.find(key);
@ -1088,5 +1101,16 @@ void KPynativeCellImpl::ReplacePrimalParameter(const AnfNodePtrList &weights, bo
}
tr.Commit();
}
void ClearKPynativeCellStaticRes() {
irpass = nullptr;
add_ops = nullptr;
ones_like_ops = nullptr;
zeros_like_ops = nullptr;
bprop_func_graph_cache.clear();
zeros_like_funcgraph_cache.clear();
add_backward_funcgraph_cache.clear();
ones_like_funcgraph_cache.clear();
}
} // namespace ad
} // namespace mindspore

View File

@ -88,6 +88,9 @@ bool GradPynativeOp(const KPynativeCellPtr &k_cell, const CNodePtr &c_node, cons
// Should have prototype: (sens_input1, sens_input2, ...) bprop_fg(input1, input2, ..., out, dout)
bool GradPynativeWithBProp(const KPynativeCellPtr &k_cell, const CNodePtr &c_node, const ValuePtrList &op_args,
const ValuePtr &out, const FuncGraphPtr &bprop_fg);
// Clear all static resources that used in grad process
void ClearKPynativeCellStaticRes();
} // namespace ad
} // namespace mindspore

View File

@ -522,6 +522,7 @@ bool TaskEmitAction(const ResourcePtr &res) {
MS_LOG(EXCEPTION) << "TaskEmit args error";
}
FuncGraphPtr func_graph = res->func_graph();
MS_EXCEPTION_IF_NULL(func_graph);
auto bc_ptr = res->results()[kBackend].cast<compile::BackendPtr>();
auto context_ptr = MsContext::GetInstance();
std::string backend = MsContext::GetInstance()->backend_policy();

View File

@ -190,6 +190,8 @@ FuncGraphPtr BpropGraphFinalOptPass(const ResourcePtr &res) {
opt::OptPassConfig bg_final_opt_ = opt::OptPassConfig({
irpass.inline_,
irpass.tuple_list_get_set_item_eliminator_,
irpass.tuple_list_get_item_eliminator_,
irpass.tuple_list_set_item_eliminator_,
irpass.depend_value_elim_,
irpass.reshape_eliminate_,
irpass.switch_simplify_,

View File

@ -1167,6 +1167,7 @@ void ClearResAtexit() {
}
#endif
ad::g_k_prims.clear();
ad::ClearKPynativeCellStaticRes();
PrimBpropOptimizer::GetPrimBpropOptimizerInst().Clear();
abstract::ClearPrimEvaluatorMap();

View File

@ -165,7 +165,7 @@ std::string GraphDebugInfo::debug_name() {
LocationPtr GraphDebugInfo::location() {
// function may have decorator which is included in its location
if (deco_loc_ != nullptr) {
if (deco_loc_ != nullptr && DebugInfo::location() != nullptr) {
LocationPtr loc = std::make_shared<Location>(*DebugInfo::location());
loc->set_line(loc->line() + (deco_loc_->line_end() - deco_loc_->line() + 1));
return loc;