未验证 提交 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(
std::vector<paddle::framework::Scope*>& step_scope, // NOLINT
std::vector<paddle::Tensor*>& dout, // NOLINT
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
auto deref_out = details::DereferenceTensors(out);
std::vector<egr::AutogradMeta*> p_autograd_x =
......@@ -78,6 +73,13 @@ inline void run_program_ad_func(
bool require_any_grad = egr::EagerUtils::ComputeRequireGrad(
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) {
egr::EagerUtils::PassStopGradient(false, &p_autograd_outs);
// Create GradOpNode (1 means [out_grad], 2 means [x_grad, paramx_grad])
......
......@@ -283,6 +283,7 @@ inline void RunProgramAPI(
std::vector<paddle::Tensor *> &out, // NOLINT
std::vector<paddle::framework::Scope *> &step_scope, // NOLINT
std::vector<paddle::Tensor *> &dout, // NOLINT
bool require_any_grad,
const paddle::framework::AttributeMap &attrs) {
VLOG(2) << "RunProgramOpKernel Compute";
// In the original run_program OP, the default value of the is_test
......@@ -436,8 +437,10 @@ inline void RunProgramAPI(
VLOG(3) << paddle::framework::GenScopeTreeDebugInfo(out_scope_vec->front());
if (is_test || !egr::Controller::Instance().HasGrad()) {
VLOG(4) << "is test, set this scope can reused";
if (is_test || !require_any_grad) {
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);
details::GcScope(global_inner_scope);
} else {
......@@ -576,7 +579,8 @@ inline void RunProgramGradAPI(
*backward_global_block,
global_inner_scope);
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);
}
}
......@@ -586,7 +590,15 @@ class GradNodeRunProgram : public egr::GradNodeBase {
GradNodeRunProgram(size_t bwd_in_slot_num, size_t 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
virtual paddle::small_vector<std::vector<paddle::Tensor>,
egr::kSlotSmallVectorSize>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册