首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

两行代码开启 LoRA 微调&LLM 情感实体抽取实践

Huggingface 开源的 大模型高效微调工具包,让普通老百姓玩起大模型不再是梦。下面介绍了笔者的一个 github 仓库,对代表性中文大模型进行 LoRA 微调,只要你有训练数据,然后本地下载好大模型的checkpoint,就可以最少只需 2 行代码就可以微调你自己的 LLM。然后,介绍了我使用这个工具,进行 LLM 情感实体抽取的一个实践。

仓库地址:https://github.com/beyondguo/LLM-Tuning

目前支持:

清华 ChatGLM-6B 的 LoRA 微调

百川智能 baichuan-7B 的 LoRA 微调

更多模型持续更新中...

两行代码开启训练

数据集分词预处理:,对比不同的 LLM,需在 tokenize.sh 文件里切换 model_checkpoint 参数

开启 LoRA 微调:,对于不同的 LLM,需切换不同的 python 文件来执行:

ChatGLM-6B 应使用

baichuan-7B 应使用

环境准备

目前测试的环境为:

教程:

下面的教程以及代码使用 作为例子,如果更换其他模型,可能需要略微修改具体文件代码。

1. 指令微调数据准备

原始文件的准备

指令微调数据一般有输入和输出两部分,输入是特定的content加上instruction,这里我们将二者直接拼在一起,不单独区分;输出则是希望模型的回答。我们统一使用的格式在整理数据,可以自定义输出输出的字段名,例如下面的例子中我使用的是和代表模型的输入和输出:

整理好数据后,保存为或者文件,然后放入目录中的文件夹中。

对数据集进行分词

为了避免每次训练的时候都要重新对数据集分词,我们先分好词形成特征后保存成可直接用于训练的数据集。

例如,

我们的原始指令微调文件为: 文件夹下的 文件

输入字段为,输出字段为

希望经过 tokenize 之后保存到 下名为 的文件夹中

设定文本最大程度为 2000

则我们可以直接使用下面这段命令 (即文件) 进行处理:

处理完毕之后,我们会在 下发现名为 的文件夹,这就是下一步中我们可以直接用于训练的数据。

2. 使用 微调

得到 tokenize 之后的数据集,就可以直接运行 来训练 LoRA 模型了,具体可设置的主要参数包括:

, 分词后的数据集,即在 data/tokenized_data/ 地址下的文件夹名称

, 设置 LoRA 的秩,推荐为4或8,显存够的话使用8

, 每块 GPU 上的 batch size

, 梯度累加,可以在不提升显存占用的情况下增大 batch size

, 训练步数

, 多少步保存一次

, 保存多少个checkpoint

, 多少步打印一次训练情况(loss, lr, etc.)

, 模型文件保存地址

例如我们的数据集为 simple_math_4op,希望保存到 weights/simple_math_4op ,则执行下面命令(即文件):

训练完之后,可以在 output_dir 中找到 LoRA 的相关模型权重,主要是和两个文件。

如何查看 tensorboard:

在 output_dir 中找到 runs 文件夹,复制其中日期最大的文件夹的地址,假设为

执行 命令,就会在 http://localhost:6006/ 上开启tensorboard

如果是在服务器上开启,则还需要做端口映射到本地。推荐使用 VSCode 在服务器上写代码,可以自动帮你进行端口映射。

如果要自己手动进行端口映射,具体方式是在使用 ssh 登录时,后面加上 参数,将服务器端的6006端口映射到本地的6006端口。

3. 拿走 LoRA 小小的文件,到你本地的大模型上加载并推理

我们可以把上面的 output_dir 打包带走,假设文件夹为 , 其中(至少)包含 和 两个文件,则我们可以用下面的方式直接加载,并推理

理论上,可以通过多次执行 的方式,加载多个 LoRA 模型,从而混合不同Tool的能力,但实际测试的时候,由于暂时还不支持设置不同 LoRA weights的权重,往往效果不太好,存在覆盖或者遗忘的情况。

情感实体抽实践 | 效果展示

我最近对使用 LLM 做信息抽取比较感兴趣,因此我微调的目的是让模型做某些特殊场景下的复杂抽取。比如对于下面这段文本(我个人胡编乱造的新闻):

在情感分析中,我们不仅想知道新闻的情感,更想知道其中涉及的各种实体的情感,以及对应的原因。这类似于“方面情感分析”任务,然而LLM时代前的模型很难做好这个任务。

我设计了这样的 instruction:

然后交给ChatGPT来做,下面是 ChatGPT 的输出:

可见效果还是非常好的。

然后我们直接试试 ChatGLM-6B 呢:

乍一眼好像还行,但仔细一看,存在情感理解错误、漏掉实体等情况,例如“亚牛逊”应该是中性,"腾势"、"艾里”应该是积极的,漏掉了"视觉中国"。

然后,我使用 ChatGPT 的 API(gpt-3.5-turbo) 标注了大概一万多条数据,使用我的仓库进行微调,下面是微调后的效果,姑且称之为 ChatGLM-6B-lora

不解释了,非常不错!

对于百川大模型(baichuan-7B),这其实是一个基座模型,没有Chat能力,所以原始模型对这样的 instruction 根本无法输出,经过我的微调之后,也具备了听从instruction的能力,称之为 baichuan-7B-lora 吧:

这里有点搞笑,我明明给的新闻都是“谷嘎”,“万度”,“腾势”这样的我编造的公司(虽然大家肯定知道我改编自是哪家公司)这个百川居然都给我掰回来了。。。甚至,“巨硬”它都能给我掰回来成“微软”。。。真不知道是该夸它呢,还是该骂它。

不过,至少也让一个从来都不会听 instruction 的基座模型,听从我的抽取指示进行十分规范地抽取了。

以上。

欢迎大家使用我的这个仓库:

https://github.com/beyondguo/LLM-Tuning

Acknowledgement

首先最感谢的是 Huggingface 团队开源的 peft (https://github.com/huggingface/peft) 工具包,懂的都懂!

ChatGLM 的 LoRA 微调代码主要基于 ChatGLM-Tuning (https://github.com/mymusise/ChatGLM-Tuning) 项目中的 LoRA 微调部分修改而来;

baichuan-7B 微调部分,参考了 LLaMA-Efficient-Tuning (https://github.com/hiyouga/LLaMA-Efficient-Tuning) 项目中的解决方案;

对这些优秀开源项目表示感谢!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230619A08DKO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券