文章目录
- 中文大语言模型评估基准:C-EVAL
- ChatGLM2-6B
- 部署推理
- 环境配置
- 模型下载
- git-lfs安装
- 代码调用
- 基于gradio的网页版Demo
- 显存占用情况
- 数理逻辑
- 推理性能
- 显存占用的减少
- 量化对模型性能的影响
- 基于 P-Tuning v2 的微调(官方)
- 环境配置
- 微调数据准备
- 微调
ChatGLM自2023年3月发布以来,就已经爆火,如今6月25日,清华二代发布(ChatGLM2),位居C-Eval榜单的榜首(Rank0)!而ChatGLM2-6B则位居Rank6!
中文大语言模型评估基准:C-EVAL
C-EVAL: A Multi-Level Multi-Discipline Chinese Evaluation Suite for Foundation Models
论文地址:https://arxiv.org/pdf/2305.08322v1.pdf
不同颜色的主体表示四个难度等级:初中、高中、大学和专业。
github地址:https://github.com/SJTU-LIT/ceval
C-Eval榜单是一个全面的中文基础模型评估套件(多层次、多学科的语文评价基础模型套件)。它由13948个选择题组成 问题跨越52个不同的学科和四个难度级别,测试集用于模型评估(简单来说就是针对中文模型的综合测试机)
C-Eval榜单地址:https://cevalbenchmark.com/static/leaderboard.html
数据集地址:https://huggingface.co/datasets/ceval/ceval-exam
ChatGLM2-6B
项目地址:https://github.com/THUDM/ChatGLM2-6B
ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:
更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。
更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
更开放的协议:依照 Apache-2.0 协议开源,ChatGLM2-6B 模型的权重的使用则需要遵循 Model License。ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。
效果
相比于初代模型,ChatGLM2-6B在多个维度的能力上,都取得了巨大的提升。
不足:尽管模型在训练的各个阶段都尽力确保数据的合规性和准确性,但由于 ChatGLM2-6B 模型规模较小,且模型受概率随机性因素影响,无法保证输出内容的准确性,且模型易被误导。
部署推理
项目地址:https://github.com/THUDM/ChatGLM2-6B
HuggingFace地址:https://huggingface.co/THUDM/chatglm2-6b
环境配置
首先需要下载本仓库:
git clone https://github.com/THUDM/ChatGLM2-6B
cd ChatGLM2-6B
创建一个新的conda环境,并安装环境依赖
conda create -n chatglm2-6b python==3.9
pip install -r requirements.txt
模型下载
可以使用官方提供的地址,也可以从huggingface下载
官方提供模型下载地址:https://cloud.tsinghua.edu.cn/d/674208019e314311ab5c/
HuggingFace模型下载地址:
https://huggingface.co/THUDM/chatglm2-6b
下载命令(需要提前安装git-lfs):
git clone https://huggingface.co/THUDM/chatglm2-6b.git
我下载到了 /data/sim_chatgpt 路径下。
git-lfs安装
安装git-lfs两种方式,一种是通过命令直接安装,一种是下载到本地后安装:
直接通过命令安装:https://codeleading.com/article/2815391430/
# 先安装git(如已安装可忽略)
sudo apt-get install git
# 安装apt-get源
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
# 安装git-lfs
sudo apt-get install git-lfs
# 初始化git-lfs
git lfs install
如果上面方式出现网速慢等情况,可以尝试本地安装:https://www.cnblogs.com/allmignt/p/12353756.html
这里安装好git-lfs后,直接用git clone命令完成下载。
代码调用
如果想只通过几行代码来测试模型,可以用以下代码:
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("/data/sim_chatgpt/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("/data/sim_chatgpt/chatglm2-6b", trust_remote_code=True, device='cuda')
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
你好 !我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)
晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。
2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。
3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。
4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。
5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。
6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。
基于gradio的网页版Demo
安装gradio
pip install gradio
修改web_demo.py
vi web_demo.py
修改模型加载路径
tokenizer = AutoTokenizer.from_pretrained("/data/sim_chatgpt/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("/data/sim_chatgpt/chatglm2-6b", trust_remote_code=True).cuda()
将share设置为True
demo.queue().launch(share=True, inbrowser=True)
运行web_demo.py
python web_demo.py
显存占用情况
数理逻辑
还有知识推理,长文档理解等能力可以尝试,这里就不再演示。
推理性能
显存占用的减少
ChatGLM2-6B 使用了 Multi-Query Attention,提高了生成速度。生成 2000 个字符的平均速度对比如下,
Model | 推理速度 (字符/秒) |
---|---|
ChatGLM-6B | 31.49 |
ChatGLM2-6B | 44.62 |
- Multi-Query Attention 降低了生成过程中 KV cache的显存占用;
- ChatGLM2-6B 采用 Causal Mask 进行对话训练,连续对话时可复用前面轮次的 KV Cache,进一步优化了显存占用;
显存占用的减小可以使得有限的显卡能审查各行更多的字符,如使用 6GB 显存的显卡进行 INT4 量化的推理时,初代的 ChatGLM-6B 模型最多能够生成 1119 个字符就会提示显存耗尽,而 ChatGLM2-6B 能够生成至少 8192 个字符。
量化等级 | 编码 2048 长度的最小显存 | 生成 8192 长度的最小显存 |
---|---|---|
FP16 / BF16 | 13.1 GB | 12.8 GB |
INT8 | 8.2 GB | 8.1 GB |
INT4 | 5.5 GB | 5.1 GB |
量化对模型性能的影响
官方也测试了量化对模型性能的影响。结果表明,量化对模型性能的影响在可接受范围内。
量化等级 | Accuracy (MMLU) | Accuracy (C-Eval dev) |
---|---|---|
BF16 | 45.47 | 53.57 |
INT4 | 43.13 | 50.30 |
基于 P-Tuning v2 的微调(官方)
P-Tuning v2 将需要微调的参数量减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,最低只需要 7GB 显存即可运行。
环境配置
在原chatglm-6b的环境中安装以下依赖
pip install rouge_chinese nltk jieba datasets
微调数据准备
ADGEN 数据集任务为根据输入(content)生成一段广告词(summary)。
{ “content”: “类型#上衣版型#宽松版型#显瘦图案#线条衣样式#衬衫衣袖型#泡泡袖衣款式#抽绳”, “summary”:
“这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。”
}
从 Google Drive 或者 Tsinghua Cloud 下载处理好的 ADGEN 数据集,将解压后的 AdvertiseGen 目录放到本 ptuning 目录下即可。
微调
修改train.sh文件。
- 去掉最后的 --quantization_bit 4( 去掉后为FP16 精度加载)。
- 修改模型路径,THUDM/chatglm-6b修改为/data/sim_chatgpt/chatglm2-6b
目前专业级GPU Tesla P100也不支持INT4或8量化。
执行train.sh文件
bash train.sh
报错:
wandb.errors.UsageError: api_key not configured (no-tty). call wandb.login(k…
解决:
在main.py文件中加入下面两行,禁用wandb即可。
import os
os.environ["WANDB_DISABLED"] = "true"
其中,train.sh 中的 PRE_SEQ_LEN 和 LR 分别是 soft prompt 长度和训练的学习率,可以进行调节以取得最佳的效果。
微调过程显存使用情况如下:
微调完成后,在./output/adgen-chatglm2-6b-pt-128-2e-2 下回生成微调好的模型文件。
我们可以对比下微调前后的效果。
以命令行 Demo为例,只需修改ptuning路径下web_demo.sh中的模型路径为/data/sim_chatgpt/chatglm2-6b,运行 web_demo.py即可:
bash web_demo.sh
Input:
类型#上衣材质#牛仔布颜色#白色风格#简约图案#刺绣衣样式#外套衣款式#破洞
Label:
简约而不简单的牛仔外套,白色的衣身十分百搭。衣身多处有做旧破洞设计,打破单调乏味,增加一丝造型看点。衣身后背处有趣味刺绣装饰,丰富层次感,彰显别样时尚。
Output[微调前]:
Output[微调后]:
参考:
https://zhuanlan.zhihu.com/p/629864222
https://zhuanlan.zhihu.com/p/640301312
https://zhuanlan.zhihu.com/p/640219437