Skip to content

Commit 5e2f2a7

Browse files
committed
deal with conflict
2 parents 9b83612 + cce176b commit 5e2f2a7

32 files changed

+718
-187
lines changed

paddle/fluid/eager/auto_code_generator/final_state_generator/eager_gen.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,10 +724,11 @@ def GenerateNodeCreationCodes(self):
724724
is_optional = (name in optional_inputs)
725725

726726
if is_fwd_input:
727+
need_input_data = "false" if name in self.no_need_buffers else "true"
727728
if is_optional:
728729
set_tensor_wrappers = f"{indent}if({name}.get_ptr() != nullptr) grad_node->SetTensorWrapper{name}(*({name}.get_ptr()), true);"
729730
else:
730-
set_tensor_wrappers = f"{indent}grad_node->SetTensorWrapper{name}({name}, true);"
731+
set_tensor_wrappers = f"{indent}grad_node->SetTensorWrapper{name}({name}, {need_input_data});"
731732
else:
732733
if num_fwd_outputs > 1:
733734
# Aligned with forward output position

paddle/fluid/eager/tensor_wrapper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ class TensorWrapper {
5151
* to avoid recursive depends on GradNodeBase
5252
* **/
5353
full_reserved_ = full_reserved;
54+
no_need_buffer_ = no_need_buffer;
5455
if (full_reserved_) {
5556
VLOG(6) << "Fully reserved tensor: " << tensor.name();
5657
intermidiate_tensor_ = tensor;
5758
return;
5859
}
5960

6061
// shallow copy tensor_impl here
61-
no_need_buffer_ = no_need_buffer;
6262
if (no_need_buffer) {
6363
if (phi::DenseTensor::classof(tensor.impl().get())) {
6464
// Only Copy Meta

paddle/fluid/pybind/eager.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ void EmptyTensorInitializer(TensorObject* self, const std::string& name,
7878
phi::DenseTensorMeta(paddle::framework::TransToPhiDataType(dtype),
7979
ddims));
8080
self->tensor.set_impl(dense_tensor);
81+
} else if (var_type == paddle::framework::proto::VarType::SELECTED_ROWS) {
82+
std::shared_ptr<phi::SelectedRows> tensor =
83+
std::make_shared<phi::SelectedRows>();
84+
self->tensor.set_impl(tensor);
8185
}
8286

8387
if (!autograd_meta->GetMutableGradNode()) {

paddle/fluid/pybind/eager_method.cc

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,9 @@ static PyObject* tensor__share_buffer_to(TensorObject* self, PyObject* args,
465465
self->tensor.name()));
466466
auto* src_tensor =
467467
static_cast<paddle::framework::Tensor*>(self->tensor.impl().get());
468+
if (!dst_ptr->defined()) {
469+
dst_ptr->set_impl(std::make_shared<phi::DenseTensor>());
470+
}
468471
auto dst_tensor =
469472
static_cast<paddle::framework::Tensor*>(dst_ptr->impl().get());
470473
dst_tensor->ShareDataWith(*src_tensor);
@@ -565,6 +568,10 @@ static PyObject* tensor_method_get_underline_tensor(TensorObject* self,
565568
PyObject* args,
566569
PyObject* kwargs) {
567570
EAGER_TRY
571+
if (!self->tensor.defined()) {
572+
Py_IncRef(Py_None);
573+
return Py_None;
574+
}
568575
if (self->tensor.is_dense_tensor()) {
569576
auto* tensor =
570577
static_cast<paddle::framework::LoDTensor*>(self->tensor.impl().get());
@@ -577,6 +584,25 @@ static PyObject* tensor_method_get_underline_tensor(TensorObject* self,
577584
EAGER_CATCH_AND_THROW_RETURN_NULL
578585
}
579586

587+
static PyObject* tensor_method_get_underline_selected_rows(TensorObject* self,
588+
PyObject* args,
589+
PyObject* kwargs) {
590+
EAGER_TRY
591+
if (!self->tensor.defined()) {
592+
Py_IncRef(Py_None);
593+
return Py_None;
594+
}
595+
if (self->tensor.is_selected_rows()) {
596+
auto* selected_rows =
597+
static_cast<phi::SelectedRows*>(self->tensor.impl().get());
598+
return ToPyObject(selected_rows);
599+
} else {
600+
Py_IncRef(Py_None);
601+
return Py_None;
602+
}
603+
EAGER_CATCH_AND_THROW_RETURN_NULL
604+
}
605+
580606
static PyObject* tensor__getitem_index_not_tensor(TensorObject* self,
581607
PyObject* args,
582608
PyObject* kwargs) {
@@ -1214,6 +1240,9 @@ static PyObject* tensor_method_get_non_zero_cols(TensorObject* self,
12141240
static PyObject* tensor_method_is_sparse(TensorObject* self, PyObject* args,
12151241
PyObject* kwargs) {
12161242
EAGER_TRY
1243+
if (!self->tensor.defined()) {
1244+
return ToPyObject(false);
1245+
}
12171246
return ToPyObject(self->tensor.is_sparse_coo_tensor() ||
12181247
self->tensor.is_sparse_csr_tensor());
12191248
EAGER_CATCH_AND_THROW_RETURN_NULL
@@ -1222,13 +1251,19 @@ static PyObject* tensor_method_is_sparse(TensorObject* self, PyObject* args,
12221251
static PyObject* tensor_method_is_sparse_coo(TensorObject* self, PyObject* args,
12231252
PyObject* kwargs) {
12241253
EAGER_TRY
1254+
if (!self->tensor.defined()) {
1255+
return ToPyObject(false);
1256+
}
12251257
return ToPyObject(self->tensor.is_sparse_coo_tensor());
12261258
EAGER_CATCH_AND_THROW_RETURN_NULL
12271259
}
12281260

12291261
static PyObject* tensor_method_is_sparse_csr(TensorObject* self, PyObject* args,
12301262
PyObject* kwargs) {
12311263
EAGER_TRY
1264+
if (!self->tensor.defined()) {
1265+
return ToPyObject(false);
1266+
}
12321267
return ToPyObject(self->tensor.is_sparse_csr_tensor());
12331268
EAGER_CATCH_AND_THROW_RETURN_NULL
12341269
}
@@ -1307,6 +1342,9 @@ static PyObject* tensor_method_is_selected_rows(TensorObject* self,
13071342
PyObject* args,
13081343
PyObject* kwargs) {
13091344
EAGER_TRY
1345+
if (!self->tensor.defined()) {
1346+
return ToPyObject(false);
1347+
}
13101348
return ToPyObject(self->tensor.is_selected_rows());
13111349
EAGER_CATCH_AND_THROW_RETURN_NULL
13121350
}
@@ -1323,6 +1361,13 @@ static PyObject* tensor_method_get_rows(TensorObject* self, PyObject* args,
13231361
EAGER_CATCH_AND_THROW_RETURN_NULL
13241362
}
13251363

1364+
static PyObject* tensor_methon_element_size(TensorObject* self, PyObject* args,
1365+
PyObject* kwargs) {
1366+
EAGER_TRY
1367+
return ToPyObject(paddle::experimental::SizeOf(self->tensor.dtype()));
1368+
EAGER_CATCH_AND_THROW_RETURN_NULL
1369+
}
1370+
13261371
static PyObject* tensor__reset_grad_inplace_version(TensorObject* self,
13271372
PyObject* args,
13281373
PyObject* kwargs) {
@@ -1420,6 +1465,9 @@ PyMethodDef variable_methods[] = {
14201465
{"get_tensor",
14211466
(PyCFunction)(void (*)(void))tensor_method_get_underline_tensor,
14221467
METH_VARARGS | METH_KEYWORDS, NULL},
1468+
{"get_selected_rows",
1469+
(PyCFunction)(void (*)(void))tensor_method_get_underline_selected_rows,
1470+
METH_VARARGS | METH_KEYWORDS, NULL},
14231471
{"_getitem_index_not_tensor",
14241472
(PyCFunction)(void (*)(void))tensor__getitem_index_not_tensor,
14251473
METH_VARARGS | METH_KEYWORDS, NULL},
@@ -1482,6 +1530,8 @@ PyMethodDef variable_methods[] = {
14821530
METH_VARARGS | METH_KEYWORDS, NULL},
14831531
{"rows", (PyCFunction)(void (*)(void))tensor_method_get_rows,
14841532
METH_VARARGS | METH_KEYWORDS, NULL},
1533+
{"element_size", (PyCFunction)(void (*)(void))tensor_methon_element_size,
1534+
METH_VARARGS | METH_KEYWORDS, NULL},
14851535
{"_reset_grad_inplace_version",
14861536
(PyCFunction)(void (*)(void))tensor__reset_grad_inplace_version,
14871537
METH_VARARGS | METH_KEYWORDS, NULL},

paddle/fluid/pybind/eager_properties.cc

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,14 @@ PyObject* tensor_properties_get_name(TensorObject* self, void* closure) {
4343

4444
PyObject* tensor_properties_get_type(TensorObject* self, void* closure) {
4545
EAGER_TRY
46+
if (!self->tensor.defined()) {
47+
// be same to old dygraph
48+
return ToPyObject(paddle::framework::proto::VarType::LOD_TENSOR);
49+
}
4650
if (self->tensor.is_dense_tensor()) {
4751
return ToPyObject(paddle::framework::proto::VarType::LOD_TENSOR);
52+
} else if (self->tensor.is_selected_rows()) {
53+
return ToPyObject(paddle::framework::proto::VarType::SELECTED_ROWS);
4854
} else {
4955
Py_INCREF(Py_None);
5056
return Py_None;
@@ -137,8 +143,11 @@ int tensor_properties_set_persistable(TensorObject* self, PyObject* value,
137143

138144
PyObject* tensor_properties_get_shape(TensorObject* self, void* closure) {
139145
EAGER_TRY
140-
auto ddim = self->tensor.shape();
141146
std::vector<int64_t> value;
147+
if (!self->tensor.defined()) {
148+
return ToPyObject(value);
149+
}
150+
auto ddim = self->tensor.shape();
142151
size_t rank = static_cast<size_t>(ddim.size());
143152
value.resize(rank);
144153
for (size_t i = 0; i < rank; i++) {
@@ -165,6 +174,10 @@ PyObject* tensor_properties_get_place_str(TensorObject* self, void* closure) {
165174

166175
PyObject* tensor_properties_get_dtype(TensorObject* self, void* closure) {
167176
EAGER_TRY
177+
if (!self->tensor.defined()) {
178+
// be same to old dygraph
179+
return ToPyObject(framework::proto::VarType::FP32);
180+
}
168181
return ToPyObject(
169182
paddle::framework::TransToProtoVarType(self->tensor.type()));
170183
EAGER_CATCH_AND_THROW_RETURN_NULL

paddle/fluid/pybind/eager_utils.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,12 @@ PyObject* ToPyObject(const paddle::framework::LoDTensor* value) {
577577
return obj.ptr();
578578
}
579579

580+
PyObject* ToPyObject(const phi::SelectedRows* value) {
581+
auto obj = ::pybind11::cast(value, py::return_value_policy::reference);
582+
obj.inc_ref();
583+
return obj.ptr();
584+
}
585+
580586
PyObject* ToPyObject(const void* value) {
581587
if (value == nullptr) {
582588
Py_INCREF(Py_None);

paddle/fluid/pybind/eager_utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ PyObject* ToPyObject(const std::vector<paddle::experimental::Tensor>& value,
7575
bool return_py_none_if_not_initialize = false);
7676
PyObject* ToPyObject(const platform::Place& value);
7777
PyObject* ToPyObject(const framework::LoDTensor* value);
78+
PyObject* ToPyObject(const phi::SelectedRows* value);
7879
PyObject* ToPyObject(const paddle::framework::proto::VarType::Type& dtype);
7980
PyObject* ToPyObject(const paddle::framework::proto::VarType& type);
8081
PyObject* ToPyObject(const void* value);

paddle/phi/api/lib/api_custom_impl.cc

Lines changed: 94 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -32,51 +32,7 @@ limitations under the License. */
3232
namespace paddle {
3333
namespace experimental {
3434

35-
// TODO(chenweihang): the original sum grad op can support higher-level
36-
// differentiation,
37-
// but if we use this impl, it will not support. We need to be able to reuse
38-
// the autograd API here, which is not yet implemented
39-
// TODO(chenweihang): we should support call generated api in custom api impl
40-
std::vector<Tensor> add_n_grad_impl(const std::vector<Tensor>& x,
41-
const Tensor& out_grad) {
42-
auto kernel_key_set = ParseKernelKeyByInputArgs(out_grad);
43-
auto kernel_key = kernel_key_set.GetHighestPriorityKernelKey();
44-
45-
Backend kernel_backend = kernel_key.backend();
46-
DataLayout kernel_layout = kernel_key.layout();
47-
DataType kernel_data_type = kernel_key.dtype();
48-
49-
auto kernel = phi::KernelFactory::Instance().SelectKernelOrThrowError(
50-
"scale", {kernel_backend, kernel_layout, kernel_data_type});
51-
VLOG(6) << "add_n_grad API kernel key: [" << kernel_backend << ", "
52-
<< kernel_layout << ", " << kernel_data_type << "]";
53-
VLOG(6) << "add_n_grad API kernel: " << kernel;
54-
55-
auto* dev_ctx = GetDeviceContextByBackend(kernel_backend);
56-
57-
auto dense_out_grad = PrepareData(out_grad, kernel.InputAt(0), {});
58-
59-
size_t out_number = x.size();
60-
std::vector<Tensor> x_grad;
61-
auto dense_x_grad = SetKernelOutput(out_number, kernel_backend, &x_grad);
62-
63-
using kernel_signature = void (*)(const platform::DeviceContext&,
64-
const phi::DenseTensor&,
65-
const phi::Scalar&,
66-
float,
67-
bool,
68-
phi::DenseTensor*);
69-
auto* kernel_fn = kernel.GetVariadicKernelFn<kernel_signature>();
70-
71-
for (auto* dense_x_grad_t : dense_x_grad) {
72-
phi::MetaTensor meta_out(dense_x_grad_t);
73-
phi::UnchangedInferMeta(MakeMetaTensor(*dense_out_grad), &meta_out);
74-
(*kernel_fn)(
75-
*dev_ctx, *dense_out_grad, phi::Scalar(1.0), 0.0, true, dense_x_grad_t);
76-
}
77-
78-
return x_grad;
79-
}
35+
////////////////// Forward api impls //////////////////////
8036

8137
Tensor copy_to_impl(const Tensor& x, Place place, bool blocking) {
8238
auto kernel_key_set = ParseKernelKeyByInputArgs(x);
@@ -310,6 +266,54 @@ std::tuple<Tensor, Tensor, Tensor> momentum_impl(
310266
return api_output;
311267
}
312268

269+
////////////////// Backward(grad) api impls //////////////////////
270+
271+
// TODO(chenweihang): the original sum grad op can support higher-level
272+
// differentiation,
273+
// but if we use this impl, it will not support. We need to be able to reuse
274+
// the autograd API here, which is not yet implemented
275+
// TODO(chenweihang): we should support call generated api in custom api impl
276+
std::vector<Tensor> add_n_grad_impl(const std::vector<Tensor>& x,
277+
const Tensor& out_grad) {
278+
auto kernel_key_set = ParseKernelKeyByInputArgs(out_grad);
279+
auto kernel_key = kernel_key_set.GetHighestPriorityKernelKey();
280+
281+
Backend kernel_backend = kernel_key.backend();
282+
DataLayout kernel_layout = kernel_key.layout();
283+
DataType kernel_data_type = kernel_key.dtype();
284+
285+
auto kernel = phi::KernelFactory::Instance().SelectKernelOrThrowError(
286+
"scale", {kernel_backend, kernel_layout, kernel_data_type});
287+
VLOG(6) << "add_n_grad API kernel key: [" << kernel_backend << ", "
288+
<< kernel_layout << ", " << kernel_data_type << "]";
289+
VLOG(6) << "add_n_grad API kernel: " << kernel;
290+
291+
auto* dev_ctx = GetDeviceContextByBackend(kernel_backend);
292+
293+
auto dense_out_grad = PrepareData(out_grad, kernel.InputAt(0), {});
294+
295+
size_t out_number = x.size();
296+
std::vector<Tensor> x_grad;
297+
auto dense_x_grad = SetKernelOutput(out_number, kernel_backend, &x_grad);
298+
299+
using kernel_signature = void (*)(const platform::DeviceContext&,
300+
const phi::DenseTensor&,
301+
const phi::Scalar&,
302+
float,
303+
bool,
304+
phi::DenseTensor*);
305+
auto* kernel_fn = kernel.GetVariadicKernelFn<kernel_signature>();
306+
307+
for (auto* dense_x_grad_t : dense_x_grad) {
308+
phi::MetaTensor meta_out(dense_x_grad_t);
309+
phi::UnchangedInferMeta(MakeMetaTensor(*dense_out_grad), &meta_out);
310+
(*kernel_fn)(
311+
*dev_ctx, *dense_out_grad, phi::Scalar(1.0), 0.0, true, dense_x_grad_t);
312+
}
313+
314+
return x_grad;
315+
}
316+
313317
std::tuple<Tensor, Tensor, Tensor, Tensor, Tensor, Tensor> batch_norm_impl(
314318
const Tensor& x,
315319
const Tensor& scale,
@@ -504,5 +508,50 @@ std::vector<Tensor> concat_grad_impl(const std::vector<Tensor>& x,
504508
return x_grad;
505509
}
506510

511+
std::vector<Tensor> stack_grad_impl(const std::vector<Tensor>& x,
512+
const Tensor& out_grad,
513+
int axis) {
514+
auto kernel_key_set = ParseKernelKeyByInputArgs(out_grad);
515+
auto kernel_key = kernel_key_set.GetHighestPriorityKernelKey();
516+
517+
Backend kernel_backend = kernel_key.backend();
518+
DataLayout kernel_layout = kernel_key.layout();
519+
DataType kernel_data_type = kernel_key.dtype();
520+
521+
auto kernel = phi::KernelFactory::Instance().SelectKernelOrThrowError(
522+
"stack_grad", {kernel_backend, kernel_layout, kernel_data_type});
523+
VLOG(6) << "stack_grad API kernel key: [" << kernel_backend << ", "
524+
<< kernel_layout << ", " << kernel_data_type << "]";
525+
VLOG(6) << "stack_grad API kernel: " << kernel;
526+
527+
auto* dev_ctx = GetDeviceContextByBackend(kernel_backend);
528+
529+
auto dense_out_grad = PrepareData(out_grad, kernel.InputAt(0), {});
530+
531+
size_t out_number = x.size();
532+
std::vector<Tensor> x_grad;
533+
auto dense_x_grad = SetKernelOutput(out_number, kernel_backend, &x_grad);
534+
std::vector<phi::MetaTensor> meta_x_grad;
535+
meta_x_grad.reserve(out_number);
536+
std::vector<phi::MetaTensor*> meta_x_grad_ptrs;
537+
meta_x_grad_ptrs.reserve(out_number);
538+
for (size_t i = 0; i < out_number; ++i) {
539+
meta_x_grad.push_back(dense_x_grad[i]);
540+
meta_x_grad_ptrs.push_back(&meta_x_grad.back());
541+
}
542+
543+
phi::StackGradInferMeta(
544+
MakeMetaTensor(*dense_out_grad), axis, meta_x_grad_ptrs);
545+
546+
using kernel_signature = void (*)(const platform::DeviceContext&,
547+
const phi::DenseTensor&,
548+
int axis,
549+
std::vector<phi::DenseTensor*>);
550+
auto* kernel_fn = kernel.GetVariadicKernelFn<kernel_signature>();
551+
(*kernel_fn)(*dev_ctx, *dense_out_grad, axis, dense_x_grad);
552+
553+
return x_grad;
554+
}
555+
507556
} // namespace experimental
508557
} // namespace paddle

0 commit comments

Comments
 (0)