笔记·低成本在云上微调ChatGLM2-6B
前言
最近清华大学又给我们整出了ChatGLM2-6b,其性能相比上一代拥有了较大的提升。如果想要微调现有的大语言模型,现在也许是个不错的时机。
本篇文章将介绍如何使用较低的成本在云上微调自己的模型。
相关链接:
THUDM/ChatGLM2-6B: ChatGLM2-6B: An Open Bilingual Chat LLM | 开源双语对话语言模型 (github.com)
THUDM/chatglm2-6b · Hugging Face
训练集准备
想办法整来足够的对话训练集,分为训练集(train.json
)和验证集(dev.json
)。
下面是官方给出训练集格式示例
具体的格式如下:
我们本次使用的训练集部分内容(为了训练独一无二的模型,训练集最好自己撰写,但是很耗时间):
买服务器
在寻找教程的过程中,也找到了阿里云的PAI平台教程,它可以给你3个月的免费使用时长,如果暂时使用的话,可以先用着它,相关教程:LangChain+ChatGLM2-6B搭建知识库 - BOTAI
选择服务器时,为了保证最低成本,我们选择的是阿里云的抢占式实例,平均费用只有1~2元/小时,由于阿里云的抢占式实例在启动1个小时后,如果全网资源紧张,实时价格超出了您的出价,您的实例会在10分钟内被释放(有短信通知),此时注意备份您的模型文件以防资源被释放后无法找回。
由于购买阿里云的抢占式实例时需要预留100元的账户余额,因此对您的经济实力有一定要求。
在阿里云 - 弹性计算中购买ECS实例,相应的配置如下:
项 |
推荐选择 |
付费类型 |
抢占式先例 |
地域 |
北京(推荐) 可以去这里查询所有可用地域以获得最低出价 |
实例 |
ecs.gn6e-c12g1.3xlarge (A100/32G显存) (注:32G显存是比较稳妥的配置,如果你没钱,选择A10/16G也未尝不可) |
实例使用时长 |
无确定使用时长 |
镜像 |
CentOS(如果有)/Ubuntu 安装(并安装GPU驱动+训练/推理加速(如果有)) |
系统盘 |
ESSD 50G + SSD 50G以上 (SSD不能勾选随实例释放) |
带宽峰值 |
100Mbps |
登录凭证 |
自定义密码 |
建议价格:¥2元/小时以内(不包含公网费用和磁盘费用)
有必要提一下:节假日或者是晚上的时候,抢占式实例是很tm贵的,最高可以去到十几块一个小时,因此,在别人上学/上班的的时候去训练模型是最划算的。
这里顺便再提一下为什么要加一块SSD。这块SSD主要用于存储你的模型文件和ChatGLM2-6b的模型,以便在实例被释放的时候下载它们/挂载到另一台服务器上。SSD即使便宜,一直放在那里也是很贵的,下载完之后记得释放,不然会造成很大的经济损失(要记得你的账户余额可是有100块以上)
环境配置
看来你已经买好了服务器,现在我们可以开始配置环境了。
现在我们拥有了ChatGLM2-6B的源码,现在来安装Python环境(如果提前配置好的话可以跳过)
然后安装依赖
至此环境搭建成功,我们可以跑一下web_demo.py
来看看能不能跑起来ChatGLM2-6B,但是没必要这么做,除非你手动指定模型位置,不然它会在.cache
目录下自动下载模型文件
现在来做训练前的准备
现在上传你的训练集和验证集,然后可以开始训练
修改train.sh
并运行以开始训练
疑难杂症
RuntimeError: Library cublasLt is not initialized
解决方法:
git clone
速度慢
解决方法:解决阿里云ECS服务器 git clone 速度慢_zwkkkk1的博客-CSDN博客
没有apt
自行去官网下源码编译安装
error: RPC failed; result=35, HTTP code = 0 fatal: The remote end hung up unexpectedly
解决方法
推理
当你看到这样的输出之后,恭喜您,你的模型已经准备好推理了
修改evaluate.sh
以开始测试推理
执行完成后,会生成评测文件,评测指标为中文 Rouge score 和 BLEU-4。生成的结果保存在 ./output/$CHECKPOINT/generated_predictions.txt。在评测数据中,含有与验证集相同的输入,labels 是 dev.json
中的预测输出,predict 是 ChatGLM2-6B 生成的结果,对比预测输出和生成结果,评测模型训练的好坏。如果不满意调整训练的参数再次进行训练。
现在我们来使用web_demo.sh
部署我们的模型
注:有些时候你无法访问云服务器的本地接口,检查你的服务器配置或联系客服以解决问题
后话
经过咱后期的进一步推理测试,她还是忘不了自己是个ai(哭),并且由于上下文之间的关系,因此即使拿出训练集的prompt来问,也不能得出预期内的回答,后面应该会拿train_chat.sh
来训练,并且调整最大步数,以防过拟合现象的出现。