优化网站的公司,嵌入式软件开发和硬件开发,网站开发需求文档模板,分子信标探针在线设计网站通过onnx模型可以在支持onnx推理的推理引擎上进行推理#xff0c;从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖#xff0c;获得更好的性能等优势。
这篇博客#xff08;大模型LLaMa及周边项目#xff08;二#xff09; - 知乎#xff09;进行…通过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。这可以在代码里面增加shapedtype打印进行一次推理获取。
阿里的Qwen模型导出onnx存在大量琐碎的算子主要是因为其使用了einops库的rearrange操作。把这些算子替换为reshapetranspose, 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, j2)# 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。优化前后 导出模型调试
从导出模型中算子的名称可以大概推断出该算子在那个模块定义的。
如/layers.0/attn/rotary_emb/Slice可以知道该算子定义于decoder第0层的atten.rotary_emb模块。