探索ChatGLM2-6B模型与TPU部署

概述

ChatGLM2-6B是由清华大学开发的中英双语对话模型,它能生成相当符合人类偏好的回答,使每个人都能拥有自己的AI大模型,为了更好地支持开源生态,ChatGLM2-6B对学术研究完全开放,并允许免费商用。

算能BM1684X已经实现ChatGLM2-6B的C++代码部署,代码实现链接:https://github.com/sophgo/ChatGLM2-TPU(可点击文末阅读原文进行跳转)

本文总结了部署该模型过程中的一些技术点,希望通过详细的教程帮助到更多的开发者。文章内容包括ChatGLM2-6B的整体运行流程;如何将该动态网路转换成静态网络形式;如何将该模型导出成ONNX;如何将ONNX使用TPU-MLIR编译器实现网络的编译;如何用C++代码编写应用程序。

ChatGLM2-6b运行流程

如图该网络基本上可以分为5个阶段:

  1. 将句子通过分词器(使用google的sentencepiece)转换成tokens,如图中的<1x17 xi32>的数据。注意tokens里面64790, 64792是起始符号。

  2. 通过WordEmbedding将tokens转换成词向量,得到的结果是<1x17x4096 xf32>的数据。

  3. 通过Tranformer进行神经网络推理,推理结果是<1x17x4096 xf32>,答案在最后的词向量上,所以做一个额外的slice操作,得到<1x1x4096 xf32>。这里Transformer网络是由28个Block组成,每个Block的核心是一个Attention运算,并输出kv cache给下一轮Transform做为输入。

  4. 经过LmHead操作生成<1x1 xi32>的结果,也就是输出的Token。LmHead的组成如图所示。

  5. Token经过分词器转成词语,且传递给下一轮推理,进入第一阶段。直到token == EOS_ID结束。

全文链接:https://mp.weixin.qq.com/s/-R2sJWCXISbffiSLajVMRg