X2Paddle
X2Paddle copied to clipboard
spanBERT onnx转paddle模型报错
感谢您参与 X2Paddle 社区! 问题模版为了 X2Paddle 能更好的迭代,例如新功能发布、 RoadMaps 和错误跟踪. :smile_cat:
问题描述

首先将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
结果报错:
具体信息
- 转换模型后用处
- [*] 转换预训练参数,再使用 Paddle 进行模型开发
- 模型来源 spanBERT:huggingface官方,SpanBERT/spanbert-base-cased
- 应用场景 模型热启后再训练
- 版本信息 PaddlePaddle => :grey_question: 2.2.0 X2Paddle => :grey_question: 1.3.7 来源框架版本(PyTorch/TF/ONNX/Caffe) => :grey_question: ONNX
- 您的联系方式(邮箱/微信/电话) 无
Hi, @xixiaoyao 是HuggingFace的模型转换吗,参考下这个文档 https://github.com/PaddlePaddle/X2Paddle/blob/develop/docs/inference_model_convertor/toolkits/HuggingFace2paddle.md
需要注意一下版本依赖
- python >= 3.5
- transformers 4.16.0
- PyTorch 1.7.1
- PaddlePaddle 2.3.0
- ONNX 1.9.0
@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 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里是用这种较老的方式读取模型参数的,而且需要手动编辑一下一些模型参数的参数名。
关于
- 业务场景:目前为前瞻研究阶段,暂未绑定业务场景
- 前瞻项目的模型训练框架是paddle写的,目前paddle生态似乎没有spanBERT模型,需要基于paddle复现spanBERT模型热启的效果
我刚查询了一下API,这样将model.pdparams
文件转换成静态图的一堆参数小文件,不知是否正确:
>>> m = paddle.load('./model.pdparams')
>>> for k,v in m.items():
... paddle.save(v, './temp/'+k, use_binary_format=True)
@xixiaoyao 目前X2Paddle还是以预测模型转换为主,训练还是建议拿Pytorch训练好后,再进行转换,或者使用PaddleNLP
至于你说的参数文件夹,我理解是Paddle 2.0之前的参数保存形式,这边建议更新到Paddle 2.0以上,会有更多优化策略~
好的了解,感谢