Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

paddle 预训练模型转tensorflow,pytorch #37

Closed
wq343580510 opened this issue Mar 18, 2019 · 13 comments
Closed

paddle 预训练模型转tensorflow,pytorch #37

wq343580510 opened this issue Mar 18, 2019 · 13 comments

Comments

@wq343580510
Copy link

请问应该怎么把预训练的模型参数转换成其他框架,这样是不是让人能更快上手。试了一下load_param,然后gloab_block()里面也没有参数,load居然返回None,加载的参数保存在哪,文档写的也不清楚,这种设计模式是真的没谁了,load模型参数的过程中,如果出错都不会报错的。

@chqiwang
Copy link

同问怎么把paddle存的二进制参数文件还原成numpy矩阵

@bfjia1
Copy link

bfjia1 commented Mar 18, 2019

paddlepaddle provides the script to convert the tf model to paddlepadlle
https://github.com/PaddlePaddle/X2Paddle
so anyone can convert paddle model to tensorflow?

@wq343580510
Copy link
Author

链接:https://pan.baidu.com/s/1AGTOEKmPTogjzUiUpcP0nw 密码:z51a
已转成numpy,拿走不谢,模型300多M, 使用joblib序列化保存,使用方式

import joblib
params = joblib.load('model.dct')
以下是转化的脚本代码

import paddle.fluid as fluid
import joblib
from model.ernie import ErnieConfig
from finetune.classifier import create_model
import numpy as np
import os
import argparse


# import joblib
# params = joblib.load('model.dct')

parser = argparse.ArgumentParser()
parser.add_argument("--init_pretraining_params", default='/Users/qiwang/github-star/paddle/params', type=str, help=".")
parser.add_argument("--ernie_config_path", default='./config/ernie_config.json', type=str, help=".")
parser.add_argument("--max_seq_len", default=10, type=int, help=".")
parser.add_argument("--num_labels", default=2, type=int, help=".")
parser.add_argument("--use_fp16", type=bool, default=False, help="Whether to use fp16 mixed precision training.")
parser.add_argument("--loss_scaling",  type=float,  default=1.0, help="only valid when use_fp16 is enabled.")
startup_prog = fluid.Program()
test_prog = fluid.Program()

place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(startup_prog)

args = parser.parse_args()

ernie_config = ErnieConfig(args.ernie_config_path)
ernie_config.print_config()

with fluid.program_guard(test_prog, startup_prog):
    with fluid.unique_name.guard():
        train_pyreader, graph_vars = create_model(
            args,
            pyreader_name='train_reader',
            ernie_config=ernie_config)

def if_exist(var):
    #print(var.name)
    return os.path.exists(os.path.join(args.init_pretraining_params,var.name))

fluid.io.load_vars(exe, args.init_pretraining_params, main_program=test_prog, predicate=if_exist)
var_dict = {}
for var in startup_prog.list_vars():
    if os.path.exists(os.path.join(args.init_pretraining_params,var.name)):
    #if ( 'encoder' in var.name or 'embedding' in var.name ) and 'tmp' not in var.name:
    #if 'tmp' not in var.name:
        fluid_tensor = fluid.global_scope().find_var(var.name).get_tensor()
        print(var.name, np.array(fluid_tensor).shape)
        var_dict[var.name] = np.array(fluid_tensor)

joblib.dump(var_dict,'model.dct')

@kuke
Copy link

kuke commented Mar 19, 2019

@wq343580510 谢谢

我们暂时没有支持 PaddlePaddle 模型转其它框架模型的计划,PaddlePaddle 定位于简单易用,推荐你直接使用 Paddle Fluid 来运行 ERNIE/BERT。

TO ALL:

对于用 TensorFlow 训练的 BERT模型,我们已提供了脚本转换成 Paddle Fluid 模型,请参考这里

关于 Paddle Fluid 加载模型参数,目前已有相关文档可供参考。load_params()等接口本身的返回是None,加载模型后,参数存储在模型运行的 scope 里面,传入的参数main_program 描述了模型结构, 关于如何根据 main_program 获取参数列表,在PaddlePaddle/models下也有不少示例可供参考,同样也可以根据参数名从 scope 中获取参数对应的numpy对象,我们会尽快加强相关的文档建设。

@chqiwang
Copy link

链接:https://pan.baidu.com/s/1AGTOEKmPTogjzUiUpcP0nw 密码:z51a
已转成numpy,拿走不谢,模型300多M, 使用joblib序列化保存,使用方式

import joblib
params = joblib.load('model.dct')
以下是转化的脚本代码

import paddle.fluid as fluid
import joblib
from model.ernie import ErnieConfig
from finetune.classifier import create_model
import numpy as np
import os
import argparse


# import joblib
# params = joblib.load('model.dct')

parser = argparse.ArgumentParser()
parser.add_argument("--init_pretraining_params", default='/Users/qiwang/github-star/paddle/params', type=str, help=".")
parser.add_argument("--ernie_config_path", default='./config/ernie_config.json', type=str, help=".")
parser.add_argument("--max_seq_len", default=10, type=int, help=".")
parser.add_argument("--num_labels", default=2, type=int, help=".")
parser.add_argument("--use_fp16", type=bool, default=False, help="Whether to use fp16 mixed precision training.")
parser.add_argument("--loss_scaling",  type=float,  default=1.0, help="only valid when use_fp16 is enabled.")
startup_prog = fluid.Program()
test_prog = fluid.Program()

place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(startup_prog)

args = parser.parse_args()

ernie_config = ErnieConfig(args.ernie_config_path)
ernie_config.print_config()

with fluid.program_guard(test_prog, startup_prog):
    with fluid.unique_name.guard():
        train_pyreader, graph_vars = create_model(
            args,
            pyreader_name='train_reader',
            ernie_config=ernie_config)

def if_exist(var):
    #print(var.name)
    return os.path.exists(os.path.join(args.init_pretraining_params,var.name))

fluid.io.load_vars(exe, args.init_pretraining_params, main_program=test_prog, predicate=if_exist)
var_dict = {}
for var in startup_prog.list_vars():
    if os.path.exists(os.path.join(args.init_pretraining_params,var.name)):
    #if ( 'encoder' in var.name or 'embedding' in var.name ) and 'tmp' not in var.name:
    #if 'tmp' not in var.name:
        fluid_tensor = fluid.global_scope().find_var(var.name).get_tensor()
        print(var.name, np.array(fluid_tensor).shape)
        var_dict[var.name] = np.array(fluid_tensor)

joblib.dump(var_dict,'model.dct')

多谢大兄弟!

@kuke
Copy link

kuke commented Mar 19, 2019

Close this issue due to being resolved

@kuke kuke closed this as completed Mar 19, 2019
@Jothangan Jothangan mentioned this issue Mar 19, 2019
@zhhongzhi
Copy link

链接:https://pan.baidu.com/s/1AGTOEKmPTogjzUiUpcP0nw 密码:z51a
已转成numpy,拿走不谢,模型300多M, 使用joblib序列化保存,使用方式

import joblib
params = joblib.load('model.dct')
以下是转化的脚本代码

import paddle.fluid as fluid
import joblib
from model.ernie import ErnieConfig
from finetune.classifier import create_model
import numpy as np
import os
import argparse


# import joblib
# params = joblib.load('model.dct')

parser = argparse.ArgumentParser()
parser.add_argument("--init_pretraining_params", default='/Users/qiwang/github-star/paddle/params', type=str, help=".")
parser.add_argument("--ernie_config_path", default='./config/ernie_config.json', type=str, help=".")
parser.add_argument("--max_seq_len", default=10, type=int, help=".")
parser.add_argument("--num_labels", default=2, type=int, help=".")
parser.add_argument("--use_fp16", type=bool, default=False, help="Whether to use fp16 mixed precision training.")
parser.add_argument("--loss_scaling",  type=float,  default=1.0, help="only valid when use_fp16 is enabled.")
startup_prog = fluid.Program()
test_prog = fluid.Program()

place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(startup_prog)

args = parser.parse_args()

ernie_config = ErnieConfig(args.ernie_config_path)
ernie_config.print_config()

with fluid.program_guard(test_prog, startup_prog):
    with fluid.unique_name.guard():
        train_pyreader, graph_vars = create_model(
            args,
            pyreader_name='train_reader',
            ernie_config=ernie_config)

def if_exist(var):
    #print(var.name)
    return os.path.exists(os.path.join(args.init_pretraining_params,var.name))

fluid.io.load_vars(exe, args.init_pretraining_params, main_program=test_prog, predicate=if_exist)
var_dict = {}
for var in startup_prog.list_vars():
    if os.path.exists(os.path.join(args.init_pretraining_params,var.name)):
    #if ( 'encoder' in var.name or 'embedding' in var.name ) and 'tmp' not in var.name:
    #if 'tmp' not in var.name:
        fluid_tensor = fluid.global_scope().find_var(var.name).get_tensor()
        print(var.name, np.array(fluid_tensor).shape)
        var_dict[var.name] = np.array(fluid_tensor)

joblib.dump(var_dict,'model.dct')

请问怎么在tf/torch中使用这些参数呢?

@randomtutu
Copy link

我在pytorch上加载之后,实验结果有很大的差别。
为了找到不同的地方,我将两个框架的模型跑同一数据的前向传播,将每一步的数据进行对比。
结果发现,两个框架上同样的embedding权重(weight),对相同id的embedding居然不同。
我暂时没有对比两个框架的实现方法有何异同。
我推测要么是两个框架的embedding实现方法有差别,要么就是这个脚本保存的权重出现了一点问题。
希望有在做同样的事情的同学和我联系,一起交流。

@nghuyong
Copy link

nghuyong commented May 13, 2019

我自己实现了一个,欢迎使用
https://github.com/nghuyong/ERNIE-Pytorch

@bfjia1
Copy link

bfjia1 commented May 13, 2019

我自己实现了一个,欢迎使用
https://github.com/nghuyong/ERNIR-Pytorch

nice job, 有做inference的diff吗?结果是否一致

@nghuyong
Copy link

我自己实现了一个,欢迎使用
https://github.com/nghuyong/ERNIR-Pytorch

nice job, 有做inference的diff吗?结果是否一致

暂时还没有做,我会补充实验,

@Shajiu
Copy link

Shajiu commented Aug 20, 2022

我在pytorch上加载之后,实验结果有很大的差别。 为了找到不同的地方,我将两个框架的模型跑同一数据的前向传播,将每一步的数据进行对比。 结果发现,两个框架上同样的embedding权重(weight),对相同id的embedding居然不同。 我暂时没有对比两个框架的实现方法有何异同。 我推测要么是两个框架的embedding实现方法有差别,要么就是这个脚本保存的权重出现了一点问题。 希望有在做同样的事情的同学和我联系,一起交流。

请问您处理了么?我最近也在处理此类问题,但是出现如此错误?

@nghuyong
Copy link

nghuyong commented Aug 22, 2022

我自己实现了一个,欢迎使用
https://github.com/nghuyong/ERNIR-Pytorch

nice job, 有做inference的diff吗?结果是否一致

已经做了系统的试验,两个版本的推理不存在diff,欢迎使用~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants