未验证 提交 d21074cd 编写于 作者: W wanghuancoder 提交者: GitHub

[Eager] Support Eager mode for some testcase (#38783)

* Rearranged Eager AutoCodeGen directory structure

* Removed USE_OP in Eager AutoCodeGen

* Enabled generation for Operators without Grad/Inputs/Outputs

* Resolved operators without input

* Fixed merge conflicts

* Enabled Eager AutoCodeGen for 10+ more operators

* Refactored Eager AutoCodeGen with more organized helper objects

* Enabled Eager AutoCodeGen for operators with multiple OpBases

* Adjusted Eager AutoCodeGen to Enable Passing Output Tensor as Input Argument

* Handled Dispensable Inputs/Outputs in Eager AutoCodeGen

* Adjusted function generation/call between Python-C API & Dygraph API

* Synchronized auto-generated Python-C API with Dygraph Forward Functions

* support more eager tensor api

* fix merge compile error

* fix compile error and fit develop code

* support pure CPU

* fix some logic error in eager_mode

* support _varbase_creator in eager mode

* Added safe_initialized interface to EagerTensor for use in processing dispensable inputs

* for eager mode

* refine

* support multiple constructor for eager tensor

* add place related code

* polish code

* specific randint with dtype of int64

* Support pure cpu test

* eager logic

* refine test in pure cpu

* eager logic

* eager logic

* eager logic, test=develop

* skip core.eager when in inference, test=develop

* refine, test=develop

* refine, test=develop

* call RetainGrad after run forward kernel, test=develop

* refine, test=develop

* support dygraph util, meta, guard test

* eager test case

* support inference test

* refine test and fix initializer failed

* modify eagertensor patch method

* add eagertensor.clear_grandint, test=develop

* refine, test=develop

* refine, test=develop

* refine, test=develop

* support create varbase and fix retain grad error

* call monkey_patch_varbase in _test_eager_guard, test=develop

* fix windows error

* split clear_gradient to clear_gradient and zero_grads, test=develop

* refine, test=develop

* refine, test=develop

* support test_imperative_basic test in eager mode

* remove additional log in variable.h

* remove additional log in variable.h

* remove additional code create in merge

* eager

* fix some eager logic, test=develop

* refine, test=develop

* refine, test=develop

* refine, test=develop

* patch_tensor_method_func, test=develop

* refine, test=develop

* eager test case, test=develop

* refine, test=develop

* eager, test=develop

* eager, test=develop

* eager optimizer, test=develop

* eager optimizer, test=develop

* eager test_imperative_optimizer_v2, test=develop

* eager, test=develop

* refine, test=develop

* refine, test=develop

* eager, test=develop

* add resize in share buffer to, test=develop

* eager, test=develop

* fix _share_buffer_to, test=develop

* refine, test=develop

* refine, test=develop

* support eager for dataloader,test=develop
Co-authored-by: Njim19930609 <jim19930609@gmail.com>
Co-authored-by: NJiabinYang <360788950@qq.com>
上级 4d413d02
...@@ -26,6 +26,7 @@ limitations under the License. */ ...@@ -26,6 +26,7 @@ limitations under the License. */
#include "paddle/pten/common/data_type.h" #include "paddle/pten/common/data_type.h"
#include "paddle/pten/core/convert_utils.h" #include "paddle/pten/core/convert_utils.h"
#include "paddle/pten/core/dense_tensor.h" #include "paddle/pten/core/dense_tensor.h"
#include "pybind11/detail/internals.h"
#include "pybind11/numpy.h" #include "pybind11/numpy.h"
#include "pybind11/pybind11.h" #include "pybind11/pybind11.h"
#pragma GCC diagnostic ignored "-Wmissing-field-initializers" #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
...@@ -48,6 +49,7 @@ PyObject* EagerTensorNew(PyTypeObject* type, PyObject* args, PyObject* kwargs) { ...@@ -48,6 +49,7 @@ PyObject* EagerTensorNew(PyTypeObject* type, PyObject* args, PyObject* kwargs) {
if (obj) { if (obj) {
auto v = reinterpret_cast<EagerTensorObject*>(obj); auto v = reinterpret_cast<EagerTensorObject*>(obj);
new (&(v->eager_tensor)) egr::EagerTensor(); new (&(v->eager_tensor)) egr::EagerTensor();
Py_INCREF(obj);
} }
return obj; return obj;
} }
...@@ -726,7 +728,7 @@ int EagerTensorInit(PyObject* self, PyObject* args, PyObject* kwargs) { ...@@ -726,7 +728,7 @@ int EagerTensorInit(PyObject* self, PyObject* args, PyObject* kwargs) {
return 1; return 1;
} }
static void eagertensor_dealloc(EagerTensorObject* self) { static void EagerTensorDealloc(EagerTensorObject* self) {
self->eager_tensor.~EagerTensor(); self->eager_tensor.~EagerTensor();
Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self)); Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
} }
...@@ -739,71 +741,44 @@ PyNumberMethods number_methods; ...@@ -739,71 +741,44 @@ PyNumberMethods number_methods;
PySequenceMethods sequence_methods; PySequenceMethods sequence_methods;
PyMappingMethods mapping_methods; PyMappingMethods mapping_methods;
PyTypeObject eager_tensor_type = {
PyVarObject_HEAD_INIT(NULL, 0) "core_avx.eager.EagerTensor", /* tp_name */
sizeof(EagerTensorObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)eagertensor_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_reserved */
0, /* tp_repr */
&number_methods, /* tp_as_number */
&sequence_methods, /* tp_as_sequence */
&mapping_methods, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Py_TPFLAGS_HEAPTYPE, /* tp_flags */
0, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
variable_methods, /* tp_methods */
0, /* tp_members */
variable_properties, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
EagerTensorInit, /* tp_init */
0, /* tp_alloc */
EagerTensorNew, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
0, /* tp_mro */
0, /* tp_cache */
0, /* tp_subclasses */
0, /* tp_weaklist */
0, /* tp_del */
0, /* tp_version_tag */
0 /* tp_finalize */
};
void BindEager(pybind11::module* module) { void BindEager(pybind11::module* module) {
auto m = module->def_submodule("eager"); auto m = module->def_submodule("eager");
p_eager_tensor_type = &eager_tensor_type; auto& internals = pybind11::detail::get_internals();
if (PyType_Ready(&eager_tensor_type) < 0) { auto heap_type = reinterpret_cast<PyHeapTypeObject*>(
internals.default_metaclass->tp_alloc(internals.default_metaclass, 0));
heap_type->ht_name = ToPyObject("EagerTensor");
heap_type->ht_qualname = ToPyObject("EagerTensor");
auto type = &heap_type->ht_type;
type->tp_name = "EagerTensor";
type->tp_basicsize = sizeof(EagerTensorObject);
type->tp_dealloc = (destructor)EagerTensorDealloc;
type->tp_as_number = &number_methods;
type->tp_as_sequence = &sequence_methods;
type->tp_as_mapping = &mapping_methods;
type->tp_methods = variable_methods;
type->tp_getset = variable_properties;
type->tp_init = EagerTensorInit;
type->tp_new = EagerTensorNew;
Py_INCREF(internals.instance_base);
type->tp_base = reinterpret_cast<PyTypeObject*>(internals.instance_base);
type->tp_flags |=
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE;
#if PY_VERSION_HEX >= 0x03050000
type->tp_as_async = &heap_type->as_async;
#endif
p_eager_tensor_type = type;
if (PyType_Ready(type) < 0) {
PADDLE_THROW(platform::errors::Fatal( PADDLE_THROW(platform::errors::Fatal(
"Init Paddle error in BindEager(PyType_Ready).")); "Init Paddle error in BindEager(PyType_Ready)."));
return; return;
} }
Py_INCREF(&eager_tensor_type); Py_INCREF(type);
if (PyModule_AddObject(m.ptr(), "EagerTensor", if (PyModule_AddObject(m.ptr(), "EagerTensor",
reinterpret_cast<PyObject*>(&eager_tensor_type)) < 0) { reinterpret_cast<PyObject*>(type)) < 0) {
Py_DECREF(&eager_tensor_type); Py_DECREF(type);
Py_DECREF(m.ptr()); Py_DECREF(m.ptr());
PADDLE_THROW(platform::errors::Fatal( PADDLE_THROW(platform::errors::Fatal(
"Init Paddle error in BindEager(PyModule_AddObject).")); "Init Paddle error in BindEager(PyModule_AddObject)."));
......
...@@ -41,6 +41,8 @@ namespace pybind { ...@@ -41,6 +41,8 @@ namespace pybind {
namespace py = ::pybind11; namespace py = ::pybind11;
extern PyTypeObject* p_eager_tensor_type; extern PyTypeObject* p_eager_tensor_type;
extern PyTypeObject* g_multidevicefeedreader_pytype;
extern PyTypeObject* g_orderedmultidevicefeedreader_pytype;
size_t PyArray_Size_(PyObject* numpy_data) { size_t PyArray_Size_(PyObject* numpy_data) {
size_t res = 1; size_t res = 1;
...@@ -146,6 +148,31 @@ static PyObject* eager_api_tensor_copy(PyObject* self, PyObject* args, ...@@ -146,6 +148,31 @@ static PyObject* eager_api_tensor_copy(PyObject* self, PyObject* args,
EAGER_CATCH_AND_THROW_RETURN_NULL EAGER_CATCH_AND_THROW_RETURN_NULL
} }
static PyObject* eager_api_read_next_eager_tensor_list(PyObject* self,
PyObject* args,
PyObject* kwargs) {
EAGER_TRY
auto tensor_list = CastPyArg2VectorOfTensor(PyTuple_GET_ITEM(args, 0), 0);
std::vector<egr::EagerTensor> eager_tensor_list;
eager_tensor_list.reserve(tensor_list.size());
auto func = [](framework::Tensor& tensor) {
egr::EagerTensor eager_tensor(
egr::Controller::Instance().GenerateUniqueName());
auto autograd_meta = egr::EagerUtils::autograd_meta(&eager_tensor);
autograd_meta->SetPersistable(false);
autograd_meta->SetStopGradient(true);
auto tmp = std::move(tensor);
eager_tensor.set_impl(
std::move(paddle::experimental::MakePtenDenseTensor(tmp)));
return eager_tensor;
};
for (auto& tensor : tensor_list) {
eager_tensor_list.emplace_back(func(tensor));
}
return ToPyObject(eager_tensor_list);
EAGER_CATCH_AND_THROW_RETURN_NULL
}
PyMethodDef variable_functions[] = { PyMethodDef variable_functions[] = {
{"scale", (PyCFunction)(void (*)(void))eager_api_scale, {"scale", (PyCFunction)(void (*)(void))eager_api_scale,
METH_VARARGS | METH_KEYWORDS, NULL}, METH_VARARGS | METH_KEYWORDS, NULL},
...@@ -159,6 +186,9 @@ PyMethodDef variable_functions[] = { ...@@ -159,6 +186,9 @@ PyMethodDef variable_functions[] = {
METH_VARARGS | METH_KEYWORDS, NULL}, METH_VARARGS | METH_KEYWORDS, NULL},
{"tensor_copy", (PyCFunction)(void (*)(void))eager_api_tensor_copy, {"tensor_copy", (PyCFunction)(void (*)(void))eager_api_tensor_copy,
METH_VARARGS | METH_KEYWORDS, NULL}, METH_VARARGS | METH_KEYWORDS, NULL},
{"read_next_eager_tensor_list",
(PyCFunction)(void (*)(void))eager_api_read_next_eager_tensor_list,
METH_VARARGS | METH_KEYWORDS, NULL},
{NULL, NULL, 0, NULL}}; {NULL, NULL, 0, NULL}};
void BindFunctions(PyObject* module) { void BindFunctions(PyObject* module) {
......
...@@ -237,7 +237,7 @@ static PyObject* eager_tensor__share_buffer_to(EagerTensorObject* self, ...@@ -237,7 +237,7 @@ static PyObject* eager_tensor__share_buffer_to(EagerTensorObject* self,
PyObject* args, PyObject* args,
PyObject* kwargs) { PyObject* kwargs) {
EAGER_SYNC_TRY EAGER_SYNC_TRY
egr::EagerTensor* src_ptr = egr::EagerTensor* dst_ptr =
&(reinterpret_cast<EagerTensorObject*>(PyTuple_GET_ITEM(args, 0)) &(reinterpret_cast<EagerTensorObject*>(PyTuple_GET_ITEM(args, 0))
->eager_tensor); ->eager_tensor);
PADDLE_ENFORCE_EQ(self->eager_tensor.initialized(), true, PADDLE_ENFORCE_EQ(self->eager_tensor.initialized(), true,
...@@ -245,7 +245,12 @@ static PyObject* eager_tensor__share_buffer_to(EagerTensorObject* self, ...@@ -245,7 +245,12 @@ static PyObject* eager_tensor__share_buffer_to(EagerTensorObject* self,
"Tensor %s has not been initialized! please initialize " "Tensor %s has not been initialized! please initialize "
"src tensor before share_buffer_with to other.", "src tensor before share_buffer_with to other.",
self->eager_tensor.name())); self->eager_tensor.name()));
src_ptr->set_impl(self->eager_tensor.impl()); auto* src_tensor =
static_cast<paddle::framework::Tensor*>(self->eager_tensor.impl().get());
auto dst_tensor =
static_cast<paddle::framework::Tensor*>(dst_ptr->impl().get());
dst_tensor->ShareDataWith(*src_tensor);
dst_tensor->ShareDataTypeWith(*src_tensor);
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
EAGER_CATCH_AND_THROW_RETURN_NULL EAGER_CATCH_AND_THROW_RETURN_NULL
...@@ -255,6 +260,47 @@ static PyObject* eager_tensor__is_shared_buffer_with(EagerTensorObject* self, ...@@ -255,6 +260,47 @@ static PyObject* eager_tensor__is_shared_buffer_with(EagerTensorObject* self,
PyObject* args, PyObject* args,
PyObject* kwargs) { PyObject* kwargs) {
EAGER_SYNC_TRY EAGER_SYNC_TRY
egr::EagerTensor* dst_ptr =
&(reinterpret_cast<EagerTensorObject*>(PyTuple_GET_ITEM(args, 0))
->eager_tensor);
PADDLE_ENFORCE_EQ(self->eager_tensor.initialized(), true,
platform::errors::InvalidArgument(
"Tensor %s has not been initialized! please initialize "
"src tensor before share_buffer_with to other.",
self->eager_tensor.name()));
bool res = false;
if (!self->eager_tensor.defined() || !dst_ptr->defined()) {
return ToPyObject(res);
}
auto* self_ptr =
static_cast<paddle::framework::Tensor*>(self->eager_tensor.impl().get());
auto dst_tensor =
static_cast<paddle::framework::Tensor*>(dst_ptr->impl().get());
res = dst_tensor->IsSharedBufferWith(*self_ptr);
return ToPyObject(res);
EAGER_CATCH_AND_THROW_RETURN_NULL
}
static PyObject* eager_tensor__share_underline_tensor_to(
EagerTensorObject* self, PyObject* args, PyObject* kwargs) {
EAGER_SYNC_TRY
egr::EagerTensor* src_ptr =
&(reinterpret_cast<EagerTensorObject*>(PyTuple_GET_ITEM(args, 0))
->eager_tensor);
PADDLE_ENFORCE_EQ(self->eager_tensor.initialized(), true,
platform::errors::InvalidArgument(
"Tensor %s has not been initialized! please initialize "
"src tensor before share_buffer_with to other.",
self->eager_tensor.name()));
src_ptr->set_impl(self->eager_tensor.impl());
Py_INCREF(Py_None);
return Py_None;
EAGER_CATCH_AND_THROW_RETURN_NULL
}
static PyObject* eager_tensor__is_shared_underline_tensor_with(
EagerTensorObject* self, PyObject* args, PyObject* kwargs) {
EAGER_SYNC_TRY
egr::EagerTensor src_tensor = egr::EagerTensor src_tensor =
CastPyArg2EagerTensor(PyTuple_GET_ITEM(args, 0), 0); CastPyArg2EagerTensor(PyTuple_GET_ITEM(args, 0), 0);
PADDLE_ENFORCE_EQ(src_tensor.initialized(), true, PADDLE_ENFORCE_EQ(src_tensor.initialized(), true,
...@@ -336,6 +382,12 @@ PyMethodDef variable_methods[] = { ...@@ -336,6 +382,12 @@ PyMethodDef variable_methods[] = {
{"_is_shared_buffer_with", {"_is_shared_buffer_with",
(PyCFunction)(void (*)(void))eager_tensor__is_shared_buffer_with, (PyCFunction)(void (*)(void))eager_tensor__is_shared_buffer_with,
METH_VARARGS | METH_KEYWORDS, NULL}, METH_VARARGS | METH_KEYWORDS, NULL},
{"_share_underline_tensor_to",
(PyCFunction)(void (*)(void))eager_tensor__share_underline_tensor_to,
METH_VARARGS | METH_KEYWORDS, NULL},
{"_is_shared_underline_tensor_with",
(PyCFunction)(void (*)(void))eager_tensor__is_shared_underline_tensor_with,
METH_VARARGS | METH_KEYWORDS, NULL},
{"detach", (PyCFunction)(void (*)(void))eager_tensor_method_detach, {"detach", (PyCFunction)(void (*)(void))eager_tensor_method_detach,
METH_VARARGS | METH_KEYWORDS, NULL}, METH_VARARGS | METH_KEYWORDS, NULL},
{"get_tensor", {"get_tensor",
......
...@@ -40,6 +40,7 @@ extern PyTypeObject* g_xpuplace_pytype; ...@@ -40,6 +40,7 @@ extern PyTypeObject* g_xpuplace_pytype;
extern PyTypeObject* g_npuplace_pytype; extern PyTypeObject* g_npuplace_pytype;
extern PyTypeObject* g_cudapinnedplace_pytype; extern PyTypeObject* g_cudapinnedplace_pytype;
extern PyTypeObject* g_framework_tensor_pytype; extern PyTypeObject* g_framework_tensor_pytype;
extern PyTypeObject* g_framework_lodtensorarray_pytype;
int TensorDtype2NumpyDtype(pten::DataType dtype) { int TensorDtype2NumpyDtype(pten::DataType dtype) {
switch (dtype) { switch (dtype) {
...@@ -316,6 +317,57 @@ framework::Tensor CastPyArg2FrameworkTensor(PyObject* obj, ssize_t arg_pos) { ...@@ -316,6 +317,57 @@ framework::Tensor CastPyArg2FrameworkTensor(PyObject* obj, ssize_t arg_pos) {
} }
} }
std::vector<framework::Tensor> CastPyArg2VectorOfTensor(PyObject* obj,
ssize_t arg_pos) {
std::vector<framework::LoDTensor> result;
if (PyList_Check(obj)) {
Py_ssize_t len = PyList_Size(obj);
PyObject* item = nullptr;
for (Py_ssize_t i = 0; i < len; i++) {
item = PyList_GetItem(obj, i);
if (PyObject_IsInstance(
item, reinterpret_cast<PyObject*>(g_framework_tensor_pytype))) {
result.emplace_back(
::pybind11::handle(item).cast<framework::LoDTensor>());
} else {
PADDLE_THROW(platform::errors::InvalidArgument(
"argument (position %d) must be "
"list of LoDTensor, but got %s at pos %d",
arg_pos + 1,
reinterpret_cast<PyTypeObject*>(item->ob_type)->tp_name, i));
}
}
} else if (PyTuple_Check(obj)) {
Py_ssize_t len = PyTuple_Size(obj);
PyObject* item = nullptr;
for (Py_ssize_t i = 0; i < len; i++) {
item = PyTuple_GetItem(obj, i);
if (PyObject_IsInstance(
item, reinterpret_cast<PyObject*>(g_framework_tensor_pytype))) {
result.emplace_back(
::pybind11::handle(item).cast<framework::LoDTensor>());
} else {
PADDLE_THROW(platform::errors::InvalidArgument(
"argument (position %d) must be "
"list of LoDTensor, but got %s at pos %d",
arg_pos + 1,
reinterpret_cast<PyTypeObject*>(item->ob_type)->tp_name, i));
}
}
} else if (PyObject_IsInstance(obj, reinterpret_cast<PyObject*>(
g_framework_lodtensorarray_pytype))) {
return ::pybind11::handle(obj).cast<framework::LoDTensorArray>();
} else if (obj == Py_None) {
return {};
} else {
PADDLE_THROW(platform::errors::InvalidArgument(
"argument (position %d) must be "
"list or tuple, but got %s",
arg_pos + 1, reinterpret_cast<PyTypeObject*>(obj->ob_type)->tp_name));
}
return result;
}
paddle::framework::proto::VarType::Type CastPyArg2ProtoType(PyObject* obj, paddle::framework::proto::VarType::Type CastPyArg2ProtoType(PyObject* obj,
ssize_t arg_pos) { ssize_t arg_pos) {
paddle::framework::proto::VarType::Type dtype; paddle::framework::proto::VarType::Type dtype;
......
...@@ -37,6 +37,8 @@ std::vector<egr::EagerTensor> CastPyArg2VectorOfEagerTensor(PyObject* obj, ...@@ -37,6 +37,8 @@ std::vector<egr::EagerTensor> CastPyArg2VectorOfEagerTensor(PyObject* obj,
ssize_t arg_pos); ssize_t arg_pos);
platform::Place CastPyArg2Place(PyObject* obj, ssize_t arg_pos); platform::Place CastPyArg2Place(PyObject* obj, ssize_t arg_pos);
framework::Tensor CastPyArg2FrameworkTensor(PyObject* obj, ssize_t arg_pos); framework::Tensor CastPyArg2FrameworkTensor(PyObject* obj, ssize_t arg_pos);
std::vector<framework::LoDTensor> CastPyArg2VectorOfTensor(PyObject* obj,
ssize_t arg_pos);
std::vector<int> CastPyArg2VectorOfInt(PyObject* obj, size_t arg_pos); std::vector<int> CastPyArg2VectorOfInt(PyObject* obj, size_t arg_pos);
framework::proto::VarType::Type CastPyArg2ProtoType(PyObject* obj, framework::proto::VarType::Type CastPyArg2ProtoType(PyObject* obj,
ssize_t arg_pos); ssize_t arg_pos);
......
...@@ -2047,6 +2047,29 @@ void BindImperative(py::module *m_ptr) { ...@@ -2047,6 +2047,29 @@ void BindImperative(py::module *m_ptr) {
} }
return dst_->IsSharedBufferWith(*src); return dst_->IsSharedBufferWith(*src);
}) })
.def("_share_underline_tensor_to",
[](const std::shared_ptr<imperative::VarBase> &self,
std::shared_ptr<imperative::VarBase> &dst) {
auto *src = self->MutableVar()->GetMutable<framework::LoDTensor>();
auto *dst_ = dst->MutableVar()->GetMutable<framework::LoDTensor>();
PADDLE_ENFORCE_EQ(
src->IsInitialized(), true,
platform::errors::InvalidArgument(
"Tensor %s has not been initialized!", self->Name()));
dst_->ShareBufferWith(*src);
dst_->ShareDataTypeWith(*src);
dst_->Resize(src->dims());
})
.def("_is_shared_underline_tensor_with",
[](const std::shared_ptr<imperative::VarBase> &self,
std::shared_ptr<imperative::VarBase> &dst) {
auto *src = self->MutableVar()->GetMutable<framework::LoDTensor>();
auto *dst_ = dst->MutableVar()->GetMutable<framework::LoDTensor>();
if (!src->IsInitialized() || !dst_->IsInitialized()) {
return false;
}
return dst_->IsSharedBufferWith(*src);
})
.def("_slice", .def("_slice",
[](const std::shared_ptr<imperative::VarBase> &self, [](const std::shared_ptr<imperative::VarBase> &self,
int64_t begin_idx, int64_t end_idx) { int64_t begin_idx, int64_t end_idx) {
......
...@@ -151,6 +151,15 @@ std::map<std::string, std::set<std::string>> op_outs_map = { ...@@ -151,6 +151,15 @@ std::map<std::string, std::set<std::string>> op_outs_map = {
// For those OPs, we need to manually specify the outs need to pass in this map. // For those OPs, we need to manually specify the outs need to pass in this map.
std::map<std::string, std::set<std::string>> op_passing_outs_map = { std::map<std::string, std::set<std::string>> op_passing_outs_map = {
{"sgd", {"ParamOut", "MasterParamOut"}}, {"sgd", {"ParamOut", "MasterParamOut"}},
{"rmsprop", {"ParamOut", "MomentOut", "MeanSquareOut", "MeanGradOut"}},
{"ftrl", {"ParamOut", "SquaredAccumOut", "LinearAccumOut"}},
{"adadelta", {"ParamOut", "AvgSquaredGradOut", "AvgSquaredUpdateOut"}},
{"adagrad", {"ParamOut", "MomentOut"}},
{"adamax", {"ParamOut", "MomentOut", "InfNormOut"}},
{"dpsgd", {"ParamOut"}},
{"decayed_adagrad", {"ParamOut", "MomentOut"}},
{"lars_momentum", {"ParamOut", "VelocityOut"}},
{"coalesce_tensor", {"Output", "FusedOutput"}},
{"adam", {"adam",
{"ParamOut", "Moment1Out", "Moment2Out", "Beta1PowOut", "Beta2PowOut", {"ParamOut", "Moment1Out", "Moment2Out", "Beta1PowOut", "Beta2PowOut",
"MasterParamOut"}}, "MasterParamOut"}},
......
...@@ -170,6 +170,7 @@ PyTypeObject *g_npuplace_pytype = nullptr; ...@@ -170,6 +170,7 @@ PyTypeObject *g_npuplace_pytype = nullptr;
PyTypeObject *g_cudapinnedplace_pytype = nullptr; PyTypeObject *g_cudapinnedplace_pytype = nullptr;
PyTypeObject *g_mluplace_pytype = nullptr; PyTypeObject *g_mluplace_pytype = nullptr;
PyTypeObject *g_framework_tensor_pytype = nullptr; PyTypeObject *g_framework_tensor_pytype = nullptr;
PyTypeObject *g_framework_lodtensorarray_pytype = nullptr;
bool IsCompiledWithCUDA() { bool IsCompiledWithCUDA() {
#if !defined(PADDLE_WITH_CUDA) && !defined(PADDLE_WITH_HIP) #if !defined(PADDLE_WITH_CUDA) && !defined(PADDLE_WITH_HIP)
...@@ -2420,7 +2421,7 @@ All parameter, weight, gradient are variables in Paddle. ...@@ -2420,7 +2421,7 @@ All parameter, weight, gradient are variables in Paddle.
return res; return res;
}); });
py::class_<LoDTensorArray>(m, "LoDTensorArray", R"DOC( py::class_<LoDTensorArray> pylodtensorarray(m, "LoDTensorArray", R"DOC(
LoDTensorArray is array of LoDTensor, it supports operator[], len() and for-loop iteration. LoDTensorArray is array of LoDTensor, it supports operator[], len() and for-loop iteration.
Examples: Examples:
...@@ -2429,7 +2430,10 @@ All parameter, weight, gradient are variables in Paddle. ...@@ -2429,7 +2430,10 @@ All parameter, weight, gradient are variables in Paddle.
import paddle.fluid as fluid import paddle.fluid as fluid
arr = fluid.LoDTensorArray() arr = fluid.LoDTensorArray()
)DOC") )DOC");
g_framework_lodtensorarray_pytype =
reinterpret_cast<PyTypeObject *>(pylodtensorarray.ptr());
pylodtensorarray
.def("__init__", .def("__init__",
[](LoDTensorArray &instance) { new (&instance) LoDTensorArray(); }) [](LoDTensorArray &instance) { new (&instance) LoDTensorArray(); })
.def("__getitem__", .def("__getitem__",
......
...@@ -31,7 +31,7 @@ import queue ...@@ -31,7 +31,7 @@ import queue
import paddle import paddle
from .. import core, layers from .. import core, layers
from ..framework import in_dygraph_mode from ..framework import in_dygraph_mode, _in_eager_mode
from ..multiprocess_utils import _set_SIGCHLD_handler, MP_STATUS_CHECK_INTERVAL, CleanupFuncRegistrar from ..multiprocess_utils import _set_SIGCHLD_handler, MP_STATUS_CHECK_INTERVAL, CleanupFuncRegistrar
from .fetcher import _IterableDatasetFetcher, _MapDatasetFetcher from .fetcher import _IterableDatasetFetcher, _MapDatasetFetcher
from .batch_sampler import _InfiniteIterableSampler from .batch_sampler import _InfiniteIterableSampler
...@@ -252,7 +252,11 @@ class _DataLoaderIterSingleProcess(_DataLoaderIterBase): ...@@ -252,7 +252,11 @@ class _DataLoaderIterSingleProcess(_DataLoaderIterBase):
def __next__(self): def __next__(self):
try: try:
if in_dygraph_mode(): if in_dygraph_mode():
data = self._reader.read_next_var_list() if _in_eager_mode():
data = core.eager.read_next_eager_tensor_list(
self._reader.read_next_list()[0])
else:
data = self._reader.read_next_var_list()
data = _restore_batch(data, self._structure_infos.pop(0)) data = _restore_batch(data, self._structure_infos.pop(0))
else: else:
if self._return_list: if self._return_list:
...@@ -444,7 +448,11 @@ class _DataLoaderIterMultiProcess(_DataLoaderIterBase): ...@@ -444,7 +448,11 @@ class _DataLoaderIterMultiProcess(_DataLoaderIterBase):
# the blocking_queue cachees instead of recreating one # the blocking_queue cachees instead of recreating one
while self._blocking_queue.size() >= len(self._places): while self._blocking_queue.size() >= len(self._places):
if in_dygraph_mode(): if in_dygraph_mode():
self._reader.read_next_var_list() if _in_eager_mode():
data = core.eager.read_next_eager_tensor_list(
self._reader.read_next_list()[0])
else:
self._reader.read_next_var_list()
elif self._return_list: elif self._return_list:
self._reader.read_next_list() self._reader.read_next_list()
else: else:
...@@ -696,7 +704,11 @@ class _DataLoaderIterMultiProcess(_DataLoaderIterBase): ...@@ -696,7 +704,11 @@ class _DataLoaderIterMultiProcess(_DataLoaderIterBase):
self._blocking_queue.close() self._blocking_queue.close()
if in_dygraph_mode(): if in_dygraph_mode():
data = self._reader.read_next_var_list() if _in_eager_mode():
data = core.eager.read_next_eager_tensor_list(
self._reader.read_next_list()[0])
else:
data = self._reader.read_next_var_list()
data = _restore_batch(data, self._structure_infos.pop(0)) data = _restore_batch(data, self._structure_infos.pop(0))
else: else:
if self._return_list: if self._return_list:
......
...@@ -635,9 +635,13 @@ def monkey_patch_varbase(): ...@@ -635,9 +635,13 @@ def monkey_patch_varbase():
def __nonzero__(self): def __nonzero__(self):
numel = np.prod(self.shape) numel = np.prod(self.shape)
assert numel == 1, "When Variable is used as the condition of if/while , Variable can only contain one element." assert numel == 1, "When Variable is used as the condition of if/while , Variable can only contain one element."
tensor = self.value().get_tensor() if core._in_eager_mode():
assert tensor._is_initialized(), "tensor not initialized" assert self._is_initialized(), "tensor not initialized"
return bool(np.all(tensor.__array__() > 0)) return bool(np.all(self.numpy() > 0))
else:
tensor = self.value().get_tensor()
assert tensor._is_initialized(), "tensor not initialized"
return bool(np.all(tensor.__array__() > 0))
def __bool__(self): def __bool__(self):
return self.__nonzero__() return self.__nonzero__()
......
...@@ -252,9 +252,9 @@ class UniformInitializer(Initializer): ...@@ -252,9 +252,9 @@ class UniformInitializer(Initializer):
if var.dtype == VarDesc.VarType.FP16: if var.dtype == VarDesc.VarType.FP16:
var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype, var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype,
'out_dtype', var.dtype) 'out_dtype', var.dtype)
var.copy_(var_tmp, False) var_tmp._share_underline_tensor_to(var)
else: else:
var.copy_(out_var, False) out_var._share_underline_tensor_to(var)
return None return None
else: else:
op = block.append_op( op = block.append_op(
...@@ -334,24 +334,28 @@ class NormalInitializer(Initializer): ...@@ -334,24 +334,28 @@ class NormalInitializer(Initializer):
if self._seed == 0: if self._seed == 0:
self._seed = block.program.random_seed self._seed = block.program.random_seed
op = block.append_op( if framework.in_dygraph_mode():
type="gaussian_random", out_var = _C_ops.gaussian_random(
outputs={"Out": var}, 'shape', var.shape, 'dtype', var.dtype, 'mean', self._mean,
attrs={ 'std', self._std_dev, 'seed', self._seed, 'use_mkldnn', False)
"shape": var.shape, out_var._share_underline_tensor_to(var)
"dtype": var.dtype, return None
"mean": self._mean, else:
"std": self._std_dev, op = block.append_op(
"seed": self._seed, type="gaussian_random",
"use_mkldnn": False outputs={"Out": var},
}, attrs={
stop_gradient=True) "shape": var.shape,
"dtype": var.dtype,
if not framework.in_dygraph_mode(): "mean": self._mean,
"std": self._std_dev,
"seed": self._seed,
"use_mkldnn": False
},
stop_gradient=True)
var.op = op var.op = op
return op return op
else:
return None
class TruncatedNormalInitializer(Initializer): class TruncatedNormalInitializer(Initializer):
...@@ -420,9 +424,9 @@ class TruncatedNormalInitializer(Initializer): ...@@ -420,9 +424,9 @@ class TruncatedNormalInitializer(Initializer):
if var.dtype in [VarDesc.VarType.FP16, VarDesc.VarType.BF16]: if var.dtype in [VarDesc.VarType.FP16, VarDesc.VarType.BF16]:
var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype, var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype,
'out_dtype', var.dtype) 'out_dtype', var.dtype)
var.copy_(var_tmp, False) var_tmp._share_underline_tensor_to(var)
else: else:
var.copy_(out_var, False) out_var._share_underline_tensor_to(var)
return None return None
else: else:
op = block.append_op( op = block.append_op(
...@@ -560,9 +564,9 @@ class XavierInitializer(Initializer): ...@@ -560,9 +564,9 @@ class XavierInitializer(Initializer):
var.dtype == VarDesc.VarType.BF16 and not self._uniform): var.dtype == VarDesc.VarType.BF16 and not self._uniform):
var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype, var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype,
'out_dtype', var.dtype) 'out_dtype', var.dtype)
var.copy_(var_tmp, False) var_tmp._share_underline_tensor_to(var)
else: else:
var.copy_(out_var, False) out_var._share_underline_tensor_to(var)
return None return None
else: else:
if self._uniform: if self._uniform:
...@@ -713,9 +717,9 @@ class MSRAInitializer(Initializer): ...@@ -713,9 +717,9 @@ class MSRAInitializer(Initializer):
var.dtype == VarDesc.VarType.BF16 and not self._uniform): var.dtype == VarDesc.VarType.BF16 and not self._uniform):
var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype, var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype,
'out_dtype', var.dtype) 'out_dtype', var.dtype)
var.copy_(var_tmp, False) var_tmp._share_underline_tensor_to(var)
else: else:
var.copy_(out_var, False) out_var._share_underline_tensor_to(var)
return None return None
else: else:
if self._uniform: if self._uniform:
...@@ -881,9 +885,9 @@ class BilinearInitializer(Initializer): ...@@ -881,9 +885,9 @@ class BilinearInitializer(Initializer):
]: ]:
var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype, var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype,
'out_dtype', var.dtype) 'out_dtype', var.dtype)
var.copy_(var_tmp, False) var_tmp._share_underline_tensor_to(var)
else: else:
var.copy_(out_var, False) out_var._share_underline_tensor_to(var)
return None return None
else: else:
op = block.append_op( op = block.append_op(
...@@ -987,9 +991,9 @@ class NumpyArrayInitializer(Initializer): ...@@ -987,9 +991,9 @@ class NumpyArrayInitializer(Initializer):
if var.dtype in [VarDesc.VarType.FP16, VarDesc.VarType.BF16]: if var.dtype in [VarDesc.VarType.FP16, VarDesc.VarType.BF16]:
var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype, var_tmp = _C_ops.cast(out_var, 'in_dtype', out_var.dtype,
'out_dtype', var.dtype) 'out_dtype', var.dtype)
var.copy_(var_tmp, False) var_tmp._share_underline_tensor_to(var)
else: else:
var.copy_(out_var, False) out_var._share_underline_tensor_to(var)
return None return None
else: else:
op = block.append_op( op = block.append_op(
......
...@@ -439,16 +439,23 @@ class Optimizer(object): ...@@ -439,16 +439,23 @@ class Optimizer(object):
self._learning_rate = value self._learning_rate = value
current_lr = self._global_learning_rate() current_lr = self._global_learning_rate()
if current_lr is not None: if current_lr is not None:
global_block = framework.default_main_program().global_block() if framework.in_dygraph_mode():
global_block.append_op( _C_ops.fill_constant(current_lr, 'value',
type='fill_constant', float(value), 'dtype',
outputs={'Out': [current_lr]}, current_lr.dtype, 'shape',
attrs={ list(current_lr.shape))
'dtype': current_lr.dtype, else:
'shape': list(current_lr.shape), global_block = framework.default_main_program(
'value': float(value) ).global_block()
}, global_block.append_op(
stop_gradient=True) type='fill_constant',
outputs={'Out': [current_lr]},
attrs={
'dtype': current_lr.dtype,
'shape': list(current_lr.shape),
'value': float(value)
},
stop_gradient=True)
else: else:
assert len(value.shape) == 1 and value.shape[ assert len(value.shape) == 1 and value.shape[
0] == 1, "optimizer's learning rate must be 1-D Tensor with shape[1]" 0] == 1, "optimizer's learning rate must be 1-D Tensor with shape[1]"
...@@ -606,7 +613,9 @@ class Optimizer(object): ...@@ -606,7 +613,9 @@ class Optimizer(object):
name=var_name, name=var_name,
persistable=True, persistable=True,
dtype=dtype or param.dtype, dtype=dtype or param.dtype,
type=param.type if type is None else type, type=core.VarDesc.VarType.LOD_TENSOR
if framework._in_eager_mode() else (param.type
if type is None else type),
shape=shape, shape=shape,
belong_to_optimizer=True) belong_to_optimizer=True)
if device is None: if device is None:
...@@ -2146,15 +2155,34 @@ class LarsMomentumOptimizer(Optimizer): ...@@ -2146,15 +2155,34 @@ class LarsMomentumOptimizer(Optimizer):
inputs["MasterParam"] = master_weight inputs["MasterParam"] = master_weight
outputs["MasterParamOut"] = master_weight outputs["MasterParamOut"] = master_weight
# create the momentum optimize op if framework.in_dygraph_mode():
momentum_op = block.append_op( if _lars_weight_decay != 0.0:
type=self.type if _lars_weight_decay != 0.0 else 'momentum', tmp, tmp2 = _C_ops.lars_momentum(
inputs=inputs, [param_and_grad[0]], [param_and_grad[1]], [velocity_acc],
outputs=outputs, [lr], [param_and_grad[0]], [velocity_acc], "mu",
attrs=attrs, self._momentum, "lars_coeff", self._lars_coeff,
stop_gradient=True) "lars_weight_decay", [_lars_weight_decay],
"multi_precision", find_master, "epsilon", self._epsilon,
"rescale_grad", self._rescale_grad)
else:
_C_ops.momentum(param_and_grad[0], param_and_grad[1],
velocity_acc, lr, master_weight,
param_and_grad[0], velocity_acc, master_weight,
"mu", self._momentum, "lars_coeff",
self._lars_coeff, "lars_weight_decay",
[_lars_weight_decay], "multi_precision",
find_master, "epsilon", self._epsilon,
"rescale_grad", self._rescale_grad)
else:
# create the momentum optimize op
momentum_op = block.append_op(
type=self.type if _lars_weight_decay != 0.0 else 'momentum',
inputs=inputs,
outputs=outputs,
attrs=attrs,
stop_gradient=True)
return momentum_op return momentum_op
class AdagradOptimizer(Optimizer): class AdagradOptimizer(Optimizer):
...@@ -2256,21 +2284,29 @@ class AdagradOptimizer(Optimizer): ...@@ -2256,21 +2284,29 @@ class AdagradOptimizer(Optimizer):
moment_acc = self._get_accumulator(self._moment_acc_str, moment_acc = self._get_accumulator(self._moment_acc_str,
param_and_grad[0]) param_and_grad[0])
# Create the adagrad optimizer op if framework.in_dygraph_mode():
adagrad_op = block.append_op( _C_ops.adagrad(param_and_grad[0], param_and_grad[1], moment_acc,
type=self.type, self._create_param_lr(param_and_grad),
inputs={ param_and_grad[0], moment_acc, "epsilon",
"Param": param_and_grad[0], self._epsilon)
"Grad": param_and_grad[1], else:
"Moment": moment_acc, # Create the adagrad optimizer op
"LearningRate": self._create_param_lr(param_and_grad) adagrad_op = block.append_op(
}, type=self.type,
outputs={"ParamOut": param_and_grad[0], inputs={
"MomentOut": moment_acc}, "Param": param_and_grad[0],
attrs={"epsilon": self._epsilon}, "Grad": param_and_grad[1],
stop_gradient=True) "Moment": moment_acc,
"LearningRate": self._create_param_lr(param_and_grad)
},
outputs={
"ParamOut": param_and_grad[0],
"MomentOut": moment_acc
},
attrs={"epsilon": self._epsilon},
stop_gradient=True)
return adagrad_op return adagrad_op
class AdamOptimizer(Optimizer): class AdamOptimizer(Optimizer):
...@@ -2774,30 +2810,37 @@ class AdamaxOptimizer(Optimizer): ...@@ -2774,30 +2810,37 @@ class AdamaxOptimizer(Optimizer):
param_and_grad[0]) param_and_grad[0])
beta1_pow_acc = self._get_accumulator(self._beta1_pow_acc_str, beta1_pow_acc = self._get_accumulator(self._beta1_pow_acc_str,
param_and_grad[0]) param_and_grad[0])
# create the adamax optimize op if framework.in_dygraph_mode():
adamax_op = block.append_op( _C_ops.adamax(param_and_grad[0], param_and_grad[1],
type=self.type, self._create_param_lr(param_and_grad), moment,
inputs={ inf_norm, beta1_pow_acc, param_and_grad[0], moment,
"Param": param_and_grad[0], inf_norm, "beta1", self._beta1, "beta2", self._beta2,
"Grad": param_and_grad[1], "epsilon", self._epsilon)
"LearningRate": self._create_param_lr(param_and_grad), else:
"Moment": moment, # create the adamax optimize op
"InfNorm": inf_norm, adamax_op = block.append_op(
"Beta1Pow": beta1_pow_acc type=self.type,
}, inputs={
outputs={ "Param": param_and_grad[0],
"ParamOut": param_and_grad[0], "Grad": param_and_grad[1],
"MomentOut": moment, "LearningRate": self._create_param_lr(param_and_grad),
"InfNormOut": inf_norm "Moment": moment,
}, "InfNorm": inf_norm,
attrs={ "Beta1Pow": beta1_pow_acc
"beta1": self._beta1, },
"beta2": self._beta2, outputs={
"epsilon": self._epsilon "ParamOut": param_and_grad[0],
}, "MomentOut": moment,
stop_gradient=True) "InfNormOut": inf_norm
},
attrs={
"beta1": self._beta1,
"beta2": self._beta2,
"epsilon": self._epsilon
},
stop_gradient=True)
return adamax_op return adamax_op
def _finish_update(self, block, parameters_and_grads): def _finish_update(self, block, parameters_and_grads):
"""Update Beta1 Power accumulator """Update Beta1 Power accumulator
...@@ -2810,12 +2853,16 @@ class AdamaxOptimizer(Optimizer): ...@@ -2810,12 +2853,16 @@ class AdamaxOptimizer(Optimizer):
[param, grad]), name_scope('adamx'): [param, grad]), name_scope('adamx'):
beta1_pow_acc = self._get_accumulator(self._beta1_pow_acc_str, beta1_pow_acc = self._get_accumulator(self._beta1_pow_acc_str,
param) param)
block.append_op( if framework.in_dygraph_mode():
type="scale", tmp = _C_ops.scale(beta1_pow_acc, "scale", self._beta1)
inputs={"X": beta1_pow_acc}, beta1_pow_acc.copy_(tmp, False)
outputs={"Out": beta1_pow_acc}, else:
attrs={"scale": self._beta1}, block.append_op(
stop_gradient=True) type="scale",
inputs={"X": beta1_pow_acc},
outputs={"Out": beta1_pow_acc},
attrs={"scale": self._beta1},
stop_gradient=True)
class DpsgdOptimizer(Optimizer): class DpsgdOptimizer(Optimizer):
...@@ -2894,23 +2941,30 @@ class DpsgdOptimizer(Optimizer): ...@@ -2894,23 +2941,30 @@ class DpsgdOptimizer(Optimizer):
if self._seed == None: if self._seed == None:
self._seed = 0 self._seed = 0
dpsgd_op = block.append_op( if framework.in_dygraph_mode():
type=self.type, _C_ops.dpsgd(param_and_grad[0], param_and_grad[1],
inputs={ self._create_param_lr(param_and_grad),
"Param": param_and_grad[0], param_and_grad[0], "clip", self._clip, "batch_size",
"Grad": param_and_grad[1], self._batch_size, "sigma", self._sigma, "seed",
"LearningRate": self._create_param_lr(param_and_grad) self._seed)
}, else:
outputs={"ParamOut": param_and_grad[0]}, dpsgd_op = block.append_op(
attrs={ type=self.type,
"clip": self._clip, inputs={
"batch_size": self._batch_size, "Param": param_and_grad[0],
"sigma": self._sigma, "Grad": param_and_grad[1],
"seed": self._seed "LearningRate": self._create_param_lr(param_and_grad)
}, },
stop_gradient=True) outputs={"ParamOut": param_and_grad[0]},
attrs={
"clip": self._clip,
"batch_size": self._batch_size,
"sigma": self._sigma,
"seed": self._seed
},
stop_gradient=True)
return dpsgd_op return dpsgd_op
class DecayedAdagradOptimizer(Optimizer): class DecayedAdagradOptimizer(Optimizer):
...@@ -3005,22 +3059,30 @@ class DecayedAdagradOptimizer(Optimizer): ...@@ -3005,22 +3059,30 @@ class DecayedAdagradOptimizer(Optimizer):
moment_acc = self._get_accumulator(self._moment_acc_str, moment_acc = self._get_accumulator(self._moment_acc_str,
param_and_grad[0]) param_and_grad[0])
# Create the decayed adagrad optimizer op if framework.in_dygraph_mode():
decayed_adagrad_op = block.append_op( _C_ops.decayed_adagrad(
type=self.type, param_and_grad[0], param_and_grad[1], moment_acc,
inputs={ self._create_param_lr(param_and_grad), param_and_grad[0],
"Param": param_and_grad[0], moment_acc, "epsilon", self._epsilon, "decay", self._decay)
"Grad": param_and_grad[1], else:
"Moment": moment_acc, # Create the decayed adagrad optimizer op
"LearningRate": self._create_param_lr(param_and_grad) decayed_adagrad_op = block.append_op(
}, type=self.type,
outputs={"ParamOut": param_and_grad[0], inputs={
"MomentOut": moment_acc}, "Param": param_and_grad[0],
attrs={"epsilon": self._epsilon, "Grad": param_and_grad[1],
"decay": self._decay}, "Moment": moment_acc,
stop_gradient=True) "LearningRate": self._create_param_lr(param_and_grad)
},
outputs={
"ParamOut": param_and_grad[0],
"MomentOut": moment_acc
},
attrs={"epsilon": self._epsilon,
"decay": self._decay},
stop_gradient=True)
return decayed_adagrad_op return decayed_adagrad_op
class AdadeltaOptimizer(Optimizer): class AdadeltaOptimizer(Optimizer):
...@@ -3121,25 +3183,32 @@ class AdadeltaOptimizer(Optimizer): ...@@ -3121,25 +3183,32 @@ class AdadeltaOptimizer(Optimizer):
avg_squared_update_acc = self._get_accumulator( avg_squared_update_acc = self._get_accumulator(
self._avg_squared_update_acc_str, param_and_grad[0]) self._avg_squared_update_acc_str, param_and_grad[0])
# Create the adadelta optimizer op if framework.in_dygraph_mode():
adadelta_op = block.append_op( _C_ops.adadelta(param_and_grad[0], param_and_grad[1],
type=self.type, avg_squared_grad_acc, avg_squared_update_acc,
inputs={ param_and_grad[0], avg_squared_grad_acc,
"Param": param_and_grad[0], avg_squared_update_acc, "epsilon", self._epsilon,
"Grad": param_and_grad[1], "rho", self._rho)
"AvgSquaredGrad": avg_squared_grad_acc, else:
"AvgSquaredUpdate": avg_squared_update_acc # Create the adadelta optimizer op
}, adadelta_op = block.append_op(
outputs={ type=self.type,
"ParamOut": param_and_grad[0], inputs={
"AvgSquaredGradOut": avg_squared_grad_acc, "Param": param_and_grad[0],
"AvgSquaredUpdateOut": avg_squared_update_acc "Grad": param_and_grad[1],
}, "AvgSquaredGrad": avg_squared_grad_acc,
attrs={"epsilon": self._epsilon, "AvgSquaredUpdate": avg_squared_update_acc
"rho": self._rho}, },
stop_gradient=True) outputs={
"ParamOut": param_and_grad[0],
"AvgSquaredGradOut": avg_squared_grad_acc,
"AvgSquaredUpdateOut": avg_squared_update_acc
},
attrs={"epsilon": self._epsilon,
"rho": self._rho},
stop_gradient=True)
return adadelta_op return adadelta_op
class RMSPropOptimizer(Optimizer): class RMSPropOptimizer(Optimizer):
...@@ -3303,31 +3372,39 @@ class RMSPropOptimizer(Optimizer): ...@@ -3303,31 +3372,39 @@ class RMSPropOptimizer(Optimizer):
param_and_grad[0]) param_and_grad[0])
mean_grad_acc = self._get_accumulator(self._mean_grad_acc_str, mean_grad_acc = self._get_accumulator(self._mean_grad_acc_str,
param_and_grad[0]) param_and_grad[0])
rmsprop_op = block.append_op( if framework.in_dygraph_mode():
type=self.type, _C_ops.rmsprop(
inputs={ param_and_grad[0], mean_square_acc,
"Param": param_and_grad[0], self._create_param_lr(param_and_grad), param_and_grad[1],
"Grad": param_and_grad[1], momentum_acc, param_and_grad[0], momentum_acc, mean_square_acc,
"Moment": momentum_acc, mean_grad_acc, "epsilon", self._epsilon, "decay", self._rho,
"MeanSquare": mean_square_acc, "momentum", self._momentum, "centered", self._centered)
"MeanGrad": mean_grad_acc, else:
"LearningRate": self._create_param_lr(param_and_grad), rmsprop_op = block.append_op(
}, type=self.type,
outputs={ inputs={
"ParamOut": param_and_grad[0], "Param": param_and_grad[0],
"MomentOut": momentum_acc, "Grad": param_and_grad[1],
"MeanSquareOut": mean_square_acc, "Moment": momentum_acc,
"MeanGradOut": mean_grad_acc "MeanSquare": mean_square_acc,
}, "MeanGrad": mean_grad_acc,
attrs={ "LearningRate": self._create_param_lr(param_and_grad),
"epsilon": self._epsilon, },
"decay": self._rho, outputs={
"momentum": self._momentum, "ParamOut": param_and_grad[0],
"centered": self._centered "MomentOut": momentum_acc,
}, "MeanSquareOut": mean_square_acc,
stop_gradient=True) "MeanGradOut": mean_grad_acc
},
attrs={
"epsilon": self._epsilon,
"decay": self._rho,
"momentum": self._momentum,
"centered": self._centered
},
stop_gradient=True)
return rmsprop_op return rmsprop_op
class FtrlOptimizer(Optimizer): class FtrlOptimizer(Optimizer):
...@@ -3467,26 +3544,36 @@ class FtrlOptimizer(Optimizer): ...@@ -3467,26 +3544,36 @@ class FtrlOptimizer(Optimizer):
param_and_grad[0]) param_and_grad[0])
linear_acc = self._get_accumulator(self._linear_acc_str, linear_acc = self._get_accumulator(self._linear_acc_str,
param_and_grad[0]) param_and_grad[0])
ftrl_op = block.append_op( if framework.in_dygraph_mode():
type=self.type, _C_ops.ftrl(param_and_grad[0], squared_acc, linear_acc,
inputs={ param_and_grad[1],
"Param": param_and_grad[0], self._create_param_lr(param_and_grad),
"Grad": param_and_grad[1], param_and_grad[0], squared_acc, linear_acc, "l1",
"SquaredAccumulator": squared_acc, self._l1, "l2", self._l2, "lr_power", self._lr_power)
"LinearAccumulator": linear_acc,
"LearningRate": self._create_param_lr(param_and_grad), else:
}, ftrl_op = block.append_op(
outputs={ type=self.type,
"ParamOut": param_and_grad[0], inputs={
"SquaredAccumOut": squared_acc, "Param": param_and_grad[0],
"LinearAccumOut": linear_acc "Grad": param_and_grad[1],
}, "SquaredAccumulator": squared_acc,
attrs={"l1": self._l1, "LinearAccumulator": linear_acc,
"l2": self._l2, "LearningRate": self._create_param_lr(param_and_grad),
"lr_power": self._lr_power}, },
stop_gradient=True) outputs={
"ParamOut": param_and_grad[0],
"SquaredAccumOut": squared_acc,
"LinearAccumOut": linear_acc
},
attrs={
"l1": self._l1,
"l2": self._l2,
"lr_power": self._lr_power
},
stop_gradient=True)
return ftrl_op return ftrl_op
class LambOptimizer(AdamOptimizer): class LambOptimizer(AdamOptimizer):
......
...@@ -18,7 +18,7 @@ import six ...@@ -18,7 +18,7 @@ import six
import numpy as np import numpy as np
import threading import threading
import paddle import paddle
from .framework import Program, Variable, program_guard, default_main_program, default_startup_program, in_dygraph_mode, cpu_places, _current_expected_place from .framework import Program, Variable, program_guard, default_main_program, default_startup_program, in_dygraph_mode, cpu_places, _current_expected_place, _in_eager_mode
from .executor import global_scope from .executor import global_scope
from .data_feeder import DataFeeder, BatchedTensorProvider from .data_feeder import DataFeeder, BatchedTensorProvider
from .multiprocess_utils import multiprocess_queue_set, CleanupFuncRegistrar, _cleanup_mmap, _cleanup, _set_SIGCHLD_handler from .multiprocess_utils import multiprocess_queue_set, CleanupFuncRegistrar, _cleanup_mmap, _cleanup, _set_SIGCHLD_handler
...@@ -971,7 +971,11 @@ class DygraphGeneratorLoader(DataLoaderBase): ...@@ -971,7 +971,11 @@ class DygraphGeneratorLoader(DataLoaderBase):
def __next__(self): def __next__(self):
try: try:
return self._reader.read_next_var_list() if _in_eager_mode():
return core.eager.read_next_eager_tensor_list(
self._reader.read_next_list()[0])
else:
return self._reader.read_next_var_list()
except StopIteration: except StopIteration:
self._reset() self._reset()
six.reraise(*sys.exc_info()) six.reraise(*sys.exc_info())
......
...@@ -673,6 +673,34 @@ class EagerTensorPropertiesAndMethodsTestCase(unittest.TestCase): ...@@ -673,6 +673,34 @@ class EagerTensorPropertiesAndMethodsTestCase(unittest.TestCase):
self.assertTrue(np.array_equal(tensor3.numpy(), arr2)) self.assertTrue(np.array_equal(tensor3.numpy(), arr2))
self.assertTrue(tensor3._is_shared_buffer_with(tensor)) self.assertTrue(tensor3._is_shared_buffer_with(tensor))
def test_share_underline_tensor_to(self):
with _test_eager_guard():
arr = np.ones([4, 16, 16, 32]).astype('float32')
arr1 = np.zeros([4, 16]).astype('float32')
arr2 = np.ones([4, 16, 16, 32]).astype('float32') + np.ones(
[4, 16, 16, 32]).astype('float32')
tensor = None
tensor2 = None
tensor = paddle.to_tensor(arr, core.VarDesc.VarType.FP32,
core.CPUPlace())
tensor3 = core.eager.EagerTensor()
if core.is_compiled_with_cuda():
tensor2 = paddle.to_tensor(arr2, core.VarDesc.VarType.FP32,
core.CUDAPlace(0))
else:
tensor2 = paddle.to_tensor(arr2, core.VarDesc.VarType.FP32,
core.CPUPlace())
self.assertTrue(np.array_equal(tensor.numpy(), arr))
self.assertTrue(np.array_equal(tensor2.numpy(), arr2))
tensor2._share_underline_tensor_to(tensor)
self.assertTrue(np.array_equal(tensor.numpy(), arr2))
self.assertTrue(np.array_equal(tensor2.numpy(), arr2))
self.assertTrue(tensor._is_shared_underline_tensor_with(tensor2))
self.assertTrue(tensor2._is_shared_underline_tensor_with(tensor))
tensor._share_underline_tensor_to(tensor3)
self.assertTrue(np.array_equal(tensor3.numpy(), arr2))
self.assertTrue(tensor3._is_shared_underline_tensor_with(tensor))
def test_properties(self): def test_properties(self):
print("Test_properties") print("Test_properties")
with _test_eager_guard(): with _test_eager_guard():
......
...@@ -953,7 +953,8 @@ class TestMetaclass(unittest.TestCase): ...@@ -953,7 +953,8 @@ class TestMetaclass(unittest.TestCase):
self.assertNotEqual(type(MyLayer).__name__, 'pybind11_type') self.assertNotEqual(type(MyLayer).__name__, 'pybind11_type')
if core._in_eager_mode(): if core._in_eager_mode():
self.assertEqual( self.assertEqual(
type(paddle.fluid.core.eager.EagerTensor).__name__, 'type') type(paddle.fluid.core.eager.EagerTensor).__name__,
'pybind11_type')
else: else:
self.assertEqual( self.assertEqual(
type(paddle.fluid.core.VarBase).__name__, 'pybind11_type') type(paddle.fluid.core.VarBase).__name__, 'pybind11_type')
......
...@@ -18,6 +18,7 @@ import unittest ...@@ -18,6 +18,7 @@ import unittest
import paddle.fluid as fluid import paddle.fluid as fluid
import numpy as np import numpy as np
import paddle import paddle
from paddle.fluid.framework import _test_eager_guard
class MyLayer(fluid.Layer): class MyLayer(fluid.Layer):
...@@ -96,10 +97,15 @@ class TestImperativeContainer(unittest.TestCase): ...@@ -96,10 +97,15 @@ class TestImperativeContainer(unittest.TestCase):
self.assertListEqual(res11.shape, [5, 4]) self.assertListEqual(res11.shape, [5, 4])
res11.backward() res11.backward()
def test_layer_list(self): def func_test_layer_list(self):
self.layer_list(True) self.layer_list(True)
self.layer_list(False) self.layer_list(False)
def test_layer_list(self):
with _test_eager_guard():
self.func_test_layer_list()
self.func_test_layer_list()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -18,6 +18,7 @@ import numpy as np ...@@ -18,6 +18,7 @@ import numpy as np
import paddle.fluid as fluid import paddle.fluid as fluid
from paddle.fluid import core from paddle.fluid import core
from paddle.fluid.reader import use_pinned_memory from paddle.fluid.reader import use_pinned_memory
from paddle.fluid.framework import _test_eager_guard
def get_random_images_and_labels(image_shape, label_shape): def get_random_images_and_labels(image_shape, label_shape):
...@@ -50,7 +51,7 @@ class TestDygraphDataLoader(unittest.TestCase): ...@@ -50,7 +51,7 @@ class TestDygraphDataLoader(unittest.TestCase):
self.assertEqual(label.shape, [self.batch_size, 1]) self.assertEqual(label.shape, [self.batch_size, 1])
self.assertEqual(relu.shape, [self.batch_size, 784]) self.assertEqual(relu.shape, [self.batch_size, 784])
def test_single_process_loader(self): def func_test_single_process_loader(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
loader = fluid.io.DataLoader.from_generator( loader = fluid.io.DataLoader.from_generator(
capacity=self.capacity, iterable=False, use_multiprocess=False) capacity=self.capacity, iterable=False, use_multiprocess=False)
...@@ -60,7 +61,12 @@ class TestDygraphDataLoader(unittest.TestCase): ...@@ -60,7 +61,12 @@ class TestDygraphDataLoader(unittest.TestCase):
places=fluid.CPUPlace()) places=fluid.CPUPlace())
self.iter_loader_data(loader) self.iter_loader_data(loader)
def test_multi_process_loader(self): def test_single_process_loader(self):
with _test_eager_guard():
self.func_test_single_process_loader()
self.func_test_single_process_loader()
def func_test_multi_process_loader(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
loader = fluid.io.DataLoader.from_generator( loader = fluid.io.DataLoader.from_generator(
capacity=self.capacity, use_multiprocess=True) capacity=self.capacity, use_multiprocess=True)
...@@ -70,7 +76,12 @@ class TestDygraphDataLoader(unittest.TestCase): ...@@ -70,7 +76,12 @@ class TestDygraphDataLoader(unittest.TestCase):
places=fluid.CPUPlace()) places=fluid.CPUPlace())
self.iter_loader_data(loader) self.iter_loader_data(loader)
def test_generator_no_places(self): def test_multi_process_loader(self):
with _test_eager_guard():
self.func_test_multi_process_loader()
self.func_test_multi_process_loader()
def func_test_generator_no_places(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
loader = fluid.io.DataLoader.from_generator(capacity=self.capacity) loader = fluid.io.DataLoader.from_generator(capacity=self.capacity)
loader.set_sample_generator( loader.set_sample_generator(
...@@ -78,7 +89,12 @@ class TestDygraphDataLoader(unittest.TestCase): ...@@ -78,7 +89,12 @@ class TestDygraphDataLoader(unittest.TestCase):
batch_size=self.batch_size) batch_size=self.batch_size)
self.iter_loader_data(loader) self.iter_loader_data(loader)
def test_set_pin_memory(self): def test_generator_no_places(self):
with _test_eager_guard():
self.func_test_generator_no_places()
self.func_test_generator_no_places()
def func_test_set_pin_memory(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
use_pinned_memory(False) use_pinned_memory(False)
loader = fluid.io.DataLoader.from_generator( loader = fluid.io.DataLoader.from_generator(
...@@ -90,6 +106,11 @@ class TestDygraphDataLoader(unittest.TestCase): ...@@ -90,6 +106,11 @@ class TestDygraphDataLoader(unittest.TestCase):
self.iter_loader_data(loader) self.iter_loader_data(loader)
use_pinned_memory(True) use_pinned_memory(True)
def test_set_pin_memory(self):
with _test_eager_guard():
self.func_test_set_pin_memory()
self.func_test_set_pin_memory()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -19,6 +19,7 @@ import numpy as np ...@@ -19,6 +19,7 @@ import numpy as np
import paddle.fluid as fluid import paddle.fluid as fluid
from paddle.fluid import core from paddle.fluid import core
import paddle.compat as cpt import paddle.compat as cpt
from paddle.fluid.framework import _test_eager_guard
def get_random_images_and_labels(image_shape, label_shape): def get_random_images_and_labels(image_shape, label_shape):
...@@ -34,13 +35,18 @@ class TestDygraphDataLoaderWithException(unittest.TestCase): ...@@ -34,13 +35,18 @@ class TestDygraphDataLoaderWithException(unittest.TestCase):
self.epoch_num = 1 self.epoch_num = 1
self.capacity = 5 self.capacity = 5
def test_not_capacity(self): def func_test_not_capacity(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
with self.assertRaisesRegexp(ValueError, with self.assertRaisesRegexp(ValueError,
"Please give value to capacity."): "Please give value to capacity."):
fluid.io.DataLoader.from_generator() fluid.io.DataLoader.from_generator()
def test_single_process_with_thread_expection(self): def test_not_capacity(self):
with _test_eager_guard():
self.func_test_not_capacity()
self.func_test_not_capacity()
def func_test_single_process_with_thread_expection(self):
def error_sample_genarator(batch_num): def error_sample_genarator(batch_num):
def __reader__(): def __reader__():
for _ in range(batch_num): for _ in range(batch_num):
...@@ -63,7 +69,12 @@ class TestDygraphDataLoaderWithException(unittest.TestCase): ...@@ -63,7 +69,12 @@ class TestDygraphDataLoaderWithException(unittest.TestCase):
exception = ex exception = ex
self.assertIsNotNone(exception) self.assertIsNotNone(exception)
def test_multi_process_with_process_expection(self): def test_single_process_with_thread_expection(self):
with _test_eager_guard():
self.func_test_single_process_with_thread_expection()
self.func_test_single_process_with_thread_expection()
def func_test_multi_process_with_process_expection(self):
def error_sample_genarator(batch_num): def error_sample_genarator(batch_num):
def __reader__(): def __reader__():
for _ in range(batch_num): for _ in range(batch_num):
...@@ -84,7 +95,12 @@ class TestDygraphDataLoaderWithException(unittest.TestCase): ...@@ -84,7 +95,12 @@ class TestDygraphDataLoaderWithException(unittest.TestCase):
exception = ex exception = ex
self.assertIsNotNone(exception) self.assertIsNotNone(exception)
def test_multi_process_with_get_timeout(self): def test_multi_process_with_process_expection(self):
with _test_eager_guard():
self.func_test_multi_process_with_process_expection()
self.func_test_multi_process_with_process_expection()
def func_test_multi_process_with_get_timeout(self):
def slow_batch_generator_creator(batch_size, batch_num): def slow_batch_generator_creator(batch_size, batch_num):
def __reader__(): def __reader__():
for _ in range(batch_num): for _ in range(batch_num):
...@@ -112,6 +128,11 @@ class TestDygraphDataLoaderWithException(unittest.TestCase): ...@@ -112,6 +128,11 @@ class TestDygraphDataLoaderWithException(unittest.TestCase):
exception = ex exception = ex
self.assertIsNotNone(exception) self.assertIsNotNone(exception)
def test_multi_process_with_get_timeout(self):
with _test_eager_guard():
self.func_test_multi_process_with_get_timeout()
self.func_test_multi_process_with_get_timeout()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -19,6 +19,7 @@ import multiprocessing ...@@ -19,6 +19,7 @@ import multiprocessing
import time import time
import paddle.compat as cpt import paddle.compat as cpt
from paddle.fluid.framework import _test_eager_guard
if sys.version_info[0] == 2: if sys.version_info[0] == 2:
import Queue as queue import Queue as queue
...@@ -35,7 +36,7 @@ class TestDygraphDataLoaderCleanUpFunc(unittest.TestCase): ...@@ -35,7 +36,7 @@ class TestDygraphDataLoaderCleanUpFunc(unittest.TestCase):
def setUp(self): def setUp(self):
self.capacity = 10 self.capacity = 10
def test_clear_queue_set(self): def func_test_clear_queue_set(self):
test_queue = queue.Queue(self.capacity) test_queue = queue.Queue(self.capacity)
global multiprocess_queue_set global multiprocess_queue_set
multiprocess_queue_set.add(test_queue) multiprocess_queue_set.add(test_queue)
...@@ -43,13 +44,18 @@ class TestDygraphDataLoaderCleanUpFunc(unittest.TestCase): ...@@ -43,13 +44,18 @@ class TestDygraphDataLoaderCleanUpFunc(unittest.TestCase):
test_queue.put(i) test_queue.put(i)
_cleanup() _cleanup()
def test_clear_queue_set(self):
with _test_eager_guard():
self.func_test_clear_queue_set()
self.func_test_clear_queue_set()
class TestRegisterExitFunc(unittest.TestCase): class TestRegisterExitFunc(unittest.TestCase):
# This function does not need to be implemented in this case # This function does not need to be implemented in this case
def none_func(self): def none_func(self):
pass pass
def test_not_callable_func(self): def func_test_not_callable_func(self):
exception = None exception = None
try: try:
CleanupFuncRegistrar.register(5) CleanupFuncRegistrar.register(5)
...@@ -58,11 +64,21 @@ class TestRegisterExitFunc(unittest.TestCase): ...@@ -58,11 +64,21 @@ class TestRegisterExitFunc(unittest.TestCase):
exception = ex exception = ex
self.assertIsNotNone(exception) self.assertIsNotNone(exception)
def test_old_handler_for_sigint(self): def test_not_callable_func(self):
with _test_eager_guard():
self.func_test_not_callable_func()
self.func_test_not_callable_func()
def func_test_old_handler_for_sigint(self):
CleanupFuncRegistrar.register( CleanupFuncRegistrar.register(
function=self.none_func, signals=[signal.SIGINT]) function=self.none_func, signals=[signal.SIGINT])
def test_signal_wrapper_by_sigchld(self): def test_old_handler_for_sigint(self):
with _test_eager_guard():
self.func_test_old_handler_for_sigint()
self.func_test_old_handler_for_sigint()
def func_test_signal_wrapper_by_sigchld(self):
# This function does not need to be implemented in this case # This function does not need to be implemented in this case
def __test_process__(): def __test_process__():
pass pass
...@@ -79,6 +95,11 @@ class TestRegisterExitFunc(unittest.TestCase): ...@@ -79,6 +95,11 @@ class TestRegisterExitFunc(unittest.TestCase):
exception = ex exception = ex
self.assertIsNotNone(exception) self.assertIsNotNone(exception)
def test_signal_wrapper_by_sigchld(self):
with _test_eager_guard():
self.func_test_signal_wrapper_by_sigchld()
self.func_test_signal_wrapper_by_sigchld()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -18,6 +18,7 @@ import numpy as np ...@@ -18,6 +18,7 @@ import numpy as np
import paddle.fluid as fluid import paddle.fluid as fluid
from paddle.fluid import core from paddle.fluid import core
from paddle.io import Dataset, DataLoader from paddle.io import Dataset, DataLoader
from paddle.fluid.framework import _test_eager_guard
def get_random_images_and_labels(image_shape, label_shape): def get_random_images_and_labels(image_shape, label_shape):
...@@ -75,19 +76,29 @@ class TestDygraphDataLoaderMmapFdsClear(unittest.TestCase): ...@@ -75,19 +76,29 @@ class TestDygraphDataLoaderMmapFdsClear(unittest.TestCase):
if step_id == 30: if step_id == 30:
break break
def test_data_loader_break(self): def func_test_data_loader_break(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
loader = self.prepare_data_loader() loader = self.prepare_data_loader()
for _ in range(self.epoch_num): for _ in range(self.epoch_num):
self.run_one_epoch_with_break(loader) self.run_one_epoch_with_break(loader)
break break
def test_data_loader_continue_break(self): def test_data_loader_break(self):
with _test_eager_guard():
self.func_test_data_loader_break()
self.func_test_data_loader_break()
def func_test_data_loader_continue_break(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
loader = self.prepare_data_loader() loader = self.prepare_data_loader()
for _ in range(self.epoch_num): for _ in range(self.epoch_num):
self.run_one_epoch_with_break(loader) self.run_one_epoch_with_break(loader)
def test_data_loader_continue_break(self):
with _test_eager_guard():
self.func_test_data_loader_continue_break()
self.func_test_data_loader_continue_break()
class TestMultiProcessDataLoaderMmapFdsClear(TestDygraphDataLoaderMmapFdsClear): class TestMultiProcessDataLoaderMmapFdsClear(TestDygraphDataLoaderMmapFdsClear):
def prepare_data_loader(self): def prepare_data_loader(self):
......
...@@ -19,6 +19,7 @@ import numpy as np ...@@ -19,6 +19,7 @@ import numpy as np
import paddle.fluid as fluid import paddle.fluid as fluid
from paddle.fluid import core from paddle.fluid import core
from paddle.fluid.reader import _reader_process_loop from paddle.fluid.reader import _reader_process_loop
from paddle.fluid.framework import _test_eager_guard
if sys.version_info[0] == 2: if sys.version_info[0] == 2:
import Queue as queue import Queue as queue
...@@ -51,7 +52,7 @@ class TestDygraphDataLoaderProcess(unittest.TestCase): ...@@ -51,7 +52,7 @@ class TestDygraphDataLoaderProcess(unittest.TestCase):
self.epoch_num = 2 self.epoch_num = 2
self.capacity = 2 self.capacity = 2
def test_reader_process_loop(self): def func_test_reader_process_loop(self):
# This unittest's memory mapped files needs to be cleaned manually # This unittest's memory mapped files needs to be cleaned manually
def __clear_process__(util_queue): def __clear_process__(util_queue):
while True: while True:
...@@ -79,7 +80,12 @@ class TestDygraphDataLoaderProcess(unittest.TestCase): ...@@ -79,7 +80,12 @@ class TestDygraphDataLoaderProcess(unittest.TestCase):
target=__clear_process__, args=(util_queue, )) target=__clear_process__, args=(util_queue, ))
clear_process.start() clear_process.start()
def test_reader_process_loop_simple_none(self): def test_reader_process_loop(self):
with _test_eager_guard():
self.func_test_reader_process_loop()
self.func_test_reader_process_loop()
def func_test_reader_process_loop_simple_none(self):
def none_sample_genarator(batch_num): def none_sample_genarator(batch_num):
def __reader__(): def __reader__():
for _ in range(batch_num): for _ in range(batch_num):
...@@ -100,6 +106,11 @@ class TestDygraphDataLoaderProcess(unittest.TestCase): ...@@ -100,6 +106,11 @@ class TestDygraphDataLoaderProcess(unittest.TestCase):
exception = ex exception = ex
self.assertIsNotNone(exception) self.assertIsNotNone(exception)
def test_reader_process_loop_simple_none(self):
with _test_eager_guard():
self.func_test_reader_process_loop_simple_none()
self.func_test_reader_process_loop_simple_none()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -15,10 +15,11 @@ ...@@ -15,10 +15,11 @@
import unittest import unittest
import paddle import paddle
import paddle.nn as nn import paddle.nn as nn
from paddle.fluid.framework import _test_eager_guard, _in_eager_mode, in_dygraph_mode
class TestLayerPrint(unittest.TestCase): class TestLayerPrint(unittest.TestCase):
def test_layer_str(self): def func_test_layer_str(self):
module = nn.ELU(0.2) module = nn.ELU(0.2)
self.assertEqual(str(module), 'ELU(alpha=0.2)') self.assertEqual(str(module), 'ELU(alpha=0.2)')
...@@ -352,6 +353,11 @@ class TestLayerPrint(unittest.TestCase): ...@@ -352,6 +353,11 @@ class TestLayerPrint(unittest.TestCase):
'(6): GELU(approximate=True)\n)' '(6): GELU(approximate=True)\n)'
) )
def test_layer_str(self):
with _test_eager_guard():
self.func_test_layer_str()
self.func_test_layer_str()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -16,6 +16,7 @@ import unittest ...@@ -16,6 +16,7 @@ import unittest
import numpy as np import numpy as np
import paddle.fluid as fluid import paddle.fluid as fluid
import paddle import paddle
from paddle.fluid.framework import _test_eager_guard, _in_eager_mode, in_dygraph_mode
class MyLayer(fluid.Layer): class MyLayer(fluid.Layer):
...@@ -31,7 +32,7 @@ class MyLayer(fluid.Layer): ...@@ -31,7 +32,7 @@ class MyLayer(fluid.Layer):
class TestImperativeNamedSubLayers(unittest.TestCase): class TestImperativeNamedSubLayers(unittest.TestCase):
def test_named_sublayers(self): def func_test_named_sublayers(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
fc1 = fluid.Linear(10, 3) fc1 = fluid.Linear(10, 3)
fc2 = fluid.Linear(3, 10, bias_attr=False) fc2 = fluid.Linear(3, 10, bias_attr=False)
...@@ -56,9 +57,14 @@ class TestImperativeNamedSubLayers(unittest.TestCase): ...@@ -56,9 +57,14 @@ class TestImperativeNamedSubLayers(unittest.TestCase):
[l for _, l in list(model.named_sublayers(include_self=True))], [l for _, l in list(model.named_sublayers(include_self=True))],
[model] + expected_sublayers) [model] + expected_sublayers)
def test_named_sublayers(self):
with _test_eager_guard():
self.func_test_named_sublayers()
self.func_test_named_sublayers()
class TestImperativeNamedParameters(unittest.TestCase): class TestImperativeNamedParameters(unittest.TestCase):
def test_named_parameters(self): def func_test_named_parameters(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
fc1 = fluid.Linear(10, 3) fc1 = fluid.Linear(10, 3)
fc2 = fluid.Linear(3, 10, bias_attr=False) fc2 = fluid.Linear(3, 10, bias_attr=False)
...@@ -75,7 +81,12 @@ class TestImperativeNamedParameters(unittest.TestCase): ...@@ -75,7 +81,12 @@ class TestImperativeNamedParameters(unittest.TestCase):
self.assertListEqual(expected_named_parameters, named_parameters) self.assertListEqual(expected_named_parameters, named_parameters)
def test_dir_layer(self): def test_named_parameters(self):
with _test_eager_guard():
self.func_test_named_parameters()
self.func_test_named_parameters()
def func_test_dir_layer(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
class Mymodel(fluid.dygraph.Layer): class Mymodel(fluid.dygraph.Layer):
...@@ -110,6 +121,11 @@ class TestImperativeNamedParameters(unittest.TestCase): ...@@ -110,6 +121,11 @@ class TestImperativeNamedParameters(unittest.TestCase):
self.assertTrue("weight" in expected_members, self.assertTrue("weight" in expected_members,
"model should contain parameter: weight") "model should contain parameter: weight")
def test_dir_layer(self):
with _test_eager_guard():
self.func_test_dir_layer()
self.func_test_dir_layer()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -28,6 +28,7 @@ from paddle.fluid.optimizer import ModelAverage, DGCMomentumOptimizer, Exponenti ...@@ -28,6 +28,7 @@ from paddle.fluid.optimizer import ModelAverage, DGCMomentumOptimizer, Exponenti
from paddle.fluid.dygraph import Linear from paddle.fluid.dygraph import Linear
from paddle.fluid.dygraph.base import to_variable from paddle.fluid.dygraph.base import to_variable
from test_imperative_base import new_program_scope from test_imperative_base import new_program_scope
from paddle.fluid.framework import _test_eager_guard, _in_eager_mode
# Note(wangzhongpu) # Note(wangzhongpu)
# In dygraph, don't support ModelAverage, DGCMomentumOptimizer, ExponentialMovingAverage, PipelineOptimizer, LookaheadOptimizer, RecomputeOptimizer. # In dygraph, don't support ModelAverage, DGCMomentumOptimizer, ExponentialMovingAverage, PipelineOptimizer, LookaheadOptimizer, RecomputeOptimizer.
...@@ -220,9 +221,14 @@ class TestImperativeOptimizerPiecewiseDecay(TestImperativeOptimizerBase): ...@@ -220,9 +221,14 @@ class TestImperativeOptimizerPiecewiseDecay(TestImperativeOptimizerBase):
boundaries=bd, values=[0.1 * (0.1**i) for i in range(len(bd) + 1)])) boundaries=bd, values=[0.1 * (0.1**i) for i in range(len(bd) + 1)]))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerNaturalExpDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerNaturalExpDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -243,9 +249,14 @@ class TestImperativeOptimizerNaturalExpDecay(TestImperativeOptimizerBase): ...@@ -243,9 +249,14 @@ class TestImperativeOptimizerNaturalExpDecay(TestImperativeOptimizerBase):
staircase=True)) staircase=True))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerExponentialDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerExponentialDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -266,9 +277,14 @@ class TestImperativeOptimizerExponentialDecay(TestImperativeOptimizerBase): ...@@ -266,9 +277,14 @@ class TestImperativeOptimizerExponentialDecay(TestImperativeOptimizerBase):
staircase=True)) staircase=True))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerInverseTimeDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerInverseTimeDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -289,9 +305,14 @@ class TestImperativeOptimizerInverseTimeDecay(TestImperativeOptimizerBase): ...@@ -289,9 +305,14 @@ class TestImperativeOptimizerInverseTimeDecay(TestImperativeOptimizerBase):
staircase=True)) staircase=True))
return optimizer return optimizer
def test_adam(self): def func_test_adam(self):
self._check_mlp() self._check_mlp()
def test_adam(self):
with _test_eager_guard():
self.func_test_adam()
self.func_test_adam()
class TestImperativeOptimizerPolynomialDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerPolynomialDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -306,14 +327,24 @@ class TestImperativeOptimizerPolynomialDecay(TestImperativeOptimizerBase): ...@@ -306,14 +327,24 @@ class TestImperativeOptimizerPolynomialDecay(TestImperativeOptimizerBase):
learning_rate=0.1, decay_steps=5, cycle=self.cycle)) learning_rate=0.1, decay_steps=5, cycle=self.cycle))
return optimizer return optimizer
def test_sgd_cycle(self): def func_test_sgd_cycle(self):
self.cycle = True self.cycle = True
self._check_mlp() self._check_mlp()
def test_sgd(self): def test_sgd_cycle(self):
with _test_eager_guard():
self.func_test_sgd_cycle()
self.func_test_sgd_cycle()
def func_test_sgd(self):
self.cycle = False self.cycle = False
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerCosineDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerCosineDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -328,9 +359,14 @@ class TestImperativeOptimizerCosineDecay(TestImperativeOptimizerBase): ...@@ -328,9 +359,14 @@ class TestImperativeOptimizerCosineDecay(TestImperativeOptimizerBase):
learning_rate=0.1, step_each_epoch=10000, epochs=120)) learning_rate=0.1, step_each_epoch=10000, epochs=120))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerNoamDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerNoamDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -345,12 +381,17 @@ class TestImperativeOptimizerNoamDecay(TestImperativeOptimizerBase): ...@@ -345,12 +381,17 @@ class TestImperativeOptimizerNoamDecay(TestImperativeOptimizerBase):
d_model=512, warmup_steps=8000)) d_model=512, warmup_steps=8000))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestOptimizerLearningRate(unittest.TestCase): class TestOptimizerLearningRate(unittest.TestCase):
def test_constant_lr(self): def func_test_constant_lr(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32") a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
...@@ -375,7 +416,12 @@ class TestOptimizerLearningRate(unittest.TestCase): ...@@ -375,7 +416,12 @@ class TestOptimizerLearningRate(unittest.TestCase):
self.assertTrue(np.allclose(lr, 0.001, rtol=1e-06, atol=0.0)) self.assertTrue(np.allclose(lr, 0.001, rtol=1e-06, atol=0.0))
def test_lr_decay(self): def test_constant_lr(self):
with _test_eager_guard():
self.func_test_constant_lr()
self.func_test_constant_lr()
def func_test_lr_decay(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32") a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
...@@ -405,7 +451,12 @@ class TestOptimizerLearningRate(unittest.TestCase): ...@@ -405,7 +451,12 @@ class TestOptimizerLearningRate(unittest.TestCase):
self.assertTrue(np.allclose(lr, ret[i], rtol=1e-06, atol=0.0)) self.assertTrue(np.allclose(lr, ret[i], rtol=1e-06, atol=0.0))
def test_lr_decay_natural_exp(self): def test_lr_decay(self):
with _test_eager_guard():
self.func_test_lr_decay()
self.func_test_lr_decay()
def func_test_lr_decay_natural_exp(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32") a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
...@@ -437,7 +488,12 @@ class TestOptimizerLearningRate(unittest.TestCase): ...@@ -437,7 +488,12 @@ class TestOptimizerLearningRate(unittest.TestCase):
self.assertTrue(np.allclose(lr, ret[i], rtol=1e-06, atol=0.0)) self.assertTrue(np.allclose(lr, ret[i], rtol=1e-06, atol=0.0))
def test_set_lr(self): def test_lr_decay_natural_exp(self):
with _test_eager_guard():
self.func_test_lr_decay_natural_exp()
self.func_test_lr_decay_natural_exp()
def func_test_set_lr(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32") a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
...@@ -477,6 +533,11 @@ class TestOptimizerLearningRate(unittest.TestCase): ...@@ -477,6 +533,11 @@ class TestOptimizerLearningRate(unittest.TestCase):
parameter_list=linear.parameters()) parameter_list=linear.parameters())
adam.set_lr(0.01) adam.set_lr(0.01)
def test_set_lr(self):
with _test_eager_guard():
self.func_test_set_lr()
self.func_test_set_lr()
class TestImperativeMomentumOptimizer(TestImperativeOptimizerBase): class TestImperativeMomentumOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -488,9 +549,14 @@ class TestImperativeMomentumOptimizer(TestImperativeOptimizerBase): ...@@ -488,9 +549,14 @@ class TestImperativeMomentumOptimizer(TestImperativeOptimizerBase):
optimizer = MomentumOptimizer(learning_rate=0.001, momentum=0.9) optimizer = MomentumOptimizer(learning_rate=0.001, momentum=0.9)
return optimizer return optimizer
def test_momentum(self): def func_test_momentum(self):
self._check_mlp() self._check_mlp()
def test_momentum(self):
with _test_eager_guard():
self.func_test_momentum()
self.func_test_momentum()
class TestImperativeLarsMomentumOptimizer(TestImperativeOptimizerBase): class TestImperativeLarsMomentumOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -502,9 +568,14 @@ class TestImperativeLarsMomentumOptimizer(TestImperativeOptimizerBase): ...@@ -502,9 +568,14 @@ class TestImperativeLarsMomentumOptimizer(TestImperativeOptimizerBase):
optimizer = LarsMomentumOptimizer(learning_rate=0.001, momentum=0.9) optimizer = LarsMomentumOptimizer(learning_rate=0.001, momentum=0.9)
return optimizer return optimizer
def test_larsmomentum(self): def func_test_larsmomentum(self):
self._check_mlp() self._check_mlp()
def test_larsmomentum(self):
with _test_eager_guard():
self.func_test_larsmomentum()
self.func_test_larsmomentum()
class TestImperativeAdagradOptimizer(TestImperativeOptimizerBase): class TestImperativeAdagradOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -516,9 +587,14 @@ class TestImperativeAdagradOptimizer(TestImperativeOptimizerBase): ...@@ -516,9 +587,14 @@ class TestImperativeAdagradOptimizer(TestImperativeOptimizerBase):
optimizer = AdagradOptimizer(learning_rate=0.2) optimizer = AdagradOptimizer(learning_rate=0.2)
return optimizer return optimizer
def test_adagrad(self): def func_test_adagrad(self):
self._check_mlp() self._check_mlp()
def test_adagrad(self):
with _test_eager_guard():
self.func_test_adagrad()
self.func_test_adagrad()
class TestImperativeAdamaxOptimizer(TestImperativeOptimizerBase): class TestImperativeAdamaxOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -530,9 +606,14 @@ class TestImperativeAdamaxOptimizer(TestImperativeOptimizerBase): ...@@ -530,9 +606,14 @@ class TestImperativeAdamaxOptimizer(TestImperativeOptimizerBase):
optimizer = AdamaxOptimizer(learning_rate=0.2) optimizer = AdamaxOptimizer(learning_rate=0.2)
return optimizer return optimizer
def test_adamax(self): def func_test_adamax(self):
self._check_mlp() self._check_mlp()
def test_adamax(self):
with _test_eager_guard():
self.func_test_adamax()
self.func_test_adamax()
class TestImperativeDpsgdOptimizer(TestImperativeOptimizerBase): class TestImperativeDpsgdOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -551,9 +632,14 @@ class TestImperativeDpsgdOptimizer(TestImperativeOptimizerBase): ...@@ -551,9 +632,14 @@ class TestImperativeDpsgdOptimizer(TestImperativeOptimizerBase):
optimizer._seed = 100 optimizer._seed = 100
return optimizer return optimizer
def test_dpsgd(self): def func_test_dpsgd(self):
self._check_mlp(place=fluid.CPUPlace()) self._check_mlp(place=fluid.CPUPlace())
def test_dpsgd(self):
with _test_eager_guard():
self.func_test_dpsgd()
self.func_test_dpsgd()
class TestImperativeDecayedAdagradOptimizer(TestImperativeOptimizerBase): class TestImperativeDecayedAdagradOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -565,9 +651,14 @@ class TestImperativeDecayedAdagradOptimizer(TestImperativeOptimizerBase): ...@@ -565,9 +651,14 @@ class TestImperativeDecayedAdagradOptimizer(TestImperativeOptimizerBase):
optimizer = DecayedAdagradOptimizer(learning_rate=0.2) optimizer = DecayedAdagradOptimizer(learning_rate=0.2)
return optimizer return optimizer
def test_decayadagrad(self): def func_test_decayadagrad(self):
self._check_mlp() self._check_mlp()
def test_decayadagrad(self):
with _test_eager_guard():
self.func_test_decayadagrad()
self.func_test_decayadagrad()
class TestImperativeAdadeltaOptimizer(TestImperativeOptimizerBase): class TestImperativeAdadeltaOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -583,9 +674,14 @@ class TestImperativeAdadeltaOptimizer(TestImperativeOptimizerBase): ...@@ -583,9 +674,14 @@ class TestImperativeAdadeltaOptimizer(TestImperativeOptimizerBase):
learning_rate=0.0003, epsilon=1.0e-6, rho=0.95) learning_rate=0.0003, epsilon=1.0e-6, rho=0.95)
return optimizer return optimizer
def test_adadelta(self): def func_test_adadelta(self):
self._check_mlp() self._check_mlp()
def test_adadelta(self):
with _test_eager_guard():
self.func_test_adadelta()
self.func_test_adadelta()
class TestImperativeRMSPropOptimizer(TestImperativeOptimizerBase): class TestImperativeRMSPropOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -597,9 +693,14 @@ class TestImperativeRMSPropOptimizer(TestImperativeOptimizerBase): ...@@ -597,9 +693,14 @@ class TestImperativeRMSPropOptimizer(TestImperativeOptimizerBase):
optimizer = RMSPropOptimizer(learning_rate=0.1) optimizer = RMSPropOptimizer(learning_rate=0.1)
return optimizer return optimizer
def test_rmsprop(self): def func_test_rmsprop(self):
self._check_mlp() self._check_mlp()
def test_rmsprop(self):
with _test_eager_guard():
self.func_test_rmsprop()
self.func_test_rmsprop()
class TestImperativeFtrlOptimizer(TestImperativeOptimizerBase): class TestImperativeFtrlOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -611,9 +712,14 @@ class TestImperativeFtrlOptimizer(TestImperativeOptimizerBase): ...@@ -611,9 +712,14 @@ class TestImperativeFtrlOptimizer(TestImperativeOptimizerBase):
optimizer = FtrlOptimizer(learning_rate=0.1) optimizer = FtrlOptimizer(learning_rate=0.1)
return optimizer return optimizer
def test_ftrl(self): def func_test_ftrl(self):
self._check_mlp() self._check_mlp()
def test_ftrl(self):
with _test_eager_guard():
self.func_test_ftrl()
self.func_test_ftrl()
def exclude_fn(param): def exclude_fn(param):
return param.name.endswith('.b_0') return param.name.endswith('.b_0')
...@@ -643,10 +749,15 @@ class TestImperativeModelAverage(TestImperativeOptimizerBase): ...@@ -643,10 +749,15 @@ class TestImperativeModelAverage(TestImperativeOptimizerBase):
0.15, min_average_window=10000, max_average_window=12500) 0.15, min_average_window=10000, max_average_window=12500)
return optimizer return optimizer
def test_modelaverage(self): def func_test_modelaverage(self):
exception_message = "In dygraph, don't support ModelAverage." exception_message = "In dygraph, don't support ModelAverage."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_modelaverage(self):
with _test_eager_guard():
self.func_test_modelaverage()
self.func_test_modelaverage()
class TestImperativeDGCMomentumOptimizer(TestImperativeOptimizerBase): class TestImperativeDGCMomentumOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -658,20 +769,30 @@ class TestImperativeDGCMomentumOptimizer(TestImperativeOptimizerBase): ...@@ -658,20 +769,30 @@ class TestImperativeDGCMomentumOptimizer(TestImperativeOptimizerBase):
sparsity=[0.999, 0.999]) sparsity=[0.999, 0.999])
return optimizer return optimizer
def test_dgcmomentum(self): def func_test_dgcmomentum(self):
exception_message = "In dygraph, don't support DGCMomentumOptimizer." exception_message = "In dygraph, don't support DGCMomentumOptimizer."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_dgcmomentum(self):
with _test_eager_guard():
self.func_test_dgcmomentum()
self.func_test_dgcmomentum()
class TestImperativeExponentialMovingAverage(TestImperativeOptimizerBase): class TestImperativeExponentialMovingAverage(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
optimizer = ExponentialMovingAverage(0.999) optimizer = ExponentialMovingAverage(0.999)
return optimizer return optimizer
def test_exponentialmoving(self): def func_test_exponentialmoving(self):
exception_message = "In dygraph, don't support ExponentialMovingAverage." exception_message = "In dygraph, don't support ExponentialMovingAverage."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_exponentialmoving(self):
with _test_eager_guard():
self.func_test_exponentialmoving()
self.func_test_exponentialmoving()
class TestImperativePipelineOptimizer(TestImperativeOptimizerBase): class TestImperativePipelineOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -680,10 +801,15 @@ class TestImperativePipelineOptimizer(TestImperativeOptimizerBase): ...@@ -680,10 +801,15 @@ class TestImperativePipelineOptimizer(TestImperativeOptimizerBase):
optimizer = PipelineOptimizer(optimizer) optimizer = PipelineOptimizer(optimizer)
return optimizer return optimizer
def test_pipline(self): def func_test_pipline(self):
exception_message = "In dygraph, don't support PipelineOptimizer." exception_message = "In dygraph, don't support PipelineOptimizer."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_pipline(self):
with _test_eager_guard():
self.func_test_pipline()
self.func_test_pipline()
class TestImperativeLookaheadOptimizer(TestImperativeOptimizerBase): class TestImperativeLookaheadOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -692,10 +818,15 @@ class TestImperativeLookaheadOptimizer(TestImperativeOptimizerBase): ...@@ -692,10 +818,15 @@ class TestImperativeLookaheadOptimizer(TestImperativeOptimizerBase):
optimizer = LookaheadOptimizer(optimizer, alpha=0.5, k=5) optimizer = LookaheadOptimizer(optimizer, alpha=0.5, k=5)
return optimizer return optimizer
def test_lookahead(self): def func_test_lookahead(self):
exception_message = "In dygraph, don't support LookaheadOptimizer." exception_message = "In dygraph, don't support LookaheadOptimizer."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_lookahead(self):
with _test_eager_guard():
self.func_test_lookahead()
self.func_test_lookahead()
class TestImperativeRecomputeOptimizer(TestImperativeOptimizerBase): class TestImperativeRecomputeOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -704,13 +835,18 @@ class TestImperativeRecomputeOptimizer(TestImperativeOptimizerBase): ...@@ -704,13 +835,18 @@ class TestImperativeRecomputeOptimizer(TestImperativeOptimizerBase):
optimizer = RecomputeOptimizer(optimizer) optimizer = RecomputeOptimizer(optimizer)
return optimizer return optimizer
def test_recompute(self): def func_test_recompute(self):
exception_message = "In dygraph, don't support RecomputeOptimizer." exception_message = "In dygraph, don't support RecomputeOptimizer."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_recompute(self):
with _test_eager_guard():
self.func_test_recompute()
self.func_test_recompute()
class TestImperativeOptimizerList(unittest.TestCase): class TestImperativeOptimizerList(unittest.TestCase):
def test_parameter_list(self): def func_test_parameter_list(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
linear_1 = Linear(10, 10) linear_1 = Linear(10, 10)
linear_2 = Linear(10, 10) linear_2 = Linear(10, 10)
...@@ -733,6 +869,11 @@ class TestImperativeOptimizerList(unittest.TestCase): ...@@ -733,6 +869,11 @@ class TestImperativeOptimizerList(unittest.TestCase):
len(sgd._parameter_list) == len(sgd._parameter_list) ==
len(linear_1.parameters() + linear_2.parameters())) len(linear_1.parameters() + linear_2.parameters()))
def test_parameter_list(self):
with _test_eager_guard():
self.func_test_parameter_list()
self.func_test_parameter_list()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -28,6 +28,7 @@ from paddle.fluid.optimizer import ModelAverage, DGCMomentumOptimizer, Exponenti ...@@ -28,6 +28,7 @@ from paddle.fluid.optimizer import ModelAverage, DGCMomentumOptimizer, Exponenti
from paddle.fluid.dygraph import Linear from paddle.fluid.dygraph import Linear
from paddle.fluid.dygraph.base import to_variable from paddle.fluid.dygraph.base import to_variable
from test_imperative_base import new_program_scope from test_imperative_base import new_program_scope
from paddle.fluid.framework import _test_eager_guard
# Note(wangzhongpu) # Note(wangzhongpu)
# In dygraph, don't support ModelAverage, DGCMomentumOptimizer, ExponentialMovingAverage, PipelineOptimizer, LookaheadOptimizer, RecomputeOptimizer. # In dygraph, don't support ModelAverage, DGCMomentumOptimizer, ExponentialMovingAverage, PipelineOptimizer, LookaheadOptimizer, RecomputeOptimizer.
...@@ -239,9 +240,14 @@ class TestImperativeOptimizerPiecewiseDecay(TestImperativeOptimizerBase): ...@@ -239,9 +240,14 @@ class TestImperativeOptimizerPiecewiseDecay(TestImperativeOptimizerBase):
values=[0.1 * (0.1**i) for i in range(len(bd) + 1)])) values=[0.1 * (0.1**i) for i in range(len(bd) + 1)]))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerNaturalExpDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerNaturalExpDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -257,9 +263,14 @@ class TestImperativeOptimizerNaturalExpDecay(TestImperativeOptimizerBase): ...@@ -257,9 +263,14 @@ class TestImperativeOptimizerNaturalExpDecay(TestImperativeOptimizerBase):
learning_rate=0.5, gamma=0.9)) learning_rate=0.5, gamma=0.9))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerExponentialDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerExponentialDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -275,9 +286,14 @@ class TestImperativeOptimizerExponentialDecay(TestImperativeOptimizerBase): ...@@ -275,9 +286,14 @@ class TestImperativeOptimizerExponentialDecay(TestImperativeOptimizerBase):
learning_rate=0.5, gamma=0.9)) learning_rate=0.5, gamma=0.9))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerInverseTimeDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerInverseTimeDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -293,9 +309,14 @@ class TestImperativeOptimizerInverseTimeDecay(TestImperativeOptimizerBase): ...@@ -293,9 +309,14 @@ class TestImperativeOptimizerInverseTimeDecay(TestImperativeOptimizerBase):
learning_rate=0.5, gamma=0.9)) learning_rate=0.5, gamma=0.9))
return optimizer return optimizer
def test_adam(self): def func_test_adam(self):
self._check_mlp() self._check_mlp()
def test_adam(self):
with _test_eager_guard():
self.func_test_adam()
self.func_test_adam()
class TestImperativeOptimizerPolynomialDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerPolynomialDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -311,14 +332,24 @@ class TestImperativeOptimizerPolynomialDecay(TestImperativeOptimizerBase): ...@@ -311,14 +332,24 @@ class TestImperativeOptimizerPolynomialDecay(TestImperativeOptimizerBase):
learning_rate=0.5, decay_steps=5, cycle=self.cycle)) learning_rate=0.5, decay_steps=5, cycle=self.cycle))
return optimizer return optimizer
def test_sgd_cycle(self): def func_test_sgd_cycle(self):
self.cycle = True self.cycle = True
self._check_mlp() self._check_mlp()
def test_sgd(self): def test_sgd_cycle(self):
with _test_eager_guard():
self.func_test_sgd_cycle()
self.func_test_sgd_cycle()
def func_test_sgd(self):
self.cycle = False self.cycle = False
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerCosineAnnealingDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerCosineAnnealingDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -334,9 +365,14 @@ class TestImperativeOptimizerCosineAnnealingDecay(TestImperativeOptimizerBase): ...@@ -334,9 +365,14 @@ class TestImperativeOptimizerCosineAnnealingDecay(TestImperativeOptimizerBase):
learning_rate=0.5, T_max=5)) learning_rate=0.5, T_max=5))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerNoamDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerNoamDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -352,9 +388,14 @@ class TestImperativeOptimizerNoamDecay(TestImperativeOptimizerBase): ...@@ -352,9 +388,14 @@ class TestImperativeOptimizerNoamDecay(TestImperativeOptimizerBase):
d_model=0.01, warmup_steps=100)) d_model=0.01, warmup_steps=100))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerLambdaDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerLambdaDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -370,9 +411,14 @@ class TestImperativeOptimizerLambdaDecay(TestImperativeOptimizerBase): ...@@ -370,9 +411,14 @@ class TestImperativeOptimizerLambdaDecay(TestImperativeOptimizerBase):
learning_rate=0.5, lr_lambda=lambda epoch: 0.9**epoch)) learning_rate=0.5, lr_lambda=lambda epoch: 0.9**epoch))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerLinearWarmup(TestImperativeOptimizerBase): class TestImperativeOptimizerLinearWarmup(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -392,9 +438,14 @@ class TestImperativeOptimizerLinearWarmup(TestImperativeOptimizerBase): ...@@ -392,9 +438,14 @@ class TestImperativeOptimizerLinearWarmup(TestImperativeOptimizerBase):
verbose=True)) verbose=True))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerMultiStepDecay(TestImperativeOptimizerBase): class TestImperativeOptimizerMultiStepDecay(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -410,9 +461,14 @@ class TestImperativeOptimizerMultiStepDecay(TestImperativeOptimizerBase): ...@@ -410,9 +461,14 @@ class TestImperativeOptimizerMultiStepDecay(TestImperativeOptimizerBase):
learning_rate=0.5, milestones=[2, 4, 6], gamma=0.8)) learning_rate=0.5, milestones=[2, 4, 6], gamma=0.8))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerStepLR(TestImperativeOptimizerBase): class TestImperativeOptimizerStepLR(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -428,9 +484,14 @@ class TestImperativeOptimizerStepLR(TestImperativeOptimizerBase): ...@@ -428,9 +484,14 @@ class TestImperativeOptimizerStepLR(TestImperativeOptimizerBase):
learning_rate=0.5, step_size=5, gamma=0.8)) learning_rate=0.5, step_size=5, gamma=0.8))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestImperativeOptimizerReduceOnPlateau(TestImperativeOptimizerBase): class TestImperativeOptimizerReduceOnPlateau(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -446,12 +507,17 @@ class TestImperativeOptimizerReduceOnPlateau(TestImperativeOptimizerBase): ...@@ -446,12 +507,17 @@ class TestImperativeOptimizerReduceOnPlateau(TestImperativeOptimizerBase):
learning_rate=0.5)) learning_rate=0.5))
return optimizer return optimizer
def test_sgd(self): def func_test_sgd(self):
self._check_mlp() self._check_mlp()
def test_sgd(self):
with _test_eager_guard():
self.func_test_sgd()
self.func_test_sgd()
class TestOptimizerLearningRate(unittest.TestCase): class TestOptimizerLearningRate(unittest.TestCase):
def test_constant_lr(self): def func_test_constant_lr(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32") a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
...@@ -475,7 +541,12 @@ class TestOptimizerLearningRate(unittest.TestCase): ...@@ -475,7 +541,12 @@ class TestOptimizerLearningRate(unittest.TestCase):
self.assertTrue(np.allclose(lr, 0.001, rtol=1e-06, atol=0.0)) self.assertTrue(np.allclose(lr, 0.001, rtol=1e-06, atol=0.0))
def test_lr_decay(self): def test_constant_lr(self):
with _test_eager_guard():
self.func_test_constant_lr()
self.func_test_constant_lr()
def func_test_lr_decay(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32") a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
...@@ -505,7 +576,12 @@ class TestOptimizerLearningRate(unittest.TestCase): ...@@ -505,7 +576,12 @@ class TestOptimizerLearningRate(unittest.TestCase):
self.assertTrue(np.allclose(lr, ret[i], rtol=1e-06, atol=0.0)) self.assertTrue(np.allclose(lr, ret[i], rtol=1e-06, atol=0.0))
scheduler.step() scheduler.step()
def test_lr_scheduler_natural_exp(self): def test_lr_decay(self):
with _test_eager_guard():
self.func_test_lr_decay()
self.func_test_lr_decay()
def func_test_lr_scheduler_natural_exp(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32") a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
...@@ -531,7 +607,12 @@ class TestOptimizerLearningRate(unittest.TestCase): ...@@ -531,7 +607,12 @@ class TestOptimizerLearningRate(unittest.TestCase):
self.assertTrue(np.allclose(lr, ret[i], rtol=1e-06, atol=0.0)) self.assertTrue(np.allclose(lr, ret[i], rtol=1e-06, atol=0.0))
scheduler.step() scheduler.step()
def test_set_lr(self): def test_lr_scheduler_natural_exp(self):
with _test_eager_guard():
self.func_test_lr_scheduler_natural_exp()
self.func_test_lr_scheduler_natural_exp()
def func_test_set_lr(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32") a = np.random.uniform(-0.1, 0.1, [10, 10]).astype("float32")
...@@ -566,6 +647,11 @@ class TestOptimizerLearningRate(unittest.TestCase): ...@@ -566,6 +647,11 @@ class TestOptimizerLearningRate(unittest.TestCase):
parameters=linear.parameters()) parameters=linear.parameters())
adam.set_lr(0.01) adam.set_lr(0.01)
def test_set_lr(self):
with _test_eager_guard():
self.func_test_set_lr()
self.func_test_set_lr()
class TestImperativeMomentumOptimizer(TestImperativeOptimizerBase): class TestImperativeMomentumOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -577,9 +663,14 @@ class TestImperativeMomentumOptimizer(TestImperativeOptimizerBase): ...@@ -577,9 +663,14 @@ class TestImperativeMomentumOptimizer(TestImperativeOptimizerBase):
optimizer = MomentumOptimizer(learning_rate=0.001, momentum=0.9) optimizer = MomentumOptimizer(learning_rate=0.001, momentum=0.9)
return optimizer return optimizer
def test_momentum(self): def func_test_momentum(self):
self._check_mlp() self._check_mlp()
def test_momentum(self):
with _test_eager_guard():
self.func_test_momentum()
self.func_test_momentum()
class TestImperativeLarsMomentumOptimizer(TestImperativeOptimizerBase): class TestImperativeLarsMomentumOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -591,9 +682,14 @@ class TestImperativeLarsMomentumOptimizer(TestImperativeOptimizerBase): ...@@ -591,9 +682,14 @@ class TestImperativeLarsMomentumOptimizer(TestImperativeOptimizerBase):
optimizer = LarsMomentumOptimizer(learning_rate=0.001, momentum=0.9) optimizer = LarsMomentumOptimizer(learning_rate=0.001, momentum=0.9)
return optimizer return optimizer
def test_larsmomentum(self): def func_test_larsmomentum(self):
self._check_mlp() self._check_mlp()
def test_larsmomentum(self):
with _test_eager_guard():
self.func_test_larsmomentum()
self.func_test_larsmomentum()
class TestImperativeAdagradOptimizer(TestImperativeOptimizerBase): class TestImperativeAdagradOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -605,9 +701,14 @@ class TestImperativeAdagradOptimizer(TestImperativeOptimizerBase): ...@@ -605,9 +701,14 @@ class TestImperativeAdagradOptimizer(TestImperativeOptimizerBase):
optimizer = AdagradOptimizer(learning_rate=0.2) optimizer = AdagradOptimizer(learning_rate=0.2)
return optimizer return optimizer
def test_adagrad(self): def func_test_adagrad(self):
self._check_mlp() self._check_mlp()
def test_adagrad(self):
with _test_eager_guard():
self.func_test_adagrad()
self.func_test_adagrad()
class TestImperativeAdamaxOptimizer(TestImperativeOptimizerBase): class TestImperativeAdamaxOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -619,9 +720,14 @@ class TestImperativeAdamaxOptimizer(TestImperativeOptimizerBase): ...@@ -619,9 +720,14 @@ class TestImperativeAdamaxOptimizer(TestImperativeOptimizerBase):
optimizer = AdamaxOptimizer(learning_rate=0.2) optimizer = AdamaxOptimizer(learning_rate=0.2)
return optimizer return optimizer
def test_adamax(self): def func_test_adamax(self):
self._check_mlp() self._check_mlp()
def test_adamax(self):
with _test_eager_guard():
self.func_test_adamax()
self.func_test_adamax()
class TestImperativeDpsgdOptimizer(TestImperativeOptimizerBase): class TestImperativeDpsgdOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -640,9 +746,14 @@ class TestImperativeDpsgdOptimizer(TestImperativeOptimizerBase): ...@@ -640,9 +746,14 @@ class TestImperativeDpsgdOptimizer(TestImperativeOptimizerBase):
optimizer._seed = 100 optimizer._seed = 100
return optimizer return optimizer
def test_dpsgd(self): def func_test_dpsgd(self):
self._check_mlp(place=fluid.CPUPlace()) self._check_mlp(place=fluid.CPUPlace())
def test_dpsgd(self):
with _test_eager_guard():
self.func_test_dpsgd()
self.func_test_dpsgd()
class TestImperativeDecayedAdagradOptimizer(TestImperativeOptimizerBase): class TestImperativeDecayedAdagradOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -654,9 +765,14 @@ class TestImperativeDecayedAdagradOptimizer(TestImperativeOptimizerBase): ...@@ -654,9 +765,14 @@ class TestImperativeDecayedAdagradOptimizer(TestImperativeOptimizerBase):
optimizer = DecayedAdagradOptimizer(learning_rate=0.2) optimizer = DecayedAdagradOptimizer(learning_rate=0.2)
return optimizer return optimizer
def test_decayadagrad(self): def func_test_decayadagrad(self):
self._check_mlp() self._check_mlp()
def test_decayadagrad(self):
with _test_eager_guard():
self.func_test_decayadagrad()
self.func_test_decayadagrad()
class TestImperativeAdadeltaOptimizer(TestImperativeOptimizerBase): class TestImperativeAdadeltaOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -672,9 +788,14 @@ class TestImperativeAdadeltaOptimizer(TestImperativeOptimizerBase): ...@@ -672,9 +788,14 @@ class TestImperativeAdadeltaOptimizer(TestImperativeOptimizerBase):
learning_rate=0.0003, epsilon=1.0e-6, rho=0.95) learning_rate=0.0003, epsilon=1.0e-6, rho=0.95)
return optimizer return optimizer
def test_adadelta(self): def func_test_adadelta(self):
self._check_mlp() self._check_mlp()
def test_adadelta(self):
with _test_eager_guard():
self.func_test_adadelta()
self.func_test_adadelta()
class TestImperativeRMSPropOptimizer(TestImperativeOptimizerBase): class TestImperativeRMSPropOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -686,9 +807,14 @@ class TestImperativeRMSPropOptimizer(TestImperativeOptimizerBase): ...@@ -686,9 +807,14 @@ class TestImperativeRMSPropOptimizer(TestImperativeOptimizerBase):
optimizer = RMSPropOptimizer(learning_rate=0.1) optimizer = RMSPropOptimizer(learning_rate=0.1)
return optimizer return optimizer
def test_rmsprop(self): def func_test_rmsprop(self):
self._check_mlp() self._check_mlp()
def test_rmsprop(self):
with _test_eager_guard():
self.func_test_rmsprop()
self.func_test_rmsprop()
class TestImperativeFtrlOptimizer(TestImperativeOptimizerBase): class TestImperativeFtrlOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -700,9 +826,14 @@ class TestImperativeFtrlOptimizer(TestImperativeOptimizerBase): ...@@ -700,9 +826,14 @@ class TestImperativeFtrlOptimizer(TestImperativeOptimizerBase):
optimizer = FtrlOptimizer(learning_rate=0.1) optimizer = FtrlOptimizer(learning_rate=0.1)
return optimizer return optimizer
def test_ftrl(self): def func_test_ftrl(self):
self._check_mlp() self._check_mlp()
def test_ftrl(self):
with _test_eager_guard():
self.func_test_ftrl()
self.func_test_ftrl()
def exclude_fn(param): def exclude_fn(param):
return param.name.endswith('.b_0') return param.name.endswith('.b_0')
...@@ -732,10 +863,15 @@ class TestImperativeModelAverage(TestImperativeOptimizerBase): ...@@ -732,10 +863,15 @@ class TestImperativeModelAverage(TestImperativeOptimizerBase):
0.15, min_average_window=10000, max_average_window=12500) 0.15, min_average_window=10000, max_average_window=12500)
return optimizer return optimizer
def test_modelaverage(self): def func_test_modelaverage(self):
exception_message = "In dygraph, don't support ModelAverage." exception_message = "In dygraph, don't support ModelAverage."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_modelaverage(self):
with _test_eager_guard():
self.func_test_modelaverage()
self.func_test_modelaverage()
class TestImperativeDGCMomentumOptimizer(TestImperativeOptimizerBase): class TestImperativeDGCMomentumOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -747,20 +883,30 @@ class TestImperativeDGCMomentumOptimizer(TestImperativeOptimizerBase): ...@@ -747,20 +883,30 @@ class TestImperativeDGCMomentumOptimizer(TestImperativeOptimizerBase):
sparsity=[0.999, 0.999]) sparsity=[0.999, 0.999])
return optimizer return optimizer
def test_dgcmomentum(self): def func_test_dgcmomentum(self):
exception_message = "In dygraph, don't support DGCMomentumOptimizer." exception_message = "In dygraph, don't support DGCMomentumOptimizer."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_dgcmomentum(self):
with _test_eager_guard():
self.func_test_dgcmomentum()
self.func_test_dgcmomentum()
class TestImperativeExponentialMovingAverage(TestImperativeOptimizerBase): class TestImperativeExponentialMovingAverage(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
optimizer = ExponentialMovingAverage(0.999) optimizer = ExponentialMovingAverage(0.999)
return optimizer return optimizer
def test_exponentialmoving(self): def func_test_exponentialmoving(self):
exception_message = "In dygraph, don't support ExponentialMovingAverage." exception_message = "In dygraph, don't support ExponentialMovingAverage."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_exponentialmoving(self):
with _test_eager_guard():
self.func_test_exponentialmoving()
self.func_test_exponentialmoving()
class TestImperativePipelineOptimizer(TestImperativeOptimizerBase): class TestImperativePipelineOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -769,10 +915,15 @@ class TestImperativePipelineOptimizer(TestImperativeOptimizerBase): ...@@ -769,10 +915,15 @@ class TestImperativePipelineOptimizer(TestImperativeOptimizerBase):
optimizer = PipelineOptimizer(optimizer) optimizer = PipelineOptimizer(optimizer)
return optimizer return optimizer
def test_pipline(self): def func_test_pipline(self):
exception_message = "In dygraph, don't support PipelineOptimizer." exception_message = "In dygraph, don't support PipelineOptimizer."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_pipline(self):
with _test_eager_guard():
self.func_test_pipline()
self.func_test_pipline()
class TestImperativeLookaheadOptimizer(TestImperativeOptimizerBase): class TestImperativeLookaheadOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -781,10 +932,15 @@ class TestImperativeLookaheadOptimizer(TestImperativeOptimizerBase): ...@@ -781,10 +932,15 @@ class TestImperativeLookaheadOptimizer(TestImperativeOptimizerBase):
optimizer = LookaheadOptimizer(optimizer, alpha=0.5, k=5) optimizer = LookaheadOptimizer(optimizer, alpha=0.5, k=5)
return optimizer return optimizer
def test_lookahead(self): def func_test_lookahead(self):
exception_message = "In dygraph, don't support LookaheadOptimizer." exception_message = "In dygraph, don't support LookaheadOptimizer."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_lookahead(self):
with _test_eager_guard():
self.func_test_lookahead()
self.func_test_lookahead()
class TestImperativeRecomputeOptimizer(TestImperativeOptimizerBase): class TestImperativeRecomputeOptimizer(TestImperativeOptimizerBase):
def get_optimizer_dygraph(self, parameter_list): def get_optimizer_dygraph(self, parameter_list):
...@@ -793,13 +949,18 @@ class TestImperativeRecomputeOptimizer(TestImperativeOptimizerBase): ...@@ -793,13 +949,18 @@ class TestImperativeRecomputeOptimizer(TestImperativeOptimizerBase):
optimizer = RecomputeOptimizer(optimizer) optimizer = RecomputeOptimizer(optimizer)
return optimizer return optimizer
def test_recompute(self): def func_test_recompute(self):
exception_message = "In dygraph, don't support RecomputeOptimizer." exception_message = "In dygraph, don't support RecomputeOptimizer."
self._check_exception(exception_message) self._check_exception(exception_message)
def test_recompute(self):
with _test_eager_guard():
self.func_test_recompute()
self.func_test_recompute()
class TestImperativeOptimizerList(unittest.TestCase): class TestImperativeOptimizerList(unittest.TestCase):
def test_parameter_list(self): def func_test_parameter_list(self):
with fluid.dygraph.guard(): with fluid.dygraph.guard():
linear_1 = Linear(10, 10) linear_1 = Linear(10, 10)
linear_2 = Linear(10, 10) linear_2 = Linear(10, 10)
...@@ -822,6 +983,11 @@ class TestImperativeOptimizerList(unittest.TestCase): ...@@ -822,6 +983,11 @@ class TestImperativeOptimizerList(unittest.TestCase):
len(sgd._parameter_list) == len(sgd._parameter_list) ==
len(linear_1.parameters() + linear_2.parameters())) len(linear_1.parameters() + linear_2.parameters()))
def test_parameter_list(self):
with _test_eager_guard():
self.func_test_parameter_list()
self.func_test_parameter_list()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -971,6 +971,13 @@ class RNNBase(LayerList): ...@@ -971,6 +971,13 @@ class RNNBase(LayerList):
# should dropout state be persistable for static-graph # should dropout state be persistable for static-graph
self._dropout_state = self.create_variable( self._dropout_state = self.create_variable(
dtype=fluid.core.VarDesc.VarType.UINT8) dtype=fluid.core.VarDesc.VarType.UINT8)
if fluid.framework.in_dygraph_mode():
with paddle.no_grad():
_C_ops.coalesce_tensor(self._all_weights, self._all_weights,
self._flat_weight[0], "copy_data",
True, "use_align", False, "dtype",
params[0].dtype)
return
# for static-graph, append coalesce_tensor into startup program # for static-graph, append coalesce_tensor into startup program
with fluid.program_guard(fluid.default_startup_program(), with fluid.program_guard(fluid.default_startup_program(),
fluid.default_startup_program()): fluid.default_startup_program()):
......
...@@ -16,6 +16,8 @@ import math ...@@ -16,6 +16,8 @@ import math
import numpy import numpy
import warnings import warnings
from paddle import Tensor from paddle import Tensor
import paddle.fluid.core as core
from ..fluid.framework import _in_eager_mode
__all__ = [ # noqa __all__ = [ # noqa
'LRScheduler', 'LRScheduler',
...@@ -1355,8 +1357,12 @@ class ReduceOnPlateau(LRScheduler): ...@@ -1355,8 +1357,12 @@ class ReduceOnPlateau(LRScheduler):
else: else:
self.last_epoch = epoch self.last_epoch = epoch
if _in_eager_mode():
tmp = core.eager.EagerTensor
else:
tmp = Tensor
# loss must be float, numpy.ndarray or 1-D Tensor with shape [1] # loss must be float, numpy.ndarray or 1-D Tensor with shape [1]
if isinstance(metrics, (Tensor, numpy.ndarray)): if isinstance(metrics, (tmp, numpy.ndarray)):
assert len(metrics.shape) == 1 and metrics.shape[0] == 1, "the metrics.shape " \ assert len(metrics.shape) == 1 and metrics.shape[0] == 1, "the metrics.shape " \
"should be (1L,), but the current metrics.shape is {}. Maybe that " \ "should be (1L,), but the current metrics.shape is {}. Maybe that " \
"you should call paddle.mean to process it first.".format( "you should call paddle.mean to process it first.".format(
......
...@@ -424,16 +424,21 @@ class Optimizer(object): ...@@ -424,16 +424,21 @@ class Optimizer(object):
self._learning_rate = float(value) self._learning_rate = float(value)
current_lr = self._global_learning_rate() current_lr = self._global_learning_rate()
if current_lr is not None: if current_lr is not None:
global_block = framework.default_main_program().global_block() if framework.in_dygraph_mode():
global_block.append_op( _C_ops.fill_constant(current_lr, 'value',
type='fill_constant', float(value), 'dtype', current_lr.dtype,
outputs={'Out': [current_lr]}, 'shape', list(current_lr.shape))
attrs={ else:
'dtype': current_lr.dtype, global_block = framework.default_main_program().global_block()
'shape': list(current_lr.shape), global_block.append_op(
'value': float(value) type='fill_constant',
}, outputs={'Out': [current_lr]},
stop_gradient=True) attrs={
'dtype': current_lr.dtype,
'shape': list(current_lr.shape),
'value': float(value)
},
stop_gradient=True)
def get_lr(self): def get_lr(self):
""" """
...@@ -590,7 +595,9 @@ class Optimizer(object): ...@@ -590,7 +595,9 @@ class Optimizer(object):
name=var_name, name=var_name,
persistable=True, persistable=True,
dtype=dtype or param.dtype, dtype=dtype or param.dtype,
type=param.type if type is None else type, type=core.VarDesc.VarType.LOD_TENSOR
if framework._in_eager_mode() else (param.type
if type is None else type),
shape=shape, shape=shape,
belong_to_optimizer=True) belong_to_optimizer=True)
if device is None: if device is None:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册