导出LLaMA ChatGlm2等LLM模型为onnx

通过onnx模型可以在支持onnx推理的推理引擎上进行推理,从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖,获得更好的性能等优势。

这篇博客(大模型LLaMa及周边项目(二) - 知乎)进行了llama导出onnx的开创性的工作,但是依赖于侵入式修改transformers库,比较不方便。

这里本人实现了避免侵入式修改transformers库导出LLM为ONNX方法,代码库为:

https://github.com/luchangli03/export_llama_as_onnx/tree/main

可以在这个基础上进行简单修改从而导出其他模型,例如百川,Qwen等模型。当前已经加入了对清华ChatGlm2和阿里Qwen的导出支持。

该方案优点是无需侵入式修改transformers代码,缺点是你需要提前了解各个模型的输入,相关shape和dtype。这可以在代码里面增加shape,dtype打印,进行一次推理获取。

阿里的Qwen模型导出onnx存在大量琐碎的算子,主要是因为其使用了einops库的rearrange操作。把这些算子替换为reshape,transpose, split等操作后onnx模型会极大简化。此外,还可以进一步优化该模型的RotaryEmbedding相关的代码以优化导出的onnx模型复杂度。

例如

# context_layer = rearrange(
#     context_layer, "b s h d -> b s (h d)"
# ).contiguous()
b, s, h, d = context_layer.shape
context_layer = context_layer.reshape([b, s, -1])
# self._rotary_pos_emb_cache = rearrange(emb, "n d -> 1 n 1 d")
emb = torch.unsqueeze(emb, 0) # [1nd]
emb = torch.unsqueeze(emb, 2)
def _rotate_half(x):# from einops import rearrange# x = rearrange(x, "... (j d) -> ... j d", j=2)# x1, x2 = x.unbind(dim=-2)last_dim = x.shape[-1]x1, x2 = torch.split(x, last_dim//2, dim=-1)return torch.cat((-x2, x1), dim=-1)

导出的llama decoder会存在if算子,但是经过符号shape推导和设置相应的符号shape到onnx模型value_info,然后经过onnxsim可以完全去掉。也可以考虑修改llama定义代码去掉if。优化前后:

ea389166fad24bbbbc9d2a007294ef94.png57bda583259b421ca6f808504eb90980.png

导出模型调试

从导出模型中算子的名称可以大概推断出该算子在那个模块定义的。

如/layers.0/attn/rotary_emb/Slice可以知道该算子定义于decoder第0层的atten.rotary_emb模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/82191.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 399-除法求值

法一:并查集 分析示例1: a / b 2.0 a/ b 2.0 a/b2.0,说明 a 2 b a2b a2b, a a a和 b b b在同一个集合中 b / c 3.0 b/c3.0 b/c3.0,说明 b 3 c b3c b3c, b b b和 c c c在同一个集合中 求 a / c a/…

微服务——ES实现自动补全

效果展示 在搜索框根据拼音首字母进行提示 拼音分词器 和IK中文分词器一样的用法,按照下面的顺序执行。 # 进入容器内部 docker exec -it elasticsearch /bin/bash# 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch…

【C++】红黑树的原理与实现

文章目录 一、引言 二、红黑树的概念与性质 2、1 红黑树的概念 2、2 红黑树的性质 三、红黑树的定义与实现 3、1 红黑树的定义 3、2 插入新节点 3、2、1 默认插入红色节点 3、3 插入情况分类 3、3、1 情况一(根据颜色向上调整) 3、3、2 情况二&#xff0…

AIGC技术到底是什么?为什么这么火热?

AIGC技术到底是什么?为什么这么火热? ALCG技术到底是什么?AIGC技术的发展史AIGC技术特点AIGC技术主要用途ALGC技术未来发展 ALCG技术到底是什么? AIGC(Artificial Intelligence in Game Creation)技术是指…

OpenLayers实战,OpenLayers实现气象台风飓风运动轨迹运动动画,可调台风旋转速度和运动速度,静态图片旋转动画

专栏目录: OpenLayers实战进阶专栏目录 前言 本章使用OpenLayers实现气象中常用的台风或者飓风运动轨迹动画,支持调整台风图标旋转速度和运动速度。 不同的台风可以设置不同的运动速度和旋转速度,也可以通过变量控制图片不旋转。 本章图片使用静态png图片,并非gif动态图。…

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面,挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用,需要在里面支持多个版本的中间件客户端;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT,百度,googl…

在Python中定义Main函数

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 许多编程语言都有一个特殊的函数,当操作系统开始运行程序时会自动执行该函数。 这个函数通常被命名为main(),并且依据语言标准具有特定的返回类型和参数。 另一方面,Python解释器从文件…

SQL-每日一题【1179. 重新格式化部门表】

题目 部门表 Department: 编写一个 SQL 查询来重新格式化表,使得新的表中有一个部门 id 列和一些对应 每个月 的收入(revenue)列。 查询结果格式如下面的示例所示: 解题思路 1.题目要求我们重新格式化表,…

Sentieon | 应用教程: 关于读段组的建议

介绍 本文档描述了使用Sentieon Genomics软件时,推荐使用RGID字段以最小化潜在问题的用法。 本文档能帮助您确定设置所使用的bam文件中RG标签的不同字段的最佳实践方法。 RG字段及其用法的详细描述 RG字段的详细描述 SAM格式规范http://samtools.github.io/hts-…

Android Studio实现刮刮卡效果

代码和刮刮乐图片参考网络 实现效果 MainActivity import android.app.Activity; import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentV…

教雅川学缠论06-中枢

本系列文章之前讲的内容都只有上升和下降两类趋势,并没有提及盘整,在缠论中,中枢这个新词汇用来定义盘整,中枢: 1.至少由5条线段(或笔)组成 2.中枢是有方向的,中枢左右两侧外面的线&…

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点(golang/boomer) 问题 资料获取方法 背景 很早之前,考虑单机执行能力,使用locust做过公司短信网关的压测工作,后来发现了一个golang版本的locust,性能…

替换开源LDAP,某科技企业用宁盾目录统一身份,为业务敏捷提供支撑

客户介绍 某高科技企业成立于2015年,是一家深耕于大物流领域的人工智能公司,迄今为止已为全球16个国家和地区,120余家客户打造智能化升级体验,场景覆盖海陆空铁、工厂等货运物流领域。 该公司使用开源LDAP面临的挑战 挑战1 开源…

01《Detecting Software Attacks on Embedded IoT Devices》随笔

2023.08.05 今天读的是一篇博士论文 论文传送门:Detecting Software Attacks on Embedded IoT Devices 看了很长时间,发现有一百多页,没看完,没看到怎么实现的。 摘要 联网设备的增加使得嵌入式设备成为各种网络攻击的诱人目标&…

c#设计模式-创建型模式 之 工厂模式

前言: 工厂模式(Factory Pattern)是一种常用的对象创建型设计模式。该模式的主要思想是提供一个创建对象的接口(也可以是抽象类、静态方法等),将实际创建对象的工作推迟到子类中进行。这样一来&#xff0c…

第一百二十四天学习记录:C++提高:STL-deque容器(上)(黑马教学视频)

deque容器 deque容器基本概念 功能: 双端数组,可以对头端进行插入删除操作 deque与vector区别 vector对于头部的插入删除效率低,数据量越大,效率越低 deque相对而言,对头部的插入删除速度比vector快 vector访问元素的…

cpu util margin,cpu freq margin

【cpufreq governor】cpu util 和 cpu margin怎么计算的_悟空明镜的博客-CSDN博客 cpu util margin,cpu freq margin 根据policy_util schedtune_margin 作为算力选对应的cpu cluster或调频

dubbo之整合SpringBoot

目录 zookeeper安装 1.拉取ZooKeeper镜像 2.新建文件夹 3.挂载本地文件夹并启动服务 4.查看容器 5.进入容器(zookeeper) Dubbo Admin安装 1.下载dubbo-admin 2.zip包解压 3.修改配置文件 4.打包项目 5.启动jar 6.访问 构建项目 api模块 1.创建…

24届近5年上海理工大学自动化考研院校分析

今天学姐给大家带来的是上海理工大学控制考研分析 满满干货~还不快快点赞收藏 一、上海理工大学 学校简介 上海理工大学(University of Shanghai for Science and Technology)是一所以工学为主,工学、理学、经济学、管理学、文…

php实现登录的例子

界面&#xff1a; 登录界面login.html代码&#xff1a; <!DOCUMENT html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"…