前几天给大家讲了一下ChatGLM2-6B部署教程,今天就再给大家来一个模型微调教程

引言

随着ChatGPT的发展,不少企业都想训练出来适用于自己领域的大模型,但是训练一个模型成本是非常高的,中小型企业根本无法承受。今天给大家带来ChatGLM2-6B大语言模型微调训练教程,基于清华大学开源的大语言模型(GitHub:ChatGLM2-6B)进行微调,可以用非常少的成本训练出自己行业领域的大模型。

软硬件条件

系统

系统推荐 Ubuntu 22.x ,因为P-Tuning v2不支持Windows多卡。
如果是单卡跑的话,使用Windows也是可以的,详细修改教程参照:issues#195

硬件

微调不需要多高的硬件,但也要满足最低硬件要求:

CPU:8核心以上
内存:32G以上
显卡:仅支持英伟达(NVDA)显卡,推荐最近新出卡,能加快微调速度。
显存:显存推荐16G以上,最低8G。
单卡多卡:推荐多卡,单卡也是可以的。

数据准备

下面给大家几条数据示例:

{"content":"你好","summary":"您好,我是人工智能助理iBot机器人。"}
{"content":"你叫什么名字?","summary":"我的名字叫做iBot机器人。"}
{"content":"你有什么功能?","summary":"我可以解决您在使用网站时遇到的各种问题。"}
{"content":"每次签到可以获得多少金币","summary":"您可以通过签到获取金币。每次签到获得的金币数量在5个~100个不等。签到获得的金币支持累加,但有一定的上限,普通用户通过签到最大累计金币数为30个,捐赠用户通过签到最大累计金币数为300个。"}
{"content":"软件闪退、黑屏、无法使用的原因是?","summary":"软件闪退、黑屏、无法使用的原因可能包括:软件需要输入ID但用户输入了自己的ID导致闪退;软件与当前iOS版本不兼容;以及软件自身存在问题。"}
{"content":"软件提示“输入ID”怎么办?","summary":"当软件打开后需要输入ID时,千万不要输入自己的ID,否则可能导致软件闪退或黑屏。iOS6系统:首先退出软件,回到桌面,在打开软件的一瞬间,迅速按下息屏键,再迅速点亮屏幕,继续使用软件就不会提示了(如果不行的话,多试几次)。非iOS6系统:仅仅对爱思正版软件有效:手机需要链接一次电脑版爱思,它会在你手机上面安装个爱思手机版,这个时候再打开爱思版免ID软件,就不会再提示需要id了。相似的,同步正版和91正版,自然需要下载个同步助手和91助手了。"}

上述仅给大家提供几条数据示例,具体微调过程中,还需要根据微调结果增加/减少/调整数据内容和条数。

讲这些数据存放到新建文件train.json
train.json

拉取项目

这一步其实没必要讲的,就是把项目从Github里面克隆出来 或者 直接下载zip文件 都是可以的。

项目环境部署可以参考下方文章,但也仅作为参考,因为之前讲的是windows的环境下部署,本次微调使用的系统是ubuntu,虽有不同,但大同小异,下文仅供参考。
[post cid="82" /]

微调

软件依赖

运行微调除 ChatGLM2-6B 的依赖之外,还需要安装以下依赖

pip install rouge_chinese nltk jieba datasets

修改微调代码

微调代码文件路径:项目地址/ptuning/train.sh
train.sh
文件部分参数我在这里给大家解读一下:
PRE_SEQ_LEN=128 预处理序列的长度,假设你的微调数量很小(约莫有100条)建议调低到64
LR=2e-2 学习率,它决定了模型在每次更新权重时所采用的步长。较小的学习率会导致训练过程缓慢,而较大的学习率可能会导致训练过程不稳定。若微调数据量很小(约莫有100条)可以使用较大的学习率例如2e-1

学习率较小会导致训练缓慢loss不收敛,较大会导致模型出现遗忘问题、过度拟合。这个参数需要自行研究,找到属于你数据量的最优解。

对于:per_device_train_batch_size 1 per_device_eval_batch_size 1 以及 gradient_accumulation_steps 16请前往Github查看或参阅下方引用:

一次训练迭代会以 1 的批处理大小进行 16 次累加的前后向传播,等效为 16 的总批处理大小,此时最低只需 6.7G 显存。若想在同等批处理大小下提升训练效率,可在二者乘积不变的情况下,加大 per_device_train_batch_size 的值,但也会带来更多的显存消耗,请根据实际情况酌情调整。

修改例子:

    源代码:
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 16 \
    修改后:
    --per_device_train_batch_size 4 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 4 \
    亦或者:
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 2 \
    还可以:
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 2 \
    --gradient_accumulation_steps 2 \

微调数据放置

将微调数据train.json放置到路径:项目地址/ptuning/AdvertiseGen/train.json
train.json 放置路径
至于dev.json这个文件,就是训练后你想要什么结果存放到里面,内容示例:

{"content":"你好啊","summary":"您好,我是人工智能助理iBot机器人。"}
{"content":"你的叫什么?","summary":"我的名字叫做iBot机器人。"}
{"content":"你可以做什么?","summary":"我可以解决您在使用网站时遇到的各种问题。"}

开始微调:

bash train.sh

微调后部署

这个就不讲了,就是把部署后的模型跑出来,请参阅:ptuning#模型部署

我这里的话,直接接入了QQ机器人,就直接演示一下在qq群内的对话吧:
运行状态
群对话:


例子0
例子1