NLP(九十三)使用HuggingFace-TRL微调Qwen1.5-7B模型(SFT)
本文将会介绍如何使用HuggingFace开源的
trl
模块来对阿里的通义千问模型Qwen1.5-7B
进行微调(SFT),并分享笔者在SFT过程中遇到的坑。
笔者之前的文章NLP(六十三)使用Baichuan-7b模型微调人物关系分类任务和NLP(九十二)大模型时代下的微博新闻标题生成中分别介绍了如何使用大模型训练工具firefly
和LLaMA-Factory
来完成大模型微调(SFT阶段)。
本文将会利用更加基础的HuggingFace开源的trl
模块来实现大模型微调(SFT),这次我们自己来实现SFT!
trl
模块是一个全栈模块,它为我们提供了一系列工具来通过强化学习训练
Transformer语言模型,从Supervised Fine-tuning (SFT)、Reward Modeling
(RM) 到Proximal Policy Optimization (PPO) 都能很好地支持。
该模块已经与HuggingFace的transformers模块进行了高度集成。
Qwen1.5-7B
是阿里在今天2月份发布的通义千问大模型的新版本,参数量为70亿,性能更好更强大。本文将会介绍如何使用trl
模块对该模型进行微调(SFT)。我们以文本分类任务为例,数据集采用Sougou
Mini分类数据集,共5个类别。
本文将介绍两种形式的SFT:
- 指令微调(Instruction Tuning)
- 对话微调(Chat Tuning)
指令微调
所谓指令微调,指的是数据以Instruction(指令)-Input(输入)-Output(输出)的形式进行组织,其中Input(输入)可以为空,格式如下:
1 |
|
我们将文本分类任务的训练数据集加工成上述形式:
1 |
|
注意:加工后的数据集只有text字段。
使用trl
模块对模型进行微调,PEFT方法采用Lora,训练脚本如下:
1 |
|
训练完后,会在对应的otutput目录下生成adaper模型文件,我们加载该模型,并在测试集上进行评估,脚本如下:
1 |
|
结果如下:
1 |
|
细心的读者可能注意到,我们在使用训练好的大模型进行生成预测的时候,对生成结果进行了后处理generated_texts[0].split('\n')[0]
,即只取换行符前面的部分,这是因为大模型生成了10个新的token。
此时,我们还不能完全控制大模型的生成行为,但它总体上遵循了我们的数据指令,只是我们无法知道什么是生成预测的结标志束,只好以换行符为标志。
对话微调
为了改善上述训练后模型的行为,我们使用对话微调
,即使用对话模板来加工训练数据。
在transformers中的tokenizer中引入了apply_chat_template
方法,我们来看个简单的例子:
1 |
|
输出如下:
1 |
|
可以看到Qwen1.5-7B
模型的默认对话模板为GPT3.5模型的ChatML格式(无BOS/EOS这两个token)。
我们将数据加工成对话形式,如下:
1 |
|
训练脚本如下:
1 |
|
该训练脚本的区别在于我们将数据加工成了对话形式,使用tokenizer.apply_chat_template方法。
对训练好的模型进行预测(注意generate函数的参数):
1 |
|
此时我们设置了预测生成时的eos_token_id,这样我们就能控制大模型生成的行为了,即生成的文本只有文本分类任务的类别,这就达到了我们的目标。
总结
本文是笔者对于想要使用更基础的模块进行SFT的一次尝试,也是笔者一直想要努力的方向:掌握ChatGPT3.5模型的整体训练流程。
SFT看上去简单,但实际自己调试起来,还是有不少坑的。
笔者后续将会将SFT阶段进行整理,形成开源项目,方便大家使用,不过其实firefly
和LLaMA-Factory
也已经非常好用啦~
推荐阅读
参考文献
- TRL - Transformer Reinforcement Learning: https://huggingface.co/docs/trl/index#trl---transformer-reinforcement-learning
- Supervised Fine-tuning Trainer: https://huggingface.co/docs/trl/sft_trainer
- Templates for Chat Models: https://huggingface.co/docs/transformers/chat_templating
- How to fine-tune Google Gemma with ChatML and Hugging Face TRL: https://www.philschmid.de/fine-tune-google-gemma
- Google Gemma 2B 微调实战(IT科技新闻标题生成): https://ganymedenil.com/2024/03/24/Google-Gemma-2B-fine-tuning-practice-IT-technology-news-headline-generation.html
欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。