Files
paddlepaddle--paddlenlp/tests/mergekit/test_sparsify_method.py
T
wehub-resource-sync 2aaeece67c
Codestyle Check / Lint (push) Has been cancelled
Codestyle Check / Check bypass (push) Has been cancelled
Pipelines-Test / Pipelines-Test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:37:14 +08:00

139 lines
6.2 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.
import unittest
import numpy as np
import paddle
from paddlenlp.mergekit import MergeConfig, SparsifyMethod
class TestSparsifyMethod(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.tensor = np.array(
[
[-0.834894061088562, 0.7672924399375916, -0.981352686882019, 0.8236614465713501, 0.19363074004650116],
[
0.7413361668586731,
-0.44731196761131287,
0.9544159173965454,
0.07453861087560654,
0.5572543144226074,
],
[
0.9128026962280273,
-0.23344580829143524,
0.8464474678039551,
0.14241063594818115,
-0.8475964069366455,
],
[0.598555326461792, 0.9459332823753357, -0.35118913650512695, 0.5437421798706055, 0.6906668543815613],
],
dtype="float32",
)
def test_none(self):
merge_config = MergeConfig(sparsify_type=None)
sparsify_method = SparsifyMethod(merge_config=merge_config)
sparsify_tensor = sparsify_method.sparsify(self.tensor.copy())
self.assertEqual(sparsify_tensor.shape, (4, 5))
self.assertTrue(np.array_equal(sparsify_tensor, self.tensor))
def test_dare(self):
np.random.seed(42)
merge_config = MergeConfig(sparsify_type="dare", rescale=True, reserve_p=0.7)
sparsify_method = SparsifyMethod(merge_config=merge_config)
sparsify_tensor = sparsify_method.sparsify(self.tensor.copy())
self.assertEqual(sparsify_tensor.shape, (4, 5))
def test_magprune(self):
np.random.seed(42)
merge_config = MergeConfig(sparsify_type="magprune", rescale=True, reserve_p=0.7)
sparsify_method = SparsifyMethod(merge_config=merge_config)
sparsify_tensor = sparsify_method.sparsify(self.tensor.copy())
self.assertEqual(sparsify_tensor.shape, (4, 5))
def test_trim(self):
np.random.seed(42)
merge_config = MergeConfig(sparsify_type="trim", rescale=True, reserve_p=0.7)
sparsify_method = SparsifyMethod(merge_config=merge_config)
sparsify_tensor = sparsify_method.sparsify(self.tensor.copy())
self.assertEqual(sparsify_tensor.shape, (4, 5))
expected_result = np.array(
[
[-0.9439255595207214, 0.867495596408844, -1.1095106601715088, 0.9312260150909424, 0.0],
[0.8381496071815491, 0.0, 1.0790561437606812, 0.0, 0.6300279498100281],
[1.0320085287094116, 0.0, 0.956987738609314, 0.0, -0.958286702632904],
[0.6767225861549377, 1.0694657564163208, 0.0, 0.6147512197494507, 0.7808632254600525],
],
dtype="float32",
)
self.assertTrue(np.array_equal(sparsify_tensor, expected_result))
@classmethod
def to_paddle_tensor(cls, numpy_tensor):
"""Convert a numpy array to a paddle tensor."""
return paddle.to_tensor(numpy_tensor, dtype="float32")
def test_none_paddle(self):
paddle_tensor = self.to_paddle_tensor(self.tensor)
merge_config = MergeConfig(sparsify_type=None, tensor_type="pd")
sparsify_method = SparsifyMethod(merge_config=merge_config)
sparsify_tensor = sparsify_method.sparsify(paddle_tensor)
self.assertEqual(sparsify_tensor.shape, paddle_tensor.shape)
self.assertTrue(
paddle.allclose(sparsify_tensor, paddle_tensor, atol=1e-6),
"Paddle tensor sparsify (none) failed to match input tensor.",
)
def test_dare_paddle(self):
paddle.seed(42) # Fix random seed for reproducibility
paddle_tensor = self.to_paddle_tensor(self.tensor)
merge_config = MergeConfig(sparsify_type="dare", rescale=True, reserve_p=0.7, tensor_type="pd")
sparsify_method = SparsifyMethod(merge_config=merge_config)
sparsify_tensor = sparsify_method.sparsify(paddle_tensor)
self.assertEqual(sparsify_tensor.shape, paddle_tensor.shape)
def test_magprune_paddle(self):
paddle.seed(42) # Fix random seed for reproducibility
paddle_tensor = self.to_paddle_tensor(self.tensor)
merge_config = MergeConfig(sparsify_type="magprune", rescale=True, reserve_p=0.7, tensor_type="pd")
sparsify_method = SparsifyMethod(merge_config=merge_config)
sparsify_tensor = sparsify_method.sparsify(paddle_tensor)
self.assertEqual(sparsify_tensor.shape, paddle_tensor.shape)
def test_trim_paddle(self):
paddle.seed(42) # Fix random seed for reproducibility
paddle_tensor = self.to_paddle_tensor(self.tensor)
merge_config = MergeConfig(sparsify_type="trim", rescale=True, reserve_p=0.7, tensor_type="pd")
sparsify_method = SparsifyMethod(merge_config=merge_config)
sparsify_tensor = sparsify_method.sparsify(paddle_tensor)
self.assertEqual(sparsify_tensor.shape, paddle_tensor.shape)
expected_result = paddle.to_tensor(
[
[-0.9439255595207214, 0.867495596408844, -1.1095106601715088, 0.9312260150909424, 0.0],
[0.8381496071815491, 0.0, 1.0790561437606812, 0.0, 0.6300279498100281],
[1.0320085287094116, 0.0, 0.956987738609314, 0.0, -0.958286702632904],
[0.6767225861549377, 1.0694657564163208, 0.0, 0.6147512197494507, 0.7808632254600525],
],
dtype="float32",
)
self.assertTrue(
paddle.allclose(sparsify_tensor, expected_result, atol=1e-6),
"Paddle tensor sparsify (trim) result does not match expected result.",
)