老杨说话的地方
  • 首页
  • 关于老杨
  • 博客时间
  • 文章分类
    • 人生感悟
    • 信息技术
    • 往事随风
    • 情感随笔
    • 文学创作
    • 生活记录
    • 评论杂谈
    • 人工智能
  • 留言本
我是老杨
张驰有度 宠辱不惊
  1. 首页
  2. 人工智能
  3. 正文

PyTorch模型转onnx格式

2023年07月05日 6232点热度 0人点赞 2条评论

因项目需要,把PyTorch模型转为onnx。

Huggingface的模型无法直接转为onnx(仅有部分支持),如果是huggingface的模型,需要先转成PyTorch,详见文章《Huggingface模型转PyTorch模型》。

onnx是一种通用的模型架构,详细介绍可参考官网。

转换代码:

from transformers import AutoTokenizer
from transformers import AutoModel
from transformers import LlamaTokenizer, LlamaForCausalLM
import torch

# convert pytorch model to onnx model

def generate_prompt(text):
    return f"""Below is an instruction that describes a task. Write a response that appropriately completes the request.

### Instruction:
{text}

### Response:"""


text = '请介绍一下中国海洋大学'
prompt = generate_prompt(text)
tokenizer = LlamaTokenizer.from_pretrained('minlik/chinese-alpaca-7b-merged')
input = tokenizer.encode(prompt, return_tensors='pt')
print("now load pytorch model")
modeloftorchtype = torch.load('your_model_path_and_name.pt')
print("load finished, now eval")
modeloftorchtype.eval()
print("eval finished, now convert to onnx")

torch.onnx.export(modeloftorchtype, input, "your_model_path_and_name.onnx",input_names=["input"], output_names=["output"],opset_version=11,dynamic_axes={'input': {1:'tokenlength'},'output' : [0,1]}) # 输入的第1为可变

转换的思路其实很简单,就是把原有的模型,推理一遍,就可以使用PyTorch自带的函数导出了。

这里面有几点需要注意:

  1. 转换前需要调用eval函数
  2. 如果模型很大,那么转换出来的文件会很多,因为存储onnx的文件大小不允许超过2G,这是正常的
  3. export函数中,input_names=["input"], output_names=["output"]是自己定义的。dynamic_axes={'input': {1:'tokenlength'},'output' : [0,1]}是用来定义输入输出的可变长度的。比如,对于文本问答模型,每次输入的长度都不统一,如果按照这次转换的推理,那么input的维度就固定了,这样当再次加载模型推理的时候,就会报长度不一致的错误,所以这里要设置为可变长度。其中,1表示三维张量的第二维是可变的。'output' : [0,1]表示output张量(列表)的第一维和第二维,都是可变的。
标签: import onnx pytorch
最后更新:2023年07月05日

老杨

博士,非博学之士;讲师,讲所学所知。糊涂半生,虚度半世,唯愿平淡快乐,度过此生。

点赞
订阅评论
提醒
guest

guest

2 评论
内联反馈
查看所有评论
hokj
hokj
游客
2023年8月28日 上午9:11

想问下,转换之后还能有办法把torch的权重名字和onnx的权重名字对上吗。比如说我现在一个转换后的onnx模型,但我需要对这个onnx再修改部分权重,但是我又不想重新再转换一次,能否根据现有的state_dict在onnx文件上修改权重?

0
回复
老杨
老杨
作者
回复给  hokj
2023年8月28日 上午9:52

@hokj 这个不是很清楚,我也只是转换后用了一下,并没有对onnx进行深入研究。

0
回复

老杨

博士,非博学之士;讲师,讲所学所知。糊涂半生,虚度半世,唯愿平淡快乐,度过此生。

搜索
最新 热点 随机
最新 热点 随机
中国是不是体育强国? 成功的必备因素 关于华为 别再侮辱我的智商 春秋航空让人长见识 第二青春计划失败 第二青春计划 模型训练错误RuntimeError: expected scalar type Half but found Float 加载onnx模型进行推理 PyTorch模型转onnx格式
第二青春计划失败 我爱我家 五月槐花香 Google VS baidu 关于域名的使用 用好WordPress的Database Backup插件 晴迷星途24对质 我在大学那几年(六) 我在大学那几年(七) 又是病毒?
最新评论
  • 关于华为上的老杨确实,苹果手机系统还是有优势的。
  • 关于华为上的乱云AKAY自从换了苹果手机后,对手机再没以前那样热爱研究了,主要是系统省心。
  • 第二青春计划失败上的老杨第二都失败了,第三就算了吧。
  • 春秋航空让人长见识上的老杨应该提供一点水,至少给不想买水的人一个选择的空间。
  • 别再侮辱我的智商上的老杨那个很好,很值得。
  • 关于华为上的老杨Next系统基本没广告。大部分广告都可以关掉吧,我记得我写过一个文章,…
  • 第二青春计划失败上的xqiushi开始第三青春计划吧。
  • 春秋航空让人长见识上的xqiushi那个桌板能放下小米多看电子书,还是不错的。 这个矿泉水市面上没有,特供…
  • 别再侮辱我的智商上的xqiushi只投了那100亿的项目。
  • 关于华为上的xqiushi今年我爸的手机也换成华为,家庭里手机基本都是华为。最不满意的一点就是广…

Google java jsp linux QQ wordpress 中国 习惯 人生 公司 决定 博士 博客 同学 国家 大学 学习 实验室 家 小说 工作 开始 思考 情感 手机 技术 推荐 插件 数据库 文件 晴迷星途 朋友 生活 电影 相声 程序 笔记 网站 网络 置顶 美国 评论 软件 音乐 项目

关注公众号

COPYRIGHT © 2020 老杨说话的地方. ALL RIGHTS RESERVED.

THEME KRATOS YANG Modified BY 老杨

鲁ICP备17014997号-4

鲁公网安备 37021302000754号