name_ch: Glm-130B:开放双语预训练模型

name_en: GLM-130B:AN OPEN BILINGUAL PRE-TRAINED

paper_addr: https://arxiv.org/abs/2210.02414

code: https://github.com/THUDM/GLM-130B/

date_publish: 2023-01-01

1 读后感

2022 年 11 月,斯坦福大学大模型中心对全球 30 个主流大模型进行了全方位的评测 2,GLM-130B 是亚洲唯一入选的大模型。GLM-130B 在准确性和恶意性指标上与 GPT-3 175B (davinci) 接近或持平。

ChatGLM 最大的优点是开源,并针对中文进行了优化,尤其是可以在自己的机器上搭建其简版的 int4 服务,实测回答一般性问题效果还不错,文后附环境搭建方法。

2 摘要

ChatGLM 是使用中英双语预训练的大语言模型,具有 130B 参数(1300 亿),使用 400B token 训练。

在模型结构上结合了 GPT 和 BERT。在英文方面,效果优于 GPT-3;在中文方面,优于 260B 参数的 ERNIE TITAN 3.0。可在 4×RTX 3090 (24G) 或 8×RTX 2080 Ti (11G) GPUs 环境下运行。

3 介绍

论文提出:通用语言模型 General Language Model (GLM),主要使用的技术是:双向注意力和自回归空白填充目标。嵌入梯度收缩策略可以显著提升 GLM - 130B 的训练稳定性。

4 方法

4.1 结构

4.1.1 GLM 架构

与 GPT,PaLM 等模型使用 Transformer 的解码器方式不同,GLM-130B 使用了一种双向通用语言模型(GLM)作为其 Backbone。模型结构详见论文:论文阅读_GLM

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 在零样本 LAMBDA 上取得了 80.2 % 的高准确率,优于图 2 中的 GPT - 3 和 PaLM 540B。

4.1.2 归一化方法

归一化有助于提升模型训练的稳定性,文中使用了 2022 年提出的 DeepNorm 方法(详见论文:Deepnet: Scaling transformers to 1,000 layers),其公式为:

\[ DeepNorm(x) = LayerNorm(α · x + Network(x)) \] \[ α = (2N )^{\frac{1}{2}} \]

其中 N 为层数。此方法有效地提升了训练稳定性。

4.1.3 位置编码和前馈网络

对于 GLM - 130B 中的位置编码采用旋转位置编码 (RoPE),并选择 GeLU 激活函数以优化 FFN。

4.2 训练设置

GLM - 130B 预训练目标不仅包括自监督的 GLM 自回归空白填充,还包括对小部分 token 的多任务学习,以提升其下游 zero-shot 任务的性能。

4.2.1 自监督空白填充(95%)

同时使用了 MASK 和 gMASK,每个序列使用其中一种。具体来说,MASK 用于在 30 % 的训练序列中掩盖连续的 Token 以进行空白填充。对于其他 70% 的序列,保留每个序列的前缀作为上下文,并使用 gMASK 来掩盖其余序列训练。

预训练数据包括 1.2 T 英语、1.0 T 的中文悟道语料库,以及从网络爬取的 250G 中文语料库 (包括在线论坛、百科全书和 QA),形成了平衡的英汉内容构成。

4.2.2 多任务指导预训练 (MIP,5%)

预训练中加入包括语言理解、生成和信息提取在内的多种指令提示数据集训练模型。

4.3 并行训练和模型配置

在 96 个 DGX - A100 GPU (8 × 40G) 服务器集群上进行了 60 天的训练。将 pipline 模型并行与其他两种策略结合形成了 3D 并行策略。

5 模型训练的稳定性

需要在精度和稳定间保持平衡,低精度的 FP 格式提高了计算效率,但容易出现溢出错误,导致训练崩溃。

5.1 混合精度

FP16 用于前向和后向,FP32 用于优化器状态和主权重,以减少 GPU 内存使用,提高训练效率。

5.2 嵌入层梯度收缩

实验表明,梯度范数可以作为训练崩溃的信息指标。具体来说,训练崩溃通常滞后于梯度范数中的 " 尖峰 " 几个训练步。发现嵌入层的梯度收缩可以克服损失尖峰,从而稳定 GLM - 130B 的训练。

6 在 Rtx 2080 TI 上使用模型推理

在保持 FP16 激活精度的同时,重点关注模型权重的量化。量化后的模型在运行时动态转换为 FP16 精度,引入了较小的计算开销,大大降低了存储模型权重的 GPU 内存使用量。文中成功地实现了 GLM - 130B 的 INT4 权重量化,目前模型已发布,可下载使用。

7 实验

与英文模型比较:

与中文模型比较:

8 实战——环境搭建

ChatGLM-6B 是一个具有 62 亿参数的中英双语语言模型,由大模型量化后得到,代码 + 模型一共只有几个 G 大小。

8.1 下载代码和模型

由于我家机器性能有限,就下载了 int4 模型,约占空间 5G 左右,运行时占 GPU 内存 5G 左右。

1
2
$ 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 中的文件。

8.2 下载运行环境镜像

如果使用 docker 启动,推荐镜像:

1
$ docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime

启动镜像

1
$ 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

8.3 调整代码

修改 web_demo.py

  • 修改模型名为指定目录:
1
2
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 外部调用
1
demo.queue().launch(share=False, inbrowser=True, server_name="0.0.0.0")

8.4 运行服务

在镜像内部运行

1
2
3
$ cd ChatGLM-6B/
$ pip install -r requirements.txt
$ python web_demo.py

启动服务后,就可以在宿主机浏览器中通过端口 7860 访问,效果如下:

个人觉得速度还挺快的,回答效果也还行。

8.5 相关链接

ChatGLM项目地址
ChatGLM模型介绍

模型下载