Files
paddlepaddle--paddle/test/sot/test_faster_guard.py
T
2026-07-13 12:40:42 +08:00

280 lines
12 KiB
Python

# Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations
import unittest
from collections import OrderedDict
import numpy as np
import paddle
class TestBasicFasterGuard(unittest.TestCase):
def test_lambda_guard(self):
guard_lambda = paddle.framework.core.LambdaGuard(lambda x: x == 1)
self.assertTrue(guard_lambda.check(1))
self.assertFalse(guard_lambda.check(2))
def test_type_match_guard(self):
guard_int = paddle.framework.core.TypeMatchGuard(int)
guard_str = paddle.framework.core.TypeMatchGuard(str)
guard_list = paddle.framework.core.TypeMatchGuard(list)
self.assertTrue(guard_int.check(1))
self.assertFalse(guard_int.check("1"))
self.assertTrue(guard_str.check("1"))
self.assertFalse(guard_str.check(1))
self.assertTrue(guard_list.check([1]))
self.assertFalse(guard_list.check(1))
def test_isinstance_match_guard(self):
guard_int = paddle.framework.core.InstanceCheckGuard(int)
guard_str = paddle.framework.core.InstanceCheckGuard(str)
guard_list = paddle.framework.core.InstanceCheckGuard(list)
guard_int_bool = paddle.framework.core.InstanceCheckGuard((int, bool))
guard_int_str = paddle.framework.core.InstanceCheckGuard((int, str))
self.assertTrue(guard_int.check(1))
self.assertFalse(guard_int.check("1"))
self.assertTrue(guard_str.check("1"))
self.assertFalse(guard_str.check(1))
self.assertTrue(guard_list.check([1]))
self.assertFalse(guard_list.check(1))
self.assertTrue(guard_int_bool.check(1))
self.assertTrue(guard_int_bool.check(True))
self.assertFalse(guard_int_bool.check("1"))
self.assertTrue(guard_int_str.check(1))
self.assertTrue(guard_int_str.check("1"))
self.assertTrue(guard_int_str.check(True))
self.assertFalse(guard_int_str.check([1]))
def test_value_match_guard(self):
guard_value = paddle.framework.core.ValueMatchGuard(1)
guard_container_value = paddle.framework.core.ValueMatchGuard([1])
self.assertTrue(guard_value.check(1))
self.assertFalse(guard_value.check(2))
self.assertTrue(guard_container_value.check([1]))
self.assertFalse(guard_container_value.check([2]))
def test_length_match_guard(self):
guard_length = paddle.framework.core.LengthMatchGuard(1)
# list
self.assertTrue(guard_length.check([1]))
self.assertFalse(guard_length.check([1, 2]))
# dict
order_dict = OrderedDict()
order_dict[1] = 2
self.assertTrue(guard_length.check(order_dict))
self.assertTrue(guard_length.check({1: 2}))
# tuple
self.assertTrue(guard_length.check((1,)))
self.assertFalse(guard_length.check((1, 2)))
def test_dtype_match_guard(self):
guard_dtype = paddle.framework.core.DtypeMatchGuard(paddle.int32)
self.assertTrue(
guard_dtype.check(paddle.to_tensor(1, dtype=paddle.int32))
)
self.assertFalse(
guard_dtype.check(paddle.to_tensor(1, dtype=paddle.float32))
)
def test_shape_match_guard(self):
tensor = paddle.randn([2, 3])
guard_shape = paddle.framework.core.ShapeMatchGuard([2, 3], 0)
self.assertTrue(guard_shape.check(tensor))
guard_shape = paddle.framework.core.ShapeMatchGuard([2, None], 0)
self.assertTrue(guard_shape.check(tensor))
guard_shape = paddle.framework.core.ShapeMatchGuard([3, 2], 0)
self.assertFalse(guard_shape.check(tensor))
guard_shape = paddle.framework.core.ShapeMatchGuard([2, 3, 1], 0)
self.assertFalse(guard_shape.check(tensor))
guard_shape = paddle.framework.core.ShapeMatchGuard([2, None], 2)
self.assertTrue(guard_shape.check(paddle.randn([2, 2])))
guard_shape = paddle.framework.core.ShapeMatchGuard([2, None], 2)
self.assertFalse(guard_shape.check(paddle.randn([2, 1])))
def test_attribute_match_guard(self):
a = range(1, 10, 2)
guard_attribute = paddle.framework.core.AttributeMatchGuard(a, "start")
self.assertTrue(guard_attribute.check(a))
self.assertFalse(guard_attribute.check(range(10)))
def test_layer_match_guard(self):
layer = paddle.nn.Linear(10, 10)
guard_layer = paddle.framework.core.LayerMatchGuard(layer)
self.assertTrue(guard_layer.check(layer))
self.assertFalse(guard_layer.check(paddle.nn.Linear(10, 10)))
layer.eval()
self.assertFalse(guard_layer.check(layer))
layer.train()
self.assertTrue(guard_layer.check(layer))
def test_id_match_guard(self):
layer = paddle.nn.Linear(10, 10)
guard_id = paddle.framework.core.IdMatchGuard(layer)
self.assertTrue(guard_id.check(layer))
layer.eval()
self.assertTrue(guard_id.check(layer))
self.assertFalse(guard_id.check(paddle.nn.Linear(10, 10)))
def test_numpy_dtype_match_guard(self):
np_array = np.array(1, dtype=np.int32)
guard_numpy_dtype = paddle.framework.core.NumPyDtypeMatchGuard(
np_array.dtype
)
self.assertTrue(guard_numpy_dtype.check(np_array))
self.assertTrue(guard_numpy_dtype.check(np.array(1, dtype=np.int32)))
self.assertTrue(guard_numpy_dtype.check(np.int32()))
self.assertFalse(guard_numpy_dtype.check(np.array(1, dtype=np.int64)))
self.assertFalse(guard_numpy_dtype.check(np.float32()))
self.assertFalse(guard_numpy_dtype.check(np.bool_()))
np_bool = np.bool_(1)
guard_numpy_bool_dtype = paddle.framework.core.NumPyDtypeMatchGuard(
np_bool.dtype
)
self.assertTrue(guard_numpy_bool_dtype.check(np.bool_()))
self.assertTrue(
guard_numpy_bool_dtype.check(np.array(1, dtype=np.bool_))
)
def test_numpu_array_shape_match_guard(self):
np_array = np.array([1, 2])
guard_numpy_array_shape = (
paddle.framework.core.NumPyArrayShapeMatchGuard(np_array.shape, 0)
)
self.assertTrue(guard_numpy_array_shape.check(np_array))
self.assertTrue(
guard_numpy_array_shape.check(np.array([1, 2], dtype=np.int32))
)
self.assertTrue(guard_numpy_array_shape.check(np.array([3, 4])))
self.assertTrue(
guard_numpy_array_shape.check(np.array([3, 4], dtype=np.float32))
)
self.assertFalse(guard_numpy_array_shape.check(np.array([[1], [2]])))
self.assertFalse(guard_numpy_array_shape.check(np.array([1, 2, 3])))
np_array = np.array([1, None])
guard_numpy_array_shape = (
paddle.framework.core.NumPyArrayShapeMatchGuard(np_array.shape, 0)
)
self.assertTrue(guard_numpy_array_shape.check(np_array))
self.assertTrue(guard_numpy_array_shape.check(np.array([2, 3])))
self.assertFalse(guard_numpy_array_shape.check(np.array([2, 3, 4])))
np_array = np.array(1)
guard_numpy_array_shape = (
paddle.framework.core.NumPyArrayShapeMatchGuard(np_array.shape, 0)
)
self.assertTrue(guard_numpy_array_shape.check(np_array))
self.assertTrue(
guard_numpy_array_shape.check(np.array(2, dtype=np.int32))
)
self.assertTrue(
guard_numpy_array_shape.check(np.array(3, dtype=np.float32))
)
self.assertFalse(guard_numpy_array_shape.check(np.array([1])))
def test_numpy_array_match_guard(self):
np_array = paddle.framework.core.NumPyArrayValueMatchGuard(
np.array([1, 2, 3])
)
self.assertTrue(np_array.check(np.array([1, 2, 3])))
self.assertFalse(np_array.check(np.array([4, 5, 6])))
np_array_all_one = paddle.framework.core.NumPyArrayValueMatchGuard(
np.array([1, 1, 1])
)
self.assertTrue(np_array_all_one.check(np.array([1, 1, 1])))
self.assertFalse(np_array_all_one.check(np.array([1, 2, 3])))
self.assertTrue(np_array_all_one.check(np.array([1, 1, 1], dtype=bool)))
self.assertTrue(np_array_all_one.check(np.array([True, True, True])))
self.assertTrue(np_array_all_one.check(np.array([1, 1, 1], dtype=int)))
np_bool_array = paddle.framework.core.NumPyArrayValueMatchGuard(
np.array([True, False, True])
)
self.assertTrue(np_bool_array.check(np.array([True, False, True])))
self.assertFalse(np_bool_array.check(np.array([True, True, True])))
self.assertFalse(np_bool_array.check(np.array([False, False, False])))
self.assertFalse(np_bool_array.check(np.array([1, 2, 3])))
self.assertTrue(np_bool_array.check(np.array([True, False, 1])))
self.assertFalse(np_bool_array.check(np.array([1, 2, 3], dtype=bool)))
self.assertFalse(np_bool_array.check(np.array([1, 2, 3], dtype=int)))
np_bool_array_all_true = (
paddle.framework.core.NumPyArrayValueMatchGuard(
np.array([True, True, True])
)
)
self.assertTrue(
np_bool_array_all_true.check(np.array([True, True, True]))
)
self.assertFalse(
np_bool_array_all_true.check(np.array([True, False, True]))
)
self.assertFalse(
np_bool_array_all_true.check(np.array([False, False, False]))
)
self.assertFalse(np_bool_array_all_true.check(np.array([1, 2, 3])))
self.assertTrue(np_bool_array_all_true.check(np.array([True, True, 1])))
def test_object_match_guard(self):
def test_func():
return 1 + 1
guard_object = paddle.framework.core.WeakRefMatchGuard(test_func)
self.assertTrue(guard_object.check(test_func))
self.assertFalse(guard_object.check(lambda x: x == 1))
self.assertFalse(guard_object.check(1))
self.assertFalse(guard_object.check("1"))
def test_is_dense_tensor_hold_allocation(self):
tensor = paddle.to_tensor([1, 2, 3])
guard = paddle.framework.core.IsNotDenseTensorHoldAllocationMatchGuard()
self.assertEqual(
guard.check(tensor), not tensor._is_dense_tensor_hold_allocation()
)
class TestFasterGuardGroup(unittest.TestCase):
def test_guard_group(self):
guard_lambda = paddle.framework.core.LambdaGuard(lambda x: x == 1)
guard_type_match = paddle.framework.core.TypeMatchGuard(int)
guard_group = paddle.framework.core.GuardGroup(
[guard_type_match, guard_lambda] * 10
)
self.assertTrue(guard_group.check(1))
self.assertFalse(guard_group.check(2))
def test_nested_guard_group(self):
guard_lambda = paddle.framework.core.LambdaGuard(lambda x: x == 1)
guard_type_match = paddle.framework.core.TypeMatchGuard(int)
guard_group = paddle.framework.core.GuardGroup(
[guard_type_match, guard_lambda]
)
for _ in range(10):
guard_group = paddle.framework.core.GuardGroup(
[guard_group, guard_type_match, guard_lambda]
)
self.assertTrue(guard_group.check(1))
self.assertFalse(guard_group.check(2))
if __name__ == "__main__":
unittest.main()