最近需要把HuggingFace上的Pytorch模型转换成Paddle的模型,总体思路是,只需要做一些小的映射就行了。下面我提供一个通用的示例,方便大家平时自己转模型和代码,主要思路就是对其中的Linear进行转置就可以了。
import argparse
from collections import OrderedDict
import paddle
import torch
dont_transpose = [
"layernorm.weight",
"_embeddings.weight",
]
def convert_pytorch_checkpoint_to_paddle(pytorch_checkpoint_path: str, paddle_dump_path: str):
pytorch_state_dict = torch.load(pytorch_checkpoint_path, map_location="cpu")
paddle_state_dict = OrderedDict()
for k, v in pytorch_state_dict.items():
transpose = False
if k[-7:] == ".weight":
if not any([w in k for w in dont_transpose]):
if v.ndim == 2:
v = v.transpose(0, 1)
transpose = True
print(f"Converting: {k} | is_transpose {transpose}")
paddle_state_dict[k] = v.data.numpy()
paddle.save(paddle_state_dict, paddle_dump_path)
有的pytorch模型可能有多个bin文件,因此需要进行合并,合并其实就是把多个文件的key合并成一个,如果有这方面的需求可以参考(以chatglm-6b为例):
import glob
import paddle
model_checkpoints = glob.glob('paddle/chatglm-6b/*.pdparams')
state_dict = {}
for model_path in model_checkpoints:
model = paddle.load(model_path)
state_dict.update(model)
paddle.save(state_dict,'chatglm-6b-pd/model_state.pdparams')
有的人会说模型的代码需要怎么变呢?其实只需要把Torch对应的API替换成PaddlePaddle的API就行了,不用做过多的改变,注意一些写法的区别,可以参考文档pytorch-1-8-paddle-2-0-api,可能不是很完善,如果没有找到对应的映射,就需要分别查torch和PaddlePaddle的文档进行比对了。