使用微信聊天记录训练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)
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。