再度进化,ChatGLM2-6B详细学习实践记录与资料分享

ChatGLM-6B是清华大学基础研究团队前一段时间开源出来的大模型,一经推出就得到了广泛的使用和推广,在我前面的博文中结合我自己的学习实践经历,已经详细的总结记录了一下,感兴趣或者是有需要的朋友可以自行获取即可,如下所示:

《ChatGLM-6B详细学习实践记录与资料分享》

感兴趣的话可以自行查阅即可。

ChatGLM-6B官方项目地址在这里,如下所示:

 目前已经超过了31k的star量了。

ChatGLM2-6B是清华大学基础研究团队推出的ChatGLM-6B的升级迭代版本,官方项目地址在这里,如下所示:

 可以看到:推出一周左右的时间就已经收获到了将近10k的star量,还是不错的。

官方介绍的ChatGLM2-6B升级版本主要从四个维度进行了升级,但是依旧保持了初代模型对话流畅、部署门槛低等优秀的特性,接下来就四个升级特性进行说明:

一、更加强大的性能

基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。

ChatGLM2-6B使用了GLM加购的目标函数,官方同样开源了GLM架构,项目地址在这里,如下所示:

 GLM是一个用自回归填空目标预训练的通用语言模型,可以在各种自然语言理解和生成任务中进行微调。官方发表的学术论文如下:
《GLM: General Language Model Pretraining with Autoregressive Blank Infilling》

 感兴趣的话可以自行研读。

官方同时开放了对应基于GLM架构开发的各种预训练模型权重如下所示:

Name Params Language Corpus Objective File Config
GLM-Base 110M English Wiki+Book Token glm-base-blank.tar.bz2 model_blocklm_base.sh
GLM-Large 335M English Wiki+Book Token glm-large-blank.tar.bz2 model_blocklm_large.sh
GLM-Large-Chinese 335M Chinese WuDaoCorpora Token+Sent+Doc glm-large-chinese.tar.bz2 model_blocklm_large_chinese.sh
GLM-Doc 335M English Wiki+Book Token+Doc glm-large-generation.tar.bz2 model_blocklm_large_generation.sh
GLM-410M 410M English Wiki+Book Token+Doc glm-1.25-generation.tar.bz2 model_blocklm_1.25_generation.sh
GLM-515M 515M English Wiki+Book Token+Doc glm-1.5-generation.tar.bz2 model_blocklm_1.5_generation.sh
GLM-RoBERTa 335M English RoBERTa Token glm-roberta-large-blank.tar.bz2 model_blocklm_roberta_large.sh
GLM-2B 2B English Pile Token+Sent+Doc glm-2b.tar.bz2 model_blocklm_2B.sh
GLM-10B 10B English Pile Token+Sent+Doc Download model_blocklm_10B.sh
GLM-10B-Chinese 10B Chinese WuDaoCorpora Token+Sent+Doc Download model_blocklm_10B_chinese.sh

二、更长的上下文

基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。

flash-attention项目官方地址在这里,如下所示:

 对应的论文如下所示:

《FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness》

 三、更加高效的推理

基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。

关于Multi-Query Attention技术原理细节可以查阅论文,如下所示:

《Fast Transformer Decoding: One Write-Head is All You Need》

 这里我还没有去看过所以就不再多讲了。

四、更加开放的协议

ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。如果您发现我们的开源模型对您的业务有用,我们欢迎您对下一代模型 ChatGLM3 研发的捐赠。

这一点我的理解主要是关于商业授权使用上面ChatGLM系列的模型迈出了更大的一步,给开发者提供了更大的使用空间和操作自由。

在最初项目发布的时候是只提供了模型加载推理使用的源代码,后续在7月4日的时候官方团队发布了ChatGLM2-6B的P-Tuning v2源码,可以帮助开发者开发构建自己的大模型项目了。

想要运行整个项目,需要首先搭建环境, 安装命令如下所示:

pip install protobuf transformers==4.30.2 cpm_kernels torch>=2.0 gradio mdtex2html sentencepiece accelerate

简单的实例调用代码如下所示:

from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).half().cuda()
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)

结果输出如下所示:

晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:

1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。
2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。
3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。
4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。
5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。
6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。

如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。

官方开放出来的权重下载地址在这里,如下所示:

 整体项目下载后,将下载到的权重等文件对应存放后就可以执行web_demo.py模块启动web对话页面了,如下所示:

 当然了基于官方提供的代码也是可以进行微调开发训练的,这里我们来看下ptuning目录,如下所示:

 这里train.sh就是训练的脚本,如下所示:

PRE_SEQ_LEN=128
LR=2e-2
NUM_GPUS=1

torchrun --standalone --nnodes=1 --nproc-per-node=$NUM_GPUS main.py \
    --do_train \
    --train_file AdvertiseGen/train.json \
    --validation_file AdvertiseGen/dev.json \
    --preprocessing_num_workers 10 \
    --prompt_column content \
    --response_column summary \
    --overwrite_cache \
    --model_name_or_path THUDM/chatglm2-6b \
    --output_dir output/adgen-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 128 \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 16 \
    --predict_with_generate \
    --max_steps 3000 \
    --logging_steps 10 \
    --save_steps 1000 \
    --learning_rate $LR \
    --pre_seq_len $PRE_SEQ_LEN \
    --quantization_bit 4

这是Linux系统下可以使用的,我这里是在windows平台下做的实验,所以需要对其进行改造处理,最终命令如下所示:

python main.py --do_train --train_file dataset/train.json --validation_file dataset/test.json --preprocessing_num_workers 10 --prompt_column content --response_column summary --overwrite_cache --model_name_or_path ChatGLM2-6B --output_dir output/chatglm2-6b-pt --overwrite_output_dir --max_source_length 64 --max_target_length 128 --per_device_train_batch_size 1 --per_device_eval_batch_size 1 --gradient_accumulation_steps 16 --predict_with_generate --max_steps 3000 --logging_steps 10 --save_steps 1000 --learning_rate 2e-2 --pre_seq_len 128 --quantization_bit 4

如果说你在运行的时候报错比如ChatGLM模型没有prefix_encoder之类的属性错误的话基本上都是代码的问题,解决办法就是重新线上拉取最新的代码覆盖本地的代码就行了。

全部处理完成后终端输入上述的命令即可启动训练,训练过程日志输出如下所示:

 接下来就是漫长的等待了,按照往初代模型的训练经验来说,基本上是一天左右的时间能够出来结果,后面再继续研究吧。

猜你喜欢

转载自blog.csdn.net/Together_CZ/article/details/131577733