From 1b11b8f424372c060af7c38c63e2103999d9bdd3 Mon Sep 17 00:00:00 2001 From: cyberslack_lee Date: Sat, 6 May 2023 13:59:47 +0800 Subject: [PATCH] Add Op UnitTest for Cast (#1381) * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix --- python/tests/ops/test_cast_op.py | 123 +++++++++++++++++++++++-------- 1 file changed, 91 insertions(+), 32 deletions(-) diff --git a/python/tests/ops/test_cast_op.py b/python/tests/ops/test_cast_op.py index 8665f58e0e..16ac8c2886 100644 --- a/python/tests/ops/test_cast_op.py +++ b/python/tests/ops/test_cast_op.py @@ -17,6 +17,7 @@ import unittest import numpy as np from op_test import OpTest, OpTestTool +from op_test_helper import TestCaseHelper import paddle import cinn from cinn.frontend import * @@ -27,15 +28,16 @@ "x86 test will be skipped due to timeout.") class TestCastOp(OpTest): def setUp(self): - self.init_case() + print(f"\nRunning {self.__class__.__name__}: {self.case}") + self.prepare_inputs() - def init_case(self): - self.inputs = {"x": self.random([10201, 50], "float32", 1, 10)} - self.dtype = "int64" + def prepare_inputs(self): + self.x_np = self.random( + shape=self.case["x_shape"], dtype=self.case["x_dtype"]) def build_paddle_program(self, target): - x = paddle.to_tensor(self.inputs["x"], stop_gradient=True) - out = paddle.cast(x, self.dtype) + x = paddle.to_tensor(self.x_np, stop_gradient=True) + out = paddle.cast(x, self.case["d_dtype"]) self.paddle_outputs = [out] @@ -44,37 +46,94 @@ def build_paddle_program(self, target): def build_cinn_program(self, target): builder = NetBuilder("cast") x = builder.create_input( - self.nptype2cinntype(self.inputs["x"].dtype), - self.inputs["x"].shape, "x") - out = builder.cast(x, self.dtype) + self.nptype2cinntype(self.case["x_dtype"]), self.case["x_shape"], + "x") + out = builder.cast(x, self.case["d_dtype"]) prog = builder.build() - res = self.get_cinn_output(prog, target, [x], [self.inputs["x"]], - [out]) + res = self.get_cinn_output(prog, target, [x], [self.x_np], [out]) - self.cinn_outputs = res + self.cinn_outputs = [res[0]] def test_check_results(self): - self.check_outputs_and_grads(all_equal=True) - - -class TestCastCase1(TestCastOp): - def init_case(self): - self.inputs = {"x": self.random([10201, 50], "float32", 1, 10)} - self.dtype = "float32" - - -class TestCastCase2(TestCastOp): - def init_case(self): - self.inputs = {"x": self.random([32, 64], "int32", 1, 10)} - self.dtype = "uint8" - - -class TestCastCase3(TestCastOp): - def init_case(self): - self.inputs = {"x": self.random([32, 64], "uint8", 1, 10)} - self.dtype = "int32" + max_relative_error = self.case[ + "max_relative_error"] if "max_relative_error" in self.case else 1e-5 + self.check_outputs_and_grads(max_relative_error=max_relative_error) + + +class TestCastAll(TestCaseHelper): + def init_attrs(self): + self.class_name = "TestCastOpCase" + self.cls = TestCastOp + self.inputs = [ + { + "x_shape": [1], + }, + { + "x_shape": [1024], + }, + { + "x_shape": [32, 64], + }, + { + "x_shape": [16, 8, 4, 2], + }, + ] + self.dtypes = [ + { + "x_dtype": "bool", + }, + { + "x_dtype": "int8", + }, + { + "x_dtype": "int16" + }, + { + "x_dtype": "int32", + }, + { + "x_dtype": "int64" + }, + { + "x_dtype": "float16", + "max_relative_error": 1e-3 + }, + { + "x_dtype": "float32", + }, + { + "x_dtype": "float64", + }, + ] + self.attrs = [ + { + "d_dtype": "bool", + }, + { + "d_dtype": "int8", + }, + { + "d_dtype": "int16" + }, + { + "d_dtype": "int32", + }, + { + "d_dtype": "int64" + }, + { + "d_dtype": "float16", + "max_relative_error": 1e-3 + }, + { + "d_dtype": "float32", + }, + { + "d_dtype": "float64", + }, + ] if __name__ == "__main__": - unittest.main() + TestCastAll().run()