概述
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个阶段:
-
将句子通过分词器(使用google的sentencepiece)转换成tokens,如图中的
<1x17 xi32>
的数据。注意tokens里面64790, 64792
是起始符号。 -
通过WordEmbedding将tokens转换成词向量,得到的结果是
<1x17x4096 xf32>
的数据。 -
通过Tranformer进行神经网络推理,推理结果是
<1x17x4096 xf32>
,答案在最后的词向量上,所以做一个额外的slice操作,得到<1x1x4096 xf32>
。这里Transformer网络是由28个Block组成,每个Block的核心是一个Attention运算,并输出kv cache给下一轮Transform做为输入。 -
经过LmHead操作生成
<1x1 xi32>
的结果,也就是输出的Token。LmHead的组成如图所示。 -
Token经过分词器转成词语,且传递给下一轮推理,进入第一阶段。直到
token == EOS_ID
结束。