【云驻共创】昇思MindSpore技术——大模型ChatGLM2

举报
龙腾九州 发表于 2024/01/16 21:11:09 2024/01/16
【摘要】 本篇文章介绍了ChatGLM2的相关技术,演示了ChatGLM2推理部署代码,和介绍了最近刚开源的ChatGLM3的相关特性。

本篇文章带领大家在ChatGLM系列模型中进一步深入,阐述了ChatGLM2的相关技术、推理部署代码演示,以及介绍了最近刚开源的ChatGLM3的相关特性。 

一、ChatGLM2技术解析(基于ChatGLM的改进点)

首先,一起来复习一下GLM模型。它采取自回归填空(Autoregressive Blank Infilling)框架,使得模型具有兼顾自然语言理解和文本生成的能力。

而ChatGLM2-6B是开源中英双语对话模型ChatGLM-6B的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B引入了如下新特性:

1.1 Multi-Query Attention

Transformer结构的模型的推理被称作“incremental inference”,即decoder根据当前输入预测下一个token,生成的token再加入原序列组成新的输入,以此往复,直到出现终止符或达到可生成的最大长度。

因此每一次预测,都需要加载一次权重,导致推理效率较低。之所以没有关注到,是因为之前很少做文本生成,解码序列长度也没有现阶段大模型的要求那么高。

MQA最早是出现在2019年谷歌的一篇论文Fast Transformer Decoding: One Write-Head is All You Need。MQA的思想其实比较简单(如果对MHA比较熟悉的话),论文中给出的描述如下:

3 Multi-Query Attention

We introduce multi-query Attention as a variation of multi-head attention as described in [Vaswani et al.,2017].Multi-head attention consists of multiple attention layers (heads) in parallel with different linear transformations on the queries, keys, values and outputs. Multi-query attention is identical except that the different heads share a single set of keys and values.The code for (incremental) multi-query (self) attention is identical to the code listed above for multi-head attention, except that we remove the letter "h" from the tf.einsum equations where it represents the "heads" dimension of K,V,Pk,or Pv.

论文的意思是:MQA和MHA除了不同的attention head共享一份keys和values权重之外,其他的都是一样的。

1.1.1 Attention

1.1.2 Multi-Head Attention

在MHA中,输入x与不同组的权重相乘得到不同组的QKV,也称作头;每个头中都是不同的QKV进行运算。

在MQA中,所有头共享一组wx和w、权重,多个不同的Q与同一组 (K,V)进行运算,从而减少了KV缓存的大小。

1.1.3 Multi-Query Attention代码实现

self.multi query attention = config.multi_query_attention

self.qkv_hidden_size = 3 * self.projection_size

if self.multi_query_attention:

self.num_multi_query_groups_per_partition= config.multi_query_group_num

self.gkv_hidden_size = (

self.projection_size + 2 * self.hidden_size_per_attention_head * config.multi_query_group_num)

参考链接:

https://qitee.com/mindspore/mindformers/blob/dev/mindformers/models/glm2/glm2_transformer.py

1.2 Flash Attention技术

通常的优化是针对计算复杂度(通过FLOPs数衡量),优化会权衡模型质量和计算速度。

在FlashAttention中考虑到attention算法也是IO敏感的,通过对GPU显存访问的改进来对attention算法的实现进行优化。如图,在GPU中片上存储SRAM访问速度最快,对应的HBM(high bandwidth memory)访问速度较慢,为了加速要尽量减少HBM的访问次数。

让我们看看通常情况下是如何访问HBM进行Attention计算的。

为了减少对HBM的读取,FlashAttention把attention计算融合为一个算子,将参与计算的矩阵送入SRAM,来提高整体的读写速度。但SRAM容量较小,需要将矩阵分块送入,同时动态更新softmax结果(softmax的tiling展开)。不对中间的运算结果(P,S)进行存储,在反向传播过程中重新计算需要的数据。

二、 ChatGLM2推理部署代码演示

在这里,通过相关代码演示ChatGLM2的推理部署过程。

45ecf1b6543337aa9b56931583efaac.png0bacec8564397659b034673d0590598.png

三、ChatGLM3特性介绍

ChatGLM3-6B是ChatGLM3系列中的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B引入了如下特性:

更强大的基础模型:基础模型ChatGLM3-6B-Base采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。具有在10B以下的基础模型中最强的性能。

更完整的功能支持:全新设计的Prompt格式。原生支持工具调用(Function Call)、代码执行(Code Interpreter)和Agent任务等复杂场景。

更全面的开源序列:ChatGLM3-6B,基础模型ChatGLM3-6B-Base、长文本对话模型ChatGLM3-6B-32K开源,亦允许免费商业使用。

3.1 全新Prompt格式

之前的ChatGLM2模型中依旧使用了自然语言的prompt格式,通过用户问,模型答的方式进行对话生成。

[Round 1]

问:{用户输入}

答:{模型输出}

这样的设计会带来几个问题:

1.进行多轮训练时操作比较复杂,不好控制loss mask,微调时效率会稍低一些。

2.无法进行原生工具调用,推理系统需要从生成的自然语言内容中解析出需要调用的工具,再进行调用。

3.2 全新Prompt格式

ChatGLM3设计了四种special token,用于间隔开角色之间的对话内容。

<|system|>:系统信息,设计上可穿插于对话中,但目前规定仅可以出现在开头

<|user|>:用户,不会连续出现多个来自<|user|> 的信息

<|assistant|>:AI助手,在出现之前必须有一个来自<|user|> 的信息

<|observation|>:外部的返回结果,必须在<lassistant|>的信息之后


4579b202c55b9a18af830822ed4ffeb.png3.3 全新Prompt格式


special token之前遵循前不间隔后间隔的方式,即speicial token之前不用’\n’隔开,后用’\n’隔开,组合成的prompt形式如下:

<|system|>

You are ChatGLM3, a large language model trained byZhipu.Al. Follow the user's instructions carefully.

Respond using markdown.<|user|>

Hello<|assistant|>

为系统设定的角色,对应<|system|>

Hello, I'm ChatGLM3.What can l assist you today?<|user|>

用户输入,对应<|user|>

今天天气怎么样?<|assistant|>

模型输出,对应<|assistant|>

XXxxx

之前的推理中,我们往往通过<eos>或最大序列长度来识别生成的结束。在全新的prompt格式下,也可以通过识别<|user|>来定位生成句子的结束,表示AI助手对话结束,该进行用户输入了。

3.4 对话模式

对系统的角色设定为<|system|>后接的内容。


3.5 工具模式

构建system prompt,用list of dict的形式说明可调用的工具。

输入1:location,地理位置

输入2:unit,温度单位

模型调取对应工具,并进行参数输入工具返回输出。相关代码如下所示:

<|system|>

Answer the following questions as best as you can. You have access to the following tools:

{

"name": "get_current_weather",

"description": "Get the current weather in a given location",

"parameters": {

"type": "object",

"properties": {

"location": {

"type": "string",

"description": "The city and state, e.g. San Francisco,CA",

},

"unit": {"type": "string"},

},

"required": ["location"],

},

}

<user >

今天北京的天气怎么样?

<|assistant|>

好的,让我们来查看今天的天气

<assistant|>get_current_weather

"""

python

tool_call(location="beijing", unit="celsius")

"""

<|observation|>

{"temperature":22}

<|assistant|>

根据查询结果,今天北京的气温为22摄氏度。

3.6 工具模式

可以在toolregistorypy中注册新的工具增强模型能力,具体形式为使用@register tool装饰函数。

3.7 代码解释器模式

拥有代码执行环境,所以可以进行绘制图表,数学运算等较为复杂的任务

这种模式下,<|assistant|>后的{metadata}只有一种情况:Interpreter,<|observation|>中通过[image]显示图片。

本篇文章介绍了ChatGLM2的相关技术演示了ChatGLM2推理部署代码,介绍了最近刚开源的ChatGLM3的相关特性。

本文参与华为云社区【内容共创】活动第25期

任务21:昇思MindSpore技术公开课 大模型专题(第二期)第三讲:ChatGLM2

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。