论文阅读_ChatGLM

文章信息

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),其公式为:
D e e p N o r m ( x ) = L a y e r N o r m ( α ⋅ x + N e t w o r k ( x ) ) DeepNorm(x) = LayerNorm(α · x + Network(x)) DeepNorm(x)=LayerNorm(αx+Network(x))
α = ( 2 N ) 1 2 α = (2N )^{\frac{1}{2}} α=(2N)21
其中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访问,效果如下:

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

相关链接

ChatGLM项目地址
ChatGLM模型介绍
模型下载

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:I’m not familiar with the lora library or the chatglm model. Can you provide more information or context about what you’re trying to do? 引用\[2\]:介绍: 为方便学习,对ChatGlm添加了lora实现,并对代码做了逐行解读,核心的部分如数据的解析,loss的定义,lable制作,lora调用的框架流程等。 git链接GitHub - Pillars-Creation/ChatGLM-LoRA: ChatGLM-6B添加了LoRA实现,以及部分核心代码的逐行讲解 ,实例部分是做了个新闻短标题的生成 论文链接 https://arxiv.org/pdf/2106.09685.pdf 核心的流程 。 引用\[3\]:You can replace the FeedforwardNN class with your own model and adjust the hyperparameters as needed. As for using Lora specifically, I’m not sure what you mean by that. Can you provide more context or information? 引用\[4\]:LoRA is a library for low-power, long-range communication using the LoRaWAN protocol. It is not directly related to the ChatGLM model. If you want to use LoRA for fine-tuning the ChatGLM model, you would need to provide more information on how you intend to use it and what specific modifications or adaptations you are looking to make. 问题: chatglm代码生成 回答: 对于chatglm代码的生成,我不熟悉lora库或chatglm模型。如果你能提供更多关于你想要做什么的信息或背景,我可以给出更多的帮助。\[1\]如果你是指生成chatglm代码的方法,你可以参考GitHub上的ChatGLM-LoRA项目,该项目对ChatGlm添加了lora实现,并提供了代码解读和核心流程的说明。\[2\]但是请注意,lora库是用于低功耗、远距离通信的,与ChatGLM模型并没有直接关联。如果你想要使用lora对ChatGLM模型进行微调,你需要提供更多关于你打算如何使用lora以及你希望进行的具体修改或适应的信息。\[3\]\[4\] #### 引用[.reference_title] - *1* *3* [Cursor太强了,从零开始写ChatGLM大模型的微调代码](https://blog.csdn.net/KanShiMeKan/article/details/129651474)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ChatGLM-LoRA实现&代码逐行讲解](https://blog.csdn.net/qjzcy/article/details/131206691)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值