写这篇blog的时候GLM-4-9B也开源了,性能看描述比6B好了很多。 但是还没尝试,但是看AutoDL上已经有弄好的社区镜像了,估计可以尝试。

快速部署上云

考虑到如果只是做个toy,然后toy又希望搞点比如微调之类的二次开发,但又不想老老实实地在自己服务器上配环境,那最简单的方式其实就是镜像。

腾讯云

网址如下 https://buy.cloud.tencent.com/hai 随后在选择应用上选择ChatGLM3 6B即可,然后GPU一定选进阶型(不过之前用过是V100来着) 创建完实例以后,进去以后环境方面基本无需担心。

AutoDL

网址如下 https://www.autodl.com/create 算力在购买界面拉到下面选社区镜像,算力提供了3090,L20,V100,A800,可以租多卡,建议多卡

直接测试

cli_demo里的是脚手架的测试,给出命令行交互 进basic_demo跑web_demo_gradio.py会给出网页(但是服务器上一般用不到)

微调

进finetune_demo目录,config下给出了 SFT 全量微调,P-TuningV2 微调和LORA 微调

单机单卡测试Lora python finetune_hf.py data/AdvertiseGen/ THUDM/chatglm3-6b configs/lora.yaml

微调内容格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"conversations": [
{
"role": "user",
"content": "1.你的任务是将问题转化为SQL。\\n2.你已知的表students (name, student_id, class, year, chinese, math, english, physics, chemistry, biology, politics, history, geography, teacher) 。\\n 3.问题:2018年陈婷的数学成绩是多少?"
},
{
"role": "assistant",
"content": "SELECT math FROM students WHERE name = '陈婷' AND year = 2018;"
}
]
}
{
"conversations": [
{
"role": "user",
"content": "1.你的任务是将问题转化为SQL。\\n2.你已知的表students (name, student_id, class, year, chinese, math, english, physics, chemistry, biology, politics, history, geography, teacher) 。\\n 3.问题:2021年英语成绩最高的三位同学是?"
},
{
"role": "assistant",
"content": "SELECT name FROM students WHERE year = 2021 ORDER BY english DESC LIMIT 3;"
}
]
}

更多内容直接参考https://github.com/THUDM/ChatGLM3/tree/main/finetune_demo即可

微调方法的区别

SFT (Soft Prompt Tuning)

核心思想:在预训练模型中引入一组可学习的软提示,这些提示可以捕获特定任务的额外信息,而无需对模型的主体进行大规模调整。

实现方式:软提示作为可训练的向量被添加到输入token的嵌入层或者模型的中间层。在微调过程中,只更新这些软提示的参数,而模型的原始权重保持不变。

优势:通过少量可训练参数即可实现任务适应性,保留了预训练模型的大部分通用知识,同时减少了计算资源和数据需求。 ## P-TuningV2 核心思想:通过一个辅助的连续提示编码器生成任务特定的软提示,从而实现对预训练模型的精确调整,而不改变其原始权重。

实现方式:引入一个额外的提示编码器,该编码器生成软提示并将其注入到预训练模型的适当位置。在训练过程中,只更新这个提示编码器的参数。

优势:提供了更灵活的任务适应性,通过连续的提示编码器可以更好地捕捉任务特定的特征,同时保持了预训练模型的整体结构不变。 ## LORA (Low-Rank Adaptation) 核心思想:当大型模型被用于特定任务时,实际上只有其中一小部分参数扮演了关键角色。

实现方式:尽管参数矩阵的维度非常高,但模型的原始权重矩阵被分解为两个较小的矩阵,一个是低秩矩阵,另一个是适配矩阵。在微调过程中,只有适配矩阵会被训练,而原始的预训练权重保持不变。

优势:这种方法允许模型在新的任务上快速适应,同时保留了预训练时学到的通用语言知识,实现了参数效率高的微调策略。