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之类的属性错误的话基本上都是代码的问题,解决办法就是重新线上拉取最新的代码覆盖本地的代码就行了。
全部处理完成后终端输入上述的命令即可启动训练,训练过程日志输出如下所示:
接下来就是漫长的等待了,按照往初代模型的训练经验来说,基本上是一天左右的时间能够出来结果,后面再继续研究吧。