文章信息
name_en: GLM-130B: AN OPEN BILINGUAL PRE-TRAINED
name_ch: Glm-130B:开放双语预训练模型
paper_addr: https://arxiv.org/abs/2210.02414
doi: 10.48550/arXiv.2210.02414
date_read: 2023-03-23
date_publish: 2023-01-01
tags: [‘深度学习’,‘自然语言处理’]
author: Aohan Zeng
code: https://github.com/THUDM/GLM-130B/
citation: 4
读后感
2022年11月,斯坦福大学大模型中心对全球30个主流大模型进行了全方位的评测2,GLM-130B 是亚洲唯一入选的大模型。 GLM-130B 在准确性和恶意性指标上与 GPT-3 175B (davinci) 接近或持平。
ChatGLM最大的优点是开源,并针对中文进行了优化,尤其是可以在自己的机器上搭建其简版的int4服务,实测回答一般性问题效果还不错,文后附环境搭建方法。
摘要
ChatGLM是使用中英双语预训练的大语言模型,具有130B参数(1300亿),使用400B token训练。
在模型结构上结合了GPT和BERT。在英文方面,效果优于GPT-3;在中文方面,优于260B参数的ERNIE TITAN 3.0。可在4×RTX 3090 (24G) 或 8×RTX 2080 Ti (11G) GPUs 环境下运行。
介绍
论文提出:通用语言模型General Language Model (GLM) ,主要使用的技术是:双向注意力和自回归空白填充目标。嵌入梯度收缩策略可以显著提升GLM - 130B的训练稳定性。
方法
结构
GLM架构
与GPT,PaLM等模型使用Transformer的解码器方式不同,GLM-130B使用了一种双向通用语言模型(GLM)作为其Backbone。模型结构详见论文:Glm: General language model pretraining with autoregressive blank infilling (2022).
GLM是一种基于Transformer的语言模型,它以自回归空白填充为训练目标。简而言之,对于一个文本序列x=[x1, · · · ,xn]
,从其中采样文本span{s1,· · ·,sm}
,其中每个si表示连续令牌的跨度,并用单个掩码替换si,要求模型对它们进行自回归恢复。与GPT类模型不同的是,它在不Mask的位置使用双向注意力,因此它混合了两种Mask,以支持理解和生成:
[MASK]:句子中的短空白,长度加总到输入的某一部分
[gMASK]:随机长度的长空白,加在提供前缀上下文的句子末尾
理论上,双向注意力的空白填充目标比GPT风格的模型能够更有效地理解语境:当使用 MASK 时,GLM- 130B表现类似BERT和T5;当使用 gMASK 时,GLM - 130B表现出与 PrefixLM 相似的性质。
GLM - 130B在零样本LAMBADA上取得了80.2 %的高准确率,优于图2中的GPT - 3和PaLM 540B。
归一化方法
归一化有助于提升模型训练的稳定性,文中使用了2022年提出的DeepNorm方法(详见论文 :Deepnet: Scaling transformers to 1,000 layers),其公式为:
其中N为层数。此方法有效地提升了训练稳定性。
位置编码和前馈网络
对于GLM - 130B中的位置编码采用旋转位置编码(RoPE),并选择GeLU激活函数以优化FFN。
训练设置
GLM - 130B预训练目标不仅包括自监督的GLM自回归空白填充,还包括对小部分token的多任务学习,以提升其下游zero-shot任务的性能。
自监督空白填充(95%)
同时使用了 MASK 和 gMASK,每个序列使用其中一种。具体来说,MASK用于在30 %的训练序列中掩盖连续的Token以进行空白填充。对于其他70%的序列,保留每个序列的前缀作为上下文,并使用gMASK来掩盖其余序列训练。
预训练数据包括1.2 T英语、1.0 T的中文悟道语料库,以及从网络爬取的250G中文语料库(包括在线论坛、百科全书和QA),形成了平衡的英汉内容构成。
多任务指导预训练(MIP,5%)
预训练中加入包括语言理解、生成和信息提取在内的多种指令提示数据集训练模型。
并行训练和模型配置
在96个DGX - A100 GPU ( 8 × 40G )服务器集群上进行了60天的训练。将pipline模型并行与其他两种策略结合形成了3D并行策略。
模型训练的稳定性
需要在精度和稳定间保持平衡,低精度的FP格式提高了计算效率,但容易出现溢出错误,导致训练崩溃。
混合精度
FP16用于前向和后向,FP32用于优化器状态和主权重,以减少GPU内存使用,提高训练效率。
嵌入层梯度收缩
实验表明,梯度范数可以作为训练崩溃的信息指标。具体来说,训练崩溃通常滞后于梯度范数中的"尖峰"几个训练步。发现嵌入层的梯度收缩可以克服损失尖峰,从而稳定GLM - 130B的训练。
在 Rtx 2080 TI 上使用模型推理
在保持FP16激活精度的同时,重点关注模型权重的量化。量化后的模型在运行时动态转换为FP16精度,引入了较小的计算开销,大大降低了存储模型权重的GPU内存使用量。文中成功地实现了GLM - 130B的INT4权重量化,目前模型已发布,可下载使用。
实验
与英文模型比较:
与中文模型比较:
实战——环境搭建
ChatGLM-6B 是一个具有62亿参数的中英双语语言模型,由大模型量化后得到,代码+模型一共只有几个G大小。
下载代码和模型
由于我家机器性能有限,就下载了int4模型,约占空间5G左右,运行时占GPU内存5G左右。
$ git clone https://github.com/THUDM/ChatGLM-6B
$ git clone https://huggingface.co/THUDM/chatglm-6b-int4/
在网站 https://huggingface.co/THUDM/chatglm-6b-int4/tree/main 中下载:
ice_text.model 和 pytorch_model.bin 两个大文件,替换git中的文件。
下载运行环境镜像
如果使用docker启动,推荐镜像:
$ docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime
启动镜像
$ nvidia-docker run -e "LC_ALL=zh_CN.UTF-8" -e "LANGUAGE=zh_CN.UTF-8" -e "LANG=zh_CN.UTF-8" -p 7860:7860 --rm -v /exports:/workspace/exports -it pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime bash
调整代码
修改web_demo.py
- 修改模型名为指定目录:
tokenizer = AutoTokenizer.from_pretrained("../chatglm-6b-int4/", trust_remote_code=True)
model = AutoModel.from_pretrained("../chatglm-6b-int4/", trust_remote_code=True).half().cuda()
- 设置server_name为0.0.0.0,以便服务在docker外部调用
demo.queue().launch(share=False, inbrowser=True, server_name="0.0.0.0")
运行服务
在镜像内部运行
$ cd ChatGLM-6B/
$ pip install -r requirements.txt
$ python web_demo.py
启动服务后,就可以在宿主机浏览器中通过端口7860访问,效果如下:
个人觉得速度还挺快的,回答效果也还行。