95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
# Copyright (c) 2022 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 os
|
|
import tempfile
|
|
from unittest import TestCase
|
|
|
|
import numpy as np
|
|
import paddle
|
|
from huggingface_hub import hf_hub_download
|
|
from parameterized import parameterized
|
|
|
|
from paddlenlp.utils import load_torch
|
|
from tests.testing_utils import require_package
|
|
|
|
|
|
class SerializationTest(TestCase):
|
|
@parameterized.expand(
|
|
[
|
|
"float32",
|
|
"float16",
|
|
"bfloat16",
|
|
]
|
|
)
|
|
@require_package("torch")
|
|
def test_simple_load(self, dtype: str):
|
|
import torch
|
|
|
|
# torch "normal_kernel_cpu" not implemented for 'Char', 'Int', 'Long', so only support float
|
|
dtype_mapping = {
|
|
"float32": torch.float32,
|
|
"float16": torch.float16,
|
|
"bfloat16": torch.bfloat16, # test bfloat16
|
|
}
|
|
dtype = dtype_mapping[dtype]
|
|
|
|
with tempfile.TemporaryDirectory() as tempdir:
|
|
weight_file_path = os.path.join(tempdir, "pytorch_model.bin")
|
|
torch.save(
|
|
{
|
|
"a": torch.randn(2, 3, dtype=dtype),
|
|
"b": torch.randn(3, 4, dtype=dtype),
|
|
"a_parameter": torch.nn.Parameter(torch.randn(2, 3, dtype=dtype)), # test torch.nn.Parameter
|
|
"b_parameter": torch.nn.Parameter(torch.randn(3, 4, dtype=dtype)),
|
|
},
|
|
weight_file_path,
|
|
)
|
|
numpy_data = load_torch(weight_file_path)
|
|
torch_data = torch.load(weight_file_path)
|
|
|
|
for key, arr in numpy_data.items():
|
|
assert np.allclose(
|
|
paddle.to_tensor(arr).cast("float32").cpu().numpy(),
|
|
torch_data[key].detach().cpu().to(torch.float32).numpy(),
|
|
)
|
|
|
|
@parameterized.expand(
|
|
[
|
|
"hf-internal-testing/tiny-random-codegen",
|
|
"hf-internal-testing/tiny-random-Data2VecTextModel",
|
|
"hf-internal-testing/tiny-random-SwinModel",
|
|
]
|
|
)
|
|
@require_package("torch")
|
|
def test_load_bert_model(self, repo_id):
|
|
import torch
|
|
|
|
with tempfile.TemporaryDirectory() as tempdir:
|
|
weight_file = hf_hub_download(
|
|
repo_id=repo_id,
|
|
filename="pytorch_model.bin",
|
|
cache_dir=tempdir,
|
|
library_name="PaddleNLP",
|
|
)
|
|
torch_weight = torch.load(weight_file)
|
|
torch_weight = {key: value for key, value in torch_weight.items()}
|
|
paddle_weight = load_torch(weight_file)
|
|
|
|
for key, arr in paddle_weight.items():
|
|
assert np.allclose(
|
|
arr,
|
|
torch_weight[key].numpy(),
|
|
)
|