使用微信聊天记录训练AI(ChatGLM3-6B)

NemoHi 2024-10-21 16:31:02 阅读 51

基于LORA使用微信聊天记录微调ChatGLM3-6B

写在前面:本人0基础,计科专业,会点前后端,没做过任何机器学习内容。以下内容为一周的学习结果,肯定会有表达错误或不当的地方,欢迎批评指正。

最终训练的结果测试后感觉与自己本人想象中的差距甚远,可能与训练集较少(用了两年的聊天记录)和训练参数调整不合理有关,先给大家泼一盆冷水。

硬件依赖

来自 腾讯云 算力管理 - 高性能应用服务 - 控制台 (tencent.com)

软件依赖

VSCode

MemoTrace(用于导出微信聊天记录) Releases · LC044/WeChatMsg (github.com)

一、获取硬件设备

这个是根据小时计费,而具体训练多少小时根据聊天记录数据量不同而不同。方便的是,我们可以直接选择 ChatGLM3-6B 这个模型,选择后我们的服务器会自带模型和DEMO,不需要我们手写任何一行代码

二、使用MemoTrace导出聊天记录

得益于MemoTrace的免费且强大的功能,我们能够直接导出聊天记录的训练集 train.json 和 dev.json(JSON格式)。

我们其实可以从MemoTrace的官网找到导出教程和训练教程。大模型训练指南(ChatGLM3-6B) | MemoTrace

如果您有相应基础,上面的教程其实就可以完成我们今天的任务。当然你也可以接着本教程往下看,本教程会更加入门和详细。

三、使用VSCode连接服务器

SSH连接后打开/root/文件夹即可。腾讯云为我们定制的ChatGLM3-6B服务中包含了这些文件。

其中第一个是DEMO,第二个是模型,因此我们的本地模型的路径就是 <code>/root/chatglm3-6b-model ,不需要额外从网络拉取模型。

四、浅尝ChatGLM3-6B(可选)

我们当前在 /root文件夹下,在文件浏览器里找到下图文件,并把模型路径改为本地路径。

完成后我们运行这个程序即可尝试原生的ChatGLM3-6B模型,运行代码为:<code>python cli_demo.py当然运行前你需要用cd命令进入basic_demo这个文件夹中。

如果不出意外,终端就会让你输入内容,你可以尝试与其对话。

五、使用LoRA微调模型(给ChatGLM3加点你的聊天记录)

首先,好消息是你不需要手写任何代码,因为ChatGLM给我们提供了demo,坏消息是你需要配置环境才能正常运行代码。(NEMO在这里耗时n小时,但其实很简单。)以下直接给答案,可以直接抄作业。

screen的安装

由于训练时间很长,一旦我们关闭电脑或者关闭vscode,机器就停止训练了,因此我们得需要把训练放在后台运行。

下载screen apt install screen

创建screen screen -S NEMO 这个NEMO是窗口名,可以任意。

然后会自动进入screen,之后的操作均在这个叫NEMO的screen里。

之后的退出当前窗口和重进窗口请自行百度,这里不赘述。

screen乱码问题解决

这也是个坑,很讨厌!你现在不知道是什么问题,待会训练时大概率会遇到,总之我是遇到了,被烦了几个小时。

首先在终端输入

vim /etc/screenrc

进入vim编辑模式(没vim基础请自己查阅资料),输入i 进入插入模式将里面的内容全部换成下面的:

defutf8 on

defencoding utf8

encoding UTF-8 UTF-8

按esc --- :wq --- 回车

新建screen,则能正确显示。

之后返回窗口必须使用

screen -U -r NEMO

也就是多加一个-U

若没用,可先删除刚刚的NEMO screen重新创建一个。

环境配置

首先假设我们在 /root/ 文件夹下。

cd ChatGLM3/finetune_demo/

使用conda下载mpi4py

conda install mpi4py

文件管理器中找到requirement.txt,删除后两行。

然后在终端中输入

<code>pip install -r requirments.txt

至此,我们完成了训练所需的部分库,还有一些库在我们运行时会提示我们安装,到时候再进行安装。

复制train.json和dev.json到服务器中

我们在finetune_demo中创建一个叫data的文件夹,并把我们用MemoTrace导出的两个文件复制进去。注意进行改名。

改名是因为我们的 lora.config 里面定义了叫这俩名。不改的话它会找不到。

修改 lora.ymal配置文件

这里面有很多配置文件,我尝试使用默认的配置训练时发现会遇到显存溢出的问题,所有我自己进行了一些配置修改,具体修改结果在下方,全选复制粘贴即可。

data_config:

train_file: train.json

val_file: dev.json

test_file: dev.json

num_proc: 8

max_input_length: 128

max_output_length: 256

training_args:

 # see `transformers.Seq2SeqTrainingArguments`

output_dir: ./output

max_steps: 3000

 # needed to be fit for the dataset

learning_rate: 5e-5

 # settings for data loading

per_device_train_batch_size: 2

dataloader_num_workers: 8

remove_unused_columns: false

 # settings for saving checkpoints

save_strategy: steps

save_steps: 500

 # settings for logging

log_level: info

logging_strategy: steps

logging_steps: 10

 # settings for evaluation

per_device_eval_batch_size: 8

evaluation_strategy: steps

eval_steps: 500

 # settings for optimizer

 # adam_epsilon: 1e-6

 # uncomment the following line to detect nan or inf values

 # debug: underflow_overflow

predict_with_generate: true

 # see `transformers.GenerationConfig`

generation_config:

  max_new_tokens: 512

 # set your absolute deepspeed path here

 #deepspeed: ds_zero_2.json

 # set to true if train with cpu.

use_cpu: false

peft_config:

peft_type: LORA

task_type: CAUSAL_LM

r: 8

lora_alpha: 32

lora_dropout: 0.1

六、开始训练

保证自己在<code>/root/ChatGLM3/finetune_demo文件夹下输入以下命令开始训练。

python finetune_hf.py data/ /root/chatglm3-6b-model configs/lora.yaml

其中data/是刚刚复制train.json和dev.json的文件夹,第二个/root/chatglm3-6b-model是模型的路径,configs/lora.yaml是配置文件路径。如果按照上述教程来的,那么不需要更改任何内容直接复制本命令即可。

正确运行后,正常情况下,终端会提示你找不到一个叫ntlk还是啥的module,直接pip intall ntlk就行了(我忘记这个库叫什么了)安装后再次运行应该就跑起来了!

若发现乱码问题请查看本教程5.2中的解决screen乱码问题。

附一张正确运行的大致截图(本图截取时已经训练了几个小时了)

七、测试训练结果

训练结束后,outputs文件夹下会存放结果。我们可以直接使用以下命令进行测试。

<code>python inference_hf.py output/checkpoint-3000/ --prompt "喜欢你 找你一下"

注意因为我lora.ymal配置写的max_steps: 3000,所以最后一个模型的文件夹是 checkpoint-3000。关于测试的命令,具体可查看官方的文档。

ChatGLM3/finetune_demo/lora_finetune.ipynb at main · THUDM/ChatGLM3 (github.com)



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。