ChatGLM2-6B、ChatGLM-6B 模型训练自己数据集实战

news/2024/11/17 8:48:44/

根据以下两位博主文章汇总整理:

ChatGLM2-6B、ChatGLM-6B 模型介绍及训练自己数据集实战_dream_home8407的博客-CSDN博客

ChatGLM-6B模型部署以及ptuning微调详细教程_sawyes的博客-CSDN博客

介绍

ChatGLM-6B是开源的文本生成式对话模型,基于General Language Model(GLM)框架,具有62亿参数,结合模型蒸馏技术,实测在2080ti显卡训练中上(INT4)显存占用6G左右,

优点:

1.较低的部署门槛: FP16 半精度下,ChatGLM-6B 需要至少 13GB 的显存进行推理,结合模型量化技术,一需求可以进一步降低到 10GB(INT8) 和 6GB(INT4), 使得 ChatGLM-6B 可以部署在消费级显卡上。
2,更长的序列长度: 相比 GLM-10B(序列长度1024),ChatGLM2-6B 序列长度达32K,支持更长对话和应用。
3,人类意图对齐训练: 使用了监督微调(Supervised Fine-Tuning)、反馈自助(Feedback Bootstrap)、人类反馈强化学习(Reinforcement Learning from Human Feedback) 等方式,使模型初具理解人类指令意图的能力。输出格式为 markdown,方便展示。目前已开源监督微调方法,

不足:

1,模型容量较小: 6B 的小容量,决定了其相对较弱的模型记忆和语言能力,随着自己训练数据数量和轮次增加,会逐步丧失原来的对话能力,智谱ai于魁飞博士给的训练数据再好在1000条左右。

2,较弱的多轮对话能力:ChatGLM-6B 的上下文理解能力还不够充分,在面对长答案生成,以及多轮对话的场景时,可能会出现上下文丢失和理解错误的情况。解决方式:外挂知识库的形式,例如ChatGLM-6B 结合 langchain 实现本地知识库link

3,训练完自己的数据后,遗忘掉之前对话的能力,出现灾难性遗忘,解决办法在自己专业领域数据上可以加入通用开源的对话微调数据集一起训练。

ChatGLM2-6B和ChatGLM-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。
更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。

微调:

1.1,ChatGLM2-6B官方开源的训练方式基于P-Tuning v2微调:
链接: git_link
基于QLoRA
链接: git_link

1.2,ChatGLM-6B基于P-Tuning v2微调:
链接: git_link

数据集:

样例数据下载链接
链接: Dataset
将自己的数据集换成以下格式:

{"content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳","summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。"
}

如需要使用多轮对话数据对模型进行微调,可以提供聊天历史,例如以下是一个三轮对话的训练数据:

{"prompt": "长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", "response": "用电脑能读数据流吗?水温多少", "history": []}
{"prompt": "95", "response": "上下水管温差怎么样啊?空气是不是都排干净了呢?", "history": [["长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", "用电脑能读数据流吗?水温多少"]]}
{"prompt": "是的。上下水管都好的", "response": "那就要检查线路了,一般风扇继电器是由电脑控制吸合的,如果电路存在断路,或者电脑坏了的话会出现继电器不吸合的情况!", "history": [["长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", "用电脑能读数据流吗?水温多少"], ["95", "上下水管温差怎么样啊?空气是不是都排干净了呢?"]]}

训练时需要指定 --history_column 为数据中聊天历史的 key(在此例子中是 history),将自动把聊天历史拼接。要注意超过输入长度 max_source_length 的内容会被截断。

可以参考以下指令:

bash train_chat.sh

遇到问题:

1、如何运行.sh脚本,安装git,打开Git Bash,运行。

2、微调单独设置venv环境,防止版本冲突:

$ python -m venv venv
$ source venv/Scripts/activate


3、web_demo.py运行遇到问题:

(1)“THUDM/chatglm-6b”路径无法读取,换成“THUDM\\chatglm-6b”

  (2)  bash train.sh运行没反应,修改“CUDA_VISIBLE_DEVICES=0 python3 main.py \” 为 “CUDA_VISIBLE_DEVICES=0 python main.py \”

(3)PyCharm终端下,cuda加载不成功,没细研究,换成Git Bash终端就好。

(4)测试脚本

import os
import torch
from transformers import AutoConfig, AutoModel, AutoTokenizerMODEL_PATH = "THUDM\\chatglm-6b"
CHECKPOINT_PATH = "ptuning\\output\\adgen-chatglm-6b-pt-128-2e-2\\checkpoint-3000"# 载入Tokenizer
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)config = AutoConfig.from_pretrained(MODEL_PATH, trust_remote_code=True, pre_seq_len=128)
model = AutoModel.from_pretrained(MODEL_PATH, config=config, trust_remote_code=True).cuda()prefix_state_dict = torch.load(os.path.join(CHECKPOINT_PATH, "pytorch_model.bin"))
new_prefix_state_dict = {}for k, v in prefix_state_dict.items():if k.startswith("transformer.prefix_encoder."):new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v
model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)print(f"Quantized to 4 bit")
model = model.quantize(4)
model = model.half().cuda()
model.transformer.prefix_encoder.float()
model = model.eval()print("用户:你好\n")
response, history = model.chat(tokenizer, "你好", history=[])
print("ChatGLM-6B:\n",response)
print("\n------------------------------------------------\n用户:")line = input()
while line:response, history = model.chat(tokenizer, line, history=history)print("ChatGLM-6B:\n", response)print("\n------------------------------------------------\n用户:")line = input()


 


http://www.ppmy.cn/news/814868.html

相关文章

国开《Android智能手机编程》终结性考核

考核说明: 提交一个自主开发的、可实现具体功能的Android应用。为了更好地完成开发,请按照课程提供的步骤逐一提交。 在第10周前提交作业。 第一步:上传需求分析文档(5分) 第二步:上传概要设计文档&#xf…

基于Android、iOS平台的移动端银行卡识别技术,手机拍照识别录入银行卡号

目前,在众多需要录入银行卡信息才能办理的业务仍然停留在纯手工录入的方式,流程繁琐又耗时,造成业务办理的等待时间长,流程效率低,顾客抱怨增多,运营成本也在不断增大等问题。在互联网和大数据时代&#xf…

Java校验身份证、手机号、银行卡号

public String saveGreenPerson(HttpServletRequest request) {String msg "验证未通过";String id request.getParameter("id");String username request.getParameter("username");String tel request.getParameter("tel");Stri…

华为OD机试真题 C++ 实现【猜数字】【2023 Q1 | 100分】

所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录 题目 设定一组四码的数字作为谜底,另一方猜每猜一个数,出数者就要根据这个数字给出提示,提示以XAYB形式呈现,直到猜中位置。 其中X表示位置正确的数的个数…

中国大学生计算机设计大赛人工智能挑战赛——智慧导盲犬(重工商)

第十五届中国大学生计算机设计大赛——智慧导盲犬赛项经历分享 从baselines出发,基于PaddleDetection,一步步改进模型到部署untree GO1的jeston nano上 一、前言 中国大学生计算机设计大赛是由教育部高等学校计算机类专业教学指导委员会、教育部高等学校软件工程…

【100%通过率】华为OD机试真题 C 实现【最接近最大输出功率的设备 /查找充电设备组合】【2023 Q1 | 200分】

所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录 题目 题目描述 某个充电站,可提供n个充电设备,每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和,均构成功率集合P的1个元素。功率集合P的最优元素…

【java养成】:案例(模拟银行新用户现金业务办理、USB接口程序设计、身份证校验位和身份提取)

案例1:模拟银行新用户现金业务办理 实验内容: 1) 银行新用户开户 2) 欢迎用户光临和欢迎用户下次光临 3) 存钱 4) 取钱 案例代码: Bank类: package cn.Bank;public class Bank {static String Name;private String …

手机拍照银行卡识别银行卡号的技术sdk

手机拍照银行卡识别银行卡号的技术sdk 1、手机拍照银行卡识别银行卡号的技术背景分析 手机支付、网络支付已经非常成熟,消费者已经习惯了使用手机支付宝进行支付,用手机银行进行消费和转账。但是,整个线上支付流程中,还存在一个关键的步骤--输入转出银 行卡卡号。尤其是一些…