当前位置: 首页 > news >正文

导出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.lryc.cn/news/116108.html

相关文章:

  • C++项目:在线五子棋对战网页版--匹配对战模块开发
  • ssh 连接断开,正在执行的shell脚本也被中断了
  • UML 用例图,类图,时序图,活动图
  • Java 面试题2023
  • 【CSS3】CSS3 动画 ④ ( 使用动画制作地图热点图 )
  • 命令模式(Command)
  • Dapper 微型orm的光
  • Mysql随心记--第一篇
  • 使用dockerfile安装各种服务组件
  • 如何简单的无人直播
  • 【基于HBase和ElasticSearch构建大数据实时检索项目】
  • ProComponent 用法学习
  • 巨人互动|Google海外户Google Analytics的优缺点是什么?
  • MySQL数据库的操作
  • 人工智能行业岗位一览
  • 《Linux运维实战:Docker基础总结》
  • Clash 意外退出后 chrome / google 谷歌 浏览器无法连接互联网
  • 89 | Python人工智能篇 —— 深度学习算法 Keras 实现 MNIST分类
  • 每天一道leetcode:剑指 Offer 32 - III. 从上到下打印二叉树 III(中等广度优先遍历)
  • day10 快速排序 方法重载 和 方法递推
  • Qt 6. 其他类调用Ui中的控件
  • PHP 的不同版本(src 版、nts 版和 win 版)之间的区别和共同点。
  • 3 vue的if语法
  • python基础3——流程控制
  • kubernetes中最小组件——Pod
  • C++ 友元
  • Vulkan 绘制显示设计
  • Linux性能分析工具介绍(一)--cpu及功耗相关工具介绍
  • 智能财务分析的无冕之王-奥威BI数据可视化工具
  • .NET 应用程序 部署