【云驻共创】昇思MindSpore技术——大模型ChatGLM2
本篇文章带领大家在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的推理部署过程。
三、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|>的信息之后
3.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期 。
- 点赞
- 收藏
- 关注作者
评论(0)