未验证 提交 4f32aae5 编写于 作者: X xiongkun 提交者: GitHub

[Dy2static] Auto Remove Step Scope while GradRunProgramNode GCed. (#51411)

* merge

* fix bugs while backward multi-times.

* code format by ci
上级 7f506669
...@@ -60,11 +60,6 @@ inline void run_program_ad_func( ...@@ -60,11 +60,6 @@ inline void run_program_ad_func(
std::vector<paddle::framework::Scope*>& step_scope, // NOLINT std::vector<paddle::framework::Scope*>& step_scope, // NOLINT
std::vector<paddle::Tensor*>& dout, // NOLINT std::vector<paddle::Tensor*>& dout, // NOLINT
const paddle::framework::AttributeMap& attrs) { const paddle::framework::AttributeMap& attrs) {
VLOG(2) << "start run run_program";
// Call forward function
RunProgramAPI(x, params, out, step_scope, dout, attrs);
VLOG(2) << "start run run_program grad";
// Prepare Autograd Meta // Prepare Autograd Meta
auto deref_out = details::DereferenceTensors(out); auto deref_out = details::DereferenceTensors(out);
std::vector<egr::AutogradMeta*> p_autograd_x = std::vector<egr::AutogradMeta*> p_autograd_x =
...@@ -78,6 +73,13 @@ inline void run_program_ad_func( ...@@ -78,6 +73,13 @@ inline void run_program_ad_func(
bool require_any_grad = egr::EagerUtils::ComputeRequireGrad( bool require_any_grad = egr::EagerUtils::ComputeRequireGrad(
trace_backward, &p_autograd_x, &p_autograd_params); trace_backward, &p_autograd_x, &p_autograd_params);
VLOG(2) << "start run run_program with require_any_grad = "
<< require_any_grad;
// Call forward function
// if require_any_grad is False, don't save any middle vars.
RunProgramAPI(x, params, out, step_scope, dout, require_any_grad, attrs);
VLOG(2) << "start run run_program grad";
if (require_any_grad) { if (require_any_grad) {
egr::EagerUtils::PassStopGradient(false, &p_autograd_outs); egr::EagerUtils::PassStopGradient(false, &p_autograd_outs);
// Create GradOpNode (1 means [out_grad], 2 means [x_grad, paramx_grad]) // Create GradOpNode (1 means [out_grad], 2 means [x_grad, paramx_grad])
......
...@@ -283,6 +283,7 @@ inline void RunProgramAPI( ...@@ -283,6 +283,7 @@ inline void RunProgramAPI(
std::vector<paddle::Tensor *> &out, // NOLINT std::vector<paddle::Tensor *> &out, // NOLINT
std::vector<paddle::framework::Scope *> &step_scope, // NOLINT std::vector<paddle::framework::Scope *> &step_scope, // NOLINT
std::vector<paddle::Tensor *> &dout, // NOLINT std::vector<paddle::Tensor *> &dout, // NOLINT
bool require_any_grad,
const paddle::framework::AttributeMap &attrs) { const paddle::framework::AttributeMap &attrs) {
VLOG(2) << "RunProgramOpKernel Compute"; VLOG(2) << "RunProgramOpKernel Compute";
// In the original run_program OP, the default value of the is_test // In the original run_program OP, the default value of the is_test
...@@ -436,8 +437,10 @@ inline void RunProgramAPI( ...@@ -436,8 +437,10 @@ inline void RunProgramAPI(
VLOG(3) << paddle::framework::GenScopeTreeDebugInfo(out_scope_vec->front()); VLOG(3) << paddle::framework::GenScopeTreeDebugInfo(out_scope_vec->front());
if (is_test || !egr::Controller::Instance().HasGrad()) { if (is_test || !require_any_grad) {
VLOG(4) << "is test, set this scope can reused"; VLOG(4) << "don't require any grad, set this scope can reused";
VLOG(4) << "is_test: " << is_test
<< ", require_any_grad: " << require_any_grad;
global_inner_scope->SetCanReuesd(true); global_inner_scope->SetCanReuesd(true);
details::GcScope(global_inner_scope); details::GcScope(global_inner_scope);
} else { } else {
...@@ -576,7 +579,8 @@ inline void RunProgramGradAPI( ...@@ -576,7 +579,8 @@ inline void RunProgramGradAPI(
*backward_global_block, *backward_global_block,
global_inner_scope); global_inner_scope);
VLOG(4) << "after backward gc all vars"; VLOG(4) << "after backward gc all vars";
global_inner_scope->SetCanReuesd(true); global_inner_scope->SetCanReuesd(
false); // can't reuse util call `~GradNodeRunProgram`
details::GcScope(global_inner_scope); details::GcScope(global_inner_scope);
} }
} }
...@@ -586,7 +590,15 @@ class GradNodeRunProgram : public egr::GradNodeBase { ...@@ -586,7 +590,15 @@ class GradNodeRunProgram : public egr::GradNodeBase {
GradNodeRunProgram(size_t bwd_in_slot_num, size_t bwd_out_slot_num) GradNodeRunProgram(size_t bwd_in_slot_num, size_t bwd_out_slot_num)
: egr::GradNodeBase(bwd_in_slot_num, bwd_out_slot_num) {} : egr::GradNodeBase(bwd_in_slot_num, bwd_out_slot_num) {}
~GradNodeRunProgram() override = default; ~GradNodeRunProgram() {
auto *out_scope_vec = &step_scope_;
// Normally out_scope_vec.size() == 1. for safty, we add for-loop here.
for (size_t i = 0; i < out_scope_vec->size(); ++i) {
paddle::framework::Scope *global_inner_scope = out_scope_vec->at(i);
global_inner_scope->SetCanReuesd(true); // set this to reuse scope.
details::GcScope(global_inner_scope);
}
}
// Functor: perform backward computations // Functor: perform backward computations
virtual paddle::small_vector<std::vector<paddle::Tensor>, virtual paddle::small_vector<std::vector<paddle::Tensor>,
egr::kSlotSmallVectorSize> egr::kSlotSmallVectorSize>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册