未验证 提交 7098bfdf 编写于 作者: C Charles-hit 提交者: GitHub

support cast op backward refuse forward and fix some bugs (#46173)

* support cast op backward refuse forward

* Fix the bug of high order unit test framework
上级 2b76db99
...@@ -326,12 +326,7 @@ ...@@ -326,12 +326,7 @@
forward : cast (Tensor x, DataType out_dtype) -> Tensor(out) forward : cast (Tensor x, DataType out_dtype) -> Tensor(out)
args : (Tensor x, Tensor out_grad) args : (Tensor x, Tensor out_grad)
output : Tensor(x_grad) output : Tensor(x_grad)
infer_meta : invoke : cast (out_grad, x.dtype())
func : UnchangedInferMeta
param : [x]
kernel :
func : cast_grad
data_type : out_grad
no_need_buffer : x no_need_buffer : x
- backward_op : ceil_grad - backward_op : ceil_grad
......
...@@ -268,6 +268,9 @@ def grad_check(x, ...@@ -268,6 +268,9 @@ def grad_check(x,
for v in x: for v in x:
v.stop_gradient = False v.stop_gradient = False
v.persistable = True v.persistable = True
for u in y:
u.stop_gradient = False
u.persistable = True
if place is None: if place is None:
place = fluid.CPUPlace() place = fluid.CPUPlace()
if program is None: if program is None:
...@@ -364,6 +367,9 @@ def double_grad_check(x, ...@@ -364,6 +367,9 @@ def double_grad_check(x,
v.stop_gradient = False v.stop_gradient = False
v.persistable = True v.persistable = True
y = _as_list(y) y = _as_list(y)
for u in y:
u.stop_gradient = False
u.persistable = True
if program is None: if program is None:
program = fluid.default_main_program() program = fluid.default_main_program()
...@@ -445,6 +451,9 @@ def triple_grad_check(x, ...@@ -445,6 +451,9 @@ def triple_grad_check(x,
v.stop_gradient = False v.stop_gradient = False
v.persistable = True v.persistable = True
y = _as_list(y) y = _as_list(y)
for u in y:
u.stop_gradient = False
u.persistable = True
if program is None: if program is None:
program = fluid.default_main_program() program = fluid.default_main_program()
...@@ -578,6 +587,9 @@ def get_static_double_grad(x, ...@@ -578,6 +587,9 @@ def get_static_double_grad(x,
for v in x: for v in x:
v.stop_gradient = False v.stop_gradient = False
v.persistable = True v.persistable = True
for u in y:
u.stop_gradient = False
u.persistable = True
if place is None: if place is None:
place = fluid.CPUPlace() place = fluid.CPUPlace()
if program is None: if program is None:
...@@ -736,7 +748,9 @@ def double_grad_check_for_dygraph(func, ...@@ -736,7 +748,9 @@ def double_grad_check_for_dygraph(func,
v.stop_gradient = False v.stop_gradient = False
v.persistable = True v.persistable = True
y = _as_list(y) y = _as_list(y)
for u in y:
u.stop_gradient = False
u.persistable = True
y_grads_init = [] y_grads_init = []
for yi in y: for yi in y:
np_type = dtype_to_np_dtype(yi.dtype) np_type = dtype_to_np_dtype(yi.dtype)
...@@ -903,7 +917,9 @@ def triple_grad_check_for_dygraph(func, ...@@ -903,7 +917,9 @@ def triple_grad_check_for_dygraph(func,
v.stop_gradient = False v.stop_gradient = False
v.persistable = True v.persistable = True
y = _as_list(y) y = _as_list(y)
for u in y:
u.stop_gradient = False
u.persistable = True
y_grads_init = [] y_grads_init = []
for yi in y: for yi in y:
np_type = dtype_to_np_dtype(yi.dtype) np_type = dtype_to_np_dtype(yi.dtype)
......
...@@ -23,6 +23,9 @@ import paddle.fluid as fluid ...@@ -23,6 +23,9 @@ import paddle.fluid as fluid
from paddle.fluid import compiler, Program, program_guard from paddle.fluid import compiler, Program, program_guard
from op_test import OpTest, convert_uint16_to_float, convert_float_to_uint16 from op_test import OpTest, convert_uint16_to_float, convert_float_to_uint16
from paddle.fluid.framework import _test_eager_guard from paddle.fluid.framework import _test_eager_guard
import gradient_checker
from decorator_helper import prog_scope
import paddle.fluid.layers as layers
class TestCastOpFp32ToFp64(OpTest): class TestCastOpFp32ToFp64(OpTest):
...@@ -137,6 +140,80 @@ class TestCastOpEager(unittest.TestCase): ...@@ -137,6 +140,80 @@ class TestCastOpEager(unittest.TestCase):
self.assertTrue(x.gradient().dtype == np.float16) self.assertTrue(x.gradient().dtype == np.float16)
class TestCastDoubleGradCheck(unittest.TestCase):
def cast_wrapper(self, x):
return paddle.cast(x[0], 'float64')
@prog_scope()
def func(self, place):
# the shape of input variable should be clearly specified, not inlcude -1.
eps = 0.005
dtype = np.float32
data = layers.data('data', [2, 3, 4], False, dtype)
data.persistable = True
out = paddle.cast(data, 'float64')
data_arr = np.random.uniform(-1, 1, data.shape).astype(dtype)
gradient_checker.double_grad_check([data],
out,
x_init=[data_arr],
place=place,
eps=eps)
fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
gradient_checker.double_grad_check_for_dygraph(self.cast_wrapper,
[data],
out,
x_init=[data_arr],
place=place)
def test_grad(self):
paddle.enable_static()
places = [fluid.CPUPlace()]
if core.is_compiled_with_cuda():
places.append(fluid.CUDAPlace(0))
for p in places:
self.func(p)
class TestCastTripleGradCheck(unittest.TestCase):
def cast_wrapper(self, x):
return paddle.cast(x[0], 'float64')
@prog_scope()
def func(self, place):
# the shape of input variable should be clearly specified, not inlcude -1.
eps = 0.005
dtype = np.float32
data = layers.data('data', [2, 3, 4], False, dtype)
data.persistable = True
out = paddle.cast(data, 'float64')
data_arr = np.random.uniform(-1, 1, data.shape).astype(dtype)
gradient_checker.triple_grad_check([data],
out,
x_init=[data_arr],
place=place,
eps=eps)
fluid.set_flags({"FLAGS_retain_grad_for_all_tensor": True})
gradient_checker.triple_grad_check_for_dygraph(self.cast_wrapper,
[data],
out,
x_init=[data_arr],
place=place)
def test_grad(self):
paddle.enable_static()
places = [fluid.CPUPlace()]
if core.is_compiled_with_cuda():
places.append(fluid.CUDAPlace(0))
for p in places:
self.func(p)
if __name__ == '__main__': if __name__ == '__main__':
paddle.enable_static() paddle.enable_static()
unittest.main() unittest.main()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册