diff --git a/paddle/fluid/eager/auto_code_generator/eager_generator.cc b/paddle/fluid/eager/auto_code_generator/eager_generator.cc index fc3ea234929bc58ffc38fd694dacbe3bf60ffee4..0be4be6c963ed8a71e5271c1e837aa9f4fbaad78 100644 --- a/paddle/fluid/eager/auto_code_generator/eager_generator.cc +++ b/paddle/fluid/eager/auto_code_generator/eager_generator.cc @@ -48,7 +48,7 @@ static std::unordered_map operators_with_attrs = {}; static std::unordered_set ops_to_fill_zero_for_empty_grads = { - "split"}; + "split", "rnn"}; /* --- Black Ops list that's NO NEED to apply code generation --- */ static std::unordered_set black_ops_list = {"run_program"}; diff --git a/paddle/fluid/eager/auto_code_generator/final_state_generator/codegen_utils.py b/paddle/fluid/eager/auto_code_generator/final_state_generator/codegen_utils.py index e907b6bd1b7d3574af7b54bb766ff132b6a300d8..56cbc05b1a9834c3330e5a62c5b937eb4dbf646f 100644 --- a/paddle/fluid/eager/auto_code_generator/final_state_generator/codegen_utils.py +++ b/paddle/fluid/eager/auto_code_generator/final_state_generator/codegen_utils.py @@ -21,7 +21,7 @@ import os ######################## ### Global Variables ### ######################## -ops_to_fill_zero_for_empty_grads = set(list("split")) +ops_to_fill_zero_for_empty_grads = set(["split", "rnn"]) # For API dispatch used at python-level # { op_name : [arg_name, ...] } diff --git a/paddle/fluid/eager/to_static/run_program_op_node.h b/paddle/fluid/eager/to_static/run_program_op_node.h index a60d7b5c65ec39484ff11c6bbe869cbf8fcd1975..3c2fa59cf1b163b568759c74ee5a9f1868961901 100644 --- a/paddle/fluid/eager/to_static/run_program_op_node.h +++ b/paddle/fluid/eager/to_static/run_program_op_node.h @@ -367,6 +367,7 @@ class GradNodeRunProgram : public egr::GradNodeBase { paddle::platform::errors::InvalidArgument( "The out_grads.size() of RunProgramGradOp should be equal to 1.")); + egr::EagerUtils::FillZeroForEmptyGradInputs(&grads, this->InputMeta()); VLOG(3) << "out_grads[0].size() : " << grads[0].size(); std::vector x_grad; std::vector params_grad; diff --git a/paddle/fluid/eager/utils.cc b/paddle/fluid/eager/utils.cc index f25c4dfcd5932c835e580d70272f56e351617a57..aee7c8736124ed79bddf658dac26ea00820b164c 100644 --- a/paddle/fluid/eager/utils.cc +++ b/paddle/fluid/eager/utils.cc @@ -398,7 +398,7 @@ void EagerUtils::FillZeroForEmptyGradInputs( std::vector>* in_grads, const std::vector>& grad_in_metas) { for (size_t i = 0; i < in_grads->size(); i++) { - for (size_t j = 0; j < (*in_grads)[0].size(); j++) { + for (size_t j = 0; j < (*in_grads)[i].size(); j++) { paddle::experimental::Tensor& grad = (*in_grads)[i][j]; if (!grad.is_initialized()) { const GradSlotMeta& grad_in_meta = grad_in_metas[i][j];