@@ -387,8 +387,8 @@ class RecurrentGradOp : public RecurrentBase {
387
387
auto &p_names = Inputs (kParameters );
388
388
PADDLE_ENFORCE_EQ (pg_names.size (), p_names.size ());
389
389
390
- for (size_t prog_id = 0 ; prog_id < pg_names.size (); ++prog_id ) {
391
- auto inside_grad_name = framework::GradVarName (p_names[prog_id ]);
390
+ for (size_t param_id = 0 ; param_id < pg_names.size (); ++param_id ) {
391
+ auto inside_grad_name = framework::GradVarName (p_names[param_id ]);
392
392
393
393
// If does not compute gradient of that variable inside rnn, just
394
394
// continue
@@ -406,27 +406,19 @@ class RecurrentGradOp : public RecurrentBase {
406
406
attrs[" value" ] = 0 .0f ;
407
407
408
408
auto zero_op = framework::OpRegistry::CreateOp (
409
- " fill_constant" , {}, {{" Out" , {pg_names[prog_id ]}}}, attrs);
409
+ " fill_constant" , {}, {{" Out" , {pg_names[param_id ]}}}, attrs);
410
410
zero_op->Run (scope, dev_ctx);
411
411
}
412
412
413
+ auto new_inside_name = cur_scope.Rename (inside_grad_name);
413
414
// sum gradient
414
- auto *outside_var = scope.FindVar (pg_names[prog_id]);
415
- PADDLE_ENFORCE (outside_var != nullptr );
416
- auto &outside_tensor =
417
- *outside_var->GetMutable <framework::LoDTensor>();
418
-
419
- std::string result_var_name;
420
- auto *local_result_var = cur_scope.Var (&result_var_name);
421
- auto &local_result_tensor =
422
- *local_result_var->GetMutable <framework::LoDTensor>();
423
-
424
- local_result_tensor.ShareDataWith (outside_tensor);
425
415
426
416
auto sum_op = framework::OpRegistry::CreateOp (
427
- " sum" , {{" X" , {result_var_name, inside_grad_name }}},
428
- {{" Out" , {result_var_name }}}, {});
417
+ " sum" , {{" X" , {pg_names[param_id], new_inside_name }}},
418
+ {{" Out" , {pg_names[param_id] }}}, {});
429
419
sum_op->Run (cur_scope, dev_ctx);
420
+
421
+ cur_scope.Rename (new_inside_name, inside_grad_name);
430
422
}
431
423
}
432
424
VLOG (5 ) << " Accumulate Parameter finished " ;
0 commit comments