Files
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

73 lines
2.7 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 numpy as np
import paddle
import unittest
from paddlenlp_ops import rebuild_padding_v2
np.random.seed(2024)
class GetRebuildPaddingV2Test(unittest.TestCase):
def test_rebuild_padding_v2(self):
max_len = 10
seq_lens = np.array([4, 3, 6], "int32").reshape(-1, 1)
seq_lens_decoder = np.zeros_like(seq_lens).astype("int32")
cum_offsets = np.insert(np.cumsum((max_len - seq_lens).flatten(), -1, "int32"),0,0)[:-1]
token_num = np.sum(seq_lens)
bs = seq_lens.shape[0]
dim_emb = 129
tmp_out = np.random.random((token_num, dim_emb)).astype("float16")
# print("tmp_out:\n", paddle.to_tensor(tmp_out))
# print("cum_offsets:\n", paddle.to_tensor(cum_offsets))
# print("seq_lens_decoder:\n", paddle.to_tensor(seq_lens_decoder))
# print("seq_lens:\n", paddle.to_tensor(seq_lens))
out = rebuild_padding_v2(
paddle.to_tensor(tmp_out),
paddle.to_tensor(cum_offsets),
paddle.to_tensor(seq_lens_decoder),
paddle.to_tensor(seq_lens),
max_len
)
def rebuild_padding_cpu(tmp_out, cum_offsets, seq_lens_decoder, seq_len_encoder, max_len):
bs = seq_lens.shape[0]
dim_emb = tmp_out.shape[1]
output_data = np.zeros((bs, dim_emb)).flatten()
seq_len = max_len
tmp_out = tmp_out.flatten()
for i in range(bs*dim_emb):
bi = i // dim_emb
bias_idx = i % dim_emb
seq_id = 0
# just encoder or stop, get last token; just decoder, get first token.
if (seq_lens_decoder[bi] == 0):
if seq_len_encoder[bi] != 0:
seq_id = seq_len_encoder[bi] - 1
else:
continue
ori_token_idx = bi * seq_len - cum_offsets[bi] + seq_id
src_offset = ori_token_idx * dim_emb + bias_idx
output_data[i] = tmp_out[src_offset]
return output_data.reshape(bs, dim_emb)
out_ = rebuild_padding_cpu(tmp_out, cum_offsets, seq_lens_decoder, seq_lens, max_len)
np.testing.assert_allclose(out.numpy(), out_, atol=1e-05, rtol=1e-05)
if __name__ == '__main__':
unittest.main()