0x00 前言
在众多企业级应用场景中,GPT 模型具有广泛的实用性。然而,由于 ChatGPT 仅提供在线版本,其应用受到一定限制。近期,笔者通过训练LLaMa,Alpaca、ChatGLM-6B 等众多 10B 以下的小模型,终于找到了一种高效的炼丹方法。
这种方法能够低成本地快速更新模型的知识库,并成功实现预期的对话表现。如下图所示,微调后的ChatGLM6B的模型重新认识了自己:
0x01环境准备
硬件配置建议
部署环境
检验:依次输入以下命令,查看环境是否部署好:
nvidia-smi 查看显卡是否能够正常识别
pytorch查看显卡是否能够正常识别
0x02模型准备
训练脚本:
模型:
创建文件夹 ChatGLM-6B,把训练脚本中的所有文件放置该目录下。
在ChatGLM-6B中,创建 thuglm 文件夹,把模型中所有文件下载后放置在ChatGLM-6B/thuglm 中。切记不要下漏文件。
整理后的文件如图所示:
使用 pip 安装依赖:pip install -r requirements.txt,其中 transformers 库版本推荐为 4.27.1,但理论上不低于 4.23.1 即可。
我们主要采用 cli_demo.py 作为测试训练的交互工具。请编辑修改第 6、7 行代码,将模型路径指向我们刚刚下载的 thuglm。
运行命令 python cli_demo.py,输入你是谁,如下对话出现,说明模型已成功启动:
0x03训练数据准备
本文全程参考了官方的微调方法:
里面已经说的非常详细了,这里主要讲一下自定义的部分:
1. 在 ptuning 文件夹中创建一个名为 AdvertiseGen 的新目录。当然,你可以使用其他名称,但需要相应地修改训练文件中的代码。为了简便起见,我直接使用官方训练的同名文件夹。
2. 准备自定义数据,每行一个 JSON 对象,并将数据写入两个文件当作训练集和测试集:ptuning/AdvertiseGen/train.json和 ptuning/AdvertiseGen/dev.json。
JSON 格式如下:
{"summary": "提示词", "content": "期望生成的结果"}
我们的这次训练目的是让模型说出他是微调后的结果,所以json内容基本以这个为主:
{"summary": "你是谁?", "content": "我是wstart通过ChatGLM -6B微调后的模型,训练编号是:0.08376971294904079"}
准备好后如下图,
注:thuglm是ChatGLM-6B/thuglm的原模型文件,为了方便我这里又复制了一遍。
3. 修改训练文件
4.启动训练
bash train.sh如果看到下图,即开始训练启动成功:
程序会按照加载模型->加载训练数据->训练->保存到output_dir 4个步骤进行。可以查看自己在哪一个步骤出错,进行修改。
每个人的环境不一样,训练的时间不一样,我这个配置训练的时间是大概7-8个小时走完3000轮的epoch,如果看到loss变化不大后,可以自行调整。
当前的配置是1000轮导出一次模型,可以自行修改。
0x04 训练结果
8个小时后,在ptuning/out/adgen-chatglm-6b-pt-8-1e-2/ 看到训练好的模型,checkpoint-x000 ,一般取最新的。
继续使用 cli_demo.py 作为测试训练的交互工具。编辑修改第 6、7 行代码,将模型路径指向我们刚刚训练好的模型
运行命令python cli_demo.py,输入你是谁,如下对话出现,说明模型已成功更新知识库。
0x05局限性
1. 不确定是数据集问题还是其他原因,更新知识库后,部分原有知识丢失,导致某些对话表现不如之前。
2. 官方提到,由于 ChatGLM-6B 规模较小,本身存在诸多局限,此方法主要适用于离线环境下验证 GPT 技术是否能解决特定业务场景。若需实际应用,可能还是需要使用超过 10B 规模的模型和精细的 RLHF 才能达到可用标准。
笔者将持续关注GPT相关前沿进展。感兴趣的朋友可点赞或私信 GPT,加入讨论群交流。
暂无评论内容