[PaddlePaddle]HuggingFace上的Pytorch模型转PaddlePaddle模型示例

文章提供了一种将HuggingFace上的Pytorch模型转换为Paddle模型的方法,主要涉及模型权重的转置和API替换。转换过程中,对Linear层的权重进行转置,并展示了如何合并多个Paddle模型的bin文件。代码示例包括加载Pytorch模型,转换权重,保存Paddle模型,以及处理多文件合并的情况。对于模型代码,只需将TorchAPI替换为PaddlePaddle的相应API即可。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近需要把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的文档进行比对了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值