PaddlePaddle / X2Paddle

Deep learning model converter for PaddlePaddle. (『飞桨』深度学习模型转换工具)
http://www.paddlepaddle.org/
Apache License 2.0
740 stars 165 forks source link

spanBERT onnx转paddle模型报错 #826

Open xixiaoyao opened 2 years ago

xixiaoyao commented 2 years ago

感谢您参与 X2Paddle 社区! 问题模版为了 X2Paddle 能更好的迭代,例如新功能发布、 RoadMaps 和错误跟踪. :smile_cat:

问题描述

image

首先将pytorch的spanBERT模型转换成onnx模型,这一步没报错,代码如下

import transformers
import torch

model = transformers.modeling_auto.AutoModel.from_pretrained(pretrained_model_name_or_path='SpanBERT/spanbert-base-cased')
torch.onnx.export(model, dummy_input0,"spanBert.onnx",verbose=True)

而后用如下命令试图将onnx模型转成paddle格式:

x2paddle --framework=onnx --model=spanBert.onnx --save_dir=pd_model

结果报错:

image

具体信息

jiangjiajun commented 2 years ago

Hi, @xixiaoyao 是HuggingFace的模型转换吗,参考下这个文档 https://github.com/PaddlePaddle/X2Paddle/blob/develop/docs/inference_model_convertor/toolkits/HuggingFace2paddle.md

需要注意一下版本依赖

wjj19950828 commented 2 years ago

@xixiaoyao hi,夕小瑶~目前依赖上述版本,Torch2Paddle以及ONNX2Paddle我这边都已走通,这边建议直接从Torch转~

我这边转换代码

import torch

from transformers import AutoTokenizer, AutoModel, AutoModelForSequenceClassification
from x2paddle.convert import pytorch2paddle

save_dir = "pd_model"
jit_type = "trace"

# Load tokenizer and PyTorch weights form the Hub
tokenizer = AutoTokenizer.from_pretrained("SpanBERT/spanbert-base-cased", return_dict=False)
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
pt_model = AutoModel.from_pretrained("SpanBERT/spanbert-base-cased", return_dict=False)
pt_model.eval()
result = pt_model(inputs["input_ids"], inputs["attention_mask"], inputs["token_type_ids"])

# convert
pytorch2paddle(pt_model, save_dir , jit_type, [inputs["input_ids"], inputs["attention_mask"], inputs["token_type_ids"]])

另外,可以描述一下以下两个问题吗: 1、具体业务场景 2、为什么有转到Paddle部署的需求呢?

感谢~

xixiaoyao commented 2 years ago

@xixiaoyao hi,夕小瑶~目前依赖上述版本,Torch2Paddle以及ONNX2Paddle我这边都已走通,这边建议直接从Torch转~

我这边转换代码

import torch

from transformers import AutoTokenizer, AutoModel, AutoModelForSequenceClassification
from x2paddle.convert import pytorch2paddle

save_dir = "pd_model"
jit_type = "trace"

# Load tokenizer and PyTorch weights form the Hub
tokenizer = AutoTokenizer.from_pretrained("SpanBERT/spanbert-base-cased", return_dict=False)
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
pt_model = AutoModel.from_pretrained("SpanBERT/spanbert-base-cased", return_dict=False)
pt_model.eval()
result = pt_model(inputs["input_ids"], inputs["attention_mask"], inputs["token_type_ids"])

# convert
pytorch2paddle(pt_model, save_dir , jit_type, [inputs["input_ids"], inputs["attention_mask"], inputs["token_type_ids"]])

另外,可以描述一下以下两个问题吗: 1、具体业务场景 2、为什么有转到Paddle部署的需求呢?

感谢~

非常感谢!我这边也跑通了。不过我发现保存的模型是一个model.pdparams文件,这个文件可以拿来热启模型参数,继续训练吗?或者有没有办法改成熟知的参数文件夹的形式,文件夹下面的每个文件是一个tensor,目前我的project里是用这种较老的方式读取模型参数的,而且需要手动编辑一下一些模型参数的参数名。

关于

  1. 业务场景:目前为前瞻研究阶段,暂未绑定业务场景
  2. 前瞻项目的模型训练框架是paddle写的,目前paddle生态似乎没有spanBERT模型,需要基于paddle复现spanBERT模型热启的效果
xixiaoyao commented 2 years ago

我刚查询了一下API,这样将model.pdparams文件转换成静态图的一堆参数小文件,不知是否正确:

>>> m = paddle.load('./model.pdparams')
>>> for k,v in m.items():
...     paddle.save(v, './temp/'+k, use_binary_format=True) 
wjj19950828 commented 2 years ago

@xixiaoyao 目前X2Paddle还是以预测模型转换为主,训练还是建议拿Pytorch训练好后,再进行转换,或者使用PaddleNLP

至于你说的参数文件夹,我理解是Paddle 2.0之前的参数保存形式,这边建议更新到Paddle 2.0以上,会有更多优化策略~

xixiaoyao commented 2 years ago

好的了解,感谢