链载Ai

标题: 大模型微调框架LLaMA-Factory [打印本页]

作者: 链载Ai    时间: 昨天 18:05
标题: 大模型微调框架LLaMA-Factory
LLaMA Factory是一款开源的低代码大模型微调框架,集成了业界广泛使用的多种微调方法(如 LoRA、QLoRA),具备良好的易用性和灵活性,是目前较为推荐的大模型微调解决方案。
1. 安装
如果环境安装过程遇到相关问题,可以参考LLaMA Factory官方github列出的相关问题
gitclonehttps://github.com/hiyouga/LLaMA-Factory.gitcdLLaMA-Factorypipinstall-e.
2. 启动LLaMA-Factory
通过webui 方式启动,便于后续操作
llamafactory-cliwebui
3. 下载待微调的基础模型
国内下载模型和数据集主要用魔塔社区,这个平台不需要科学上网,建议通过SDK方式进行下载,在下载前,请先通过如下命令安装ModelScope
pipinstallmodelscope
SDK方式下载模型(本次下载的Qwen2.5-1.5B)
#模型下载frommodelscopeimportsnapshot_downloadmodel_dir=snapshot_download('Qwen/Qwen2.5-1.5B-Instruct',cache_dir='/root/autodl-tmp/model')print("模型下载完成!")
这里注意通过cache_dir参数设置模型下载的目录,如果不设置的话会下载到~/.cache 目录下。
4. 准备用于训练的数据集
LLaMA Factory框架支持的训练数据集格式如下:
[{"instruction":"hi","input":"","output":"Hello!Iam{{name}},anAIassistantdevelopedby{{author}}.HowcanIassistyoutoday?"},{"instruction":"hello","input":"","output":"Hello!Iam{{name}},anAIassistantdevelopedby{{author}}.HowcanIassistyoutoday?"}]
这是json格式样例数据,其中instruction表示用户提的问题,input 表示对用户提问题的补充,一般input 这个字段设置为空,因为用户提的问题全部放在instruction中,output 指的人工标注的答案,也称为label。
上述是单轮对话的样例,LLaMA Factory框架还支持多轮对话,其训练数据集格式如下:
[{"instruction":"国际经济与贸易专业的就业前景是怎样的?","input":"","output":"国际经济与贸易专业的就业前景较为广阔。随着全球经济一体化的深入发展,国际贸易交流不断增加,对专业人才的需求也日益增长。毕业生可以在跨国公司、国际贸易企业、金融机构以及政府部门等领域找到就业机会。此外,随着国家对外贸易政策的不断调整与改善,国际经济与贸易专业的就业前景也将更加乐观。综合来看,国际经济与贸易专业具有较高的就业率和就业质量,为毕业生提供了良好的职业发展空间。","history":[["从事国际经济与贸易专业的人可以有哪些工作机会?","国际经济与贸易专业拥有广泛的就业领域。毕业生可以在进出口公司、物流公司、保险公司、银行中介类货代以及报关员、报检员等职位工作。此外,他们还可以在政府机构如外贸局、外汇局、商检局、海关等部门从事涉外经济贸易的实际业务、管理、调研和宣传策划工作。国际经济与贸易专业还培养了高素质的复合型涉外经贸人才,使他们具备从事国际经贸工作的能力和竞争力。"]]},{"instruction":"列出三种创造性的解决问题的技巧。","input":"","output":"1.头脑风暴:这种技巧旨在通过鼓励尽可能多的想法来产生新颖的解决方案。与团队成员合作,不管想法多么离奇都应该提出来。最终,团队成员可以一起筛选想法,找到可行的解决方案。\n2.逆向思维:这种技巧要求您从问题的根源入手,从结局反推回去。基于这种思想,您可以回顾失败的原因,找到问题的根本所在,并找到更好的解决方案。\n3.生命周期思考:这种技巧倡导从全局的角度思考问题。它要求您考虑问题的各个环节,从问题的产生,发展到最终的解决方案。每一个阶段都需要考虑,确保解决方案是全面和持久的。","history":[]}]
其中instruction和output指的意思和单轮对话是一样,history 指的是历史对话记录。
本次训练中,我准确了两份数据:
一份是LLaMA Factory框架自带的 identity.json,这份数据集主要是用于定义人物自我介绍、使命等。
另一份数据是从魔塔社区下载的ruozhiba数据,然后通过代码将其转为化LLaMA Factory支持的数据格式,文件名为ruozhiba.json
将这两份数据拷贝到LLaMA Factory的data目录下
然后在dataset_info.json 中添加相关配置项目:

5. 开启loar微调训练
首先介绍下loar微调的原理:

•训练时,输入分别与原始权重和两个低秩矩阵进行计算,共同得到最终结果,优化则仅优化A和B

•训练完成后,可以将两个低秩矩阵与原始模型中的权重进行合并, 合并后的模型与原始模型无异


loar训练的主要配置如下 :


点击【开始】按钮进行训练,注意到曲线基本接近水平即可停止训练


每次训练完之后的权重都会存储在saves路径下面:

5. 在某个checkpoint点继续训练
如果训练过程由于某种原因中断了,可以在"检查点路径"中配置开始训练的checkpoint文件:
这样重新训练的时候就会从这个指定的点开始训练,而不是从头开始训练。此时要注意:需要修改下输出目录的名称,要不然会报错。
6. 客观评估
在评估前需要安装3个依赖包:
pipinstalljiebapipinstallnltkpipinstallrouge_chinese
本次客观评估配置以及评估结果如下:
评估结果主要看这几个指标:
"predict_bleu-4":88.66503116406967"predict_rouge-1":93.22028249312557"predict_rouge-2":90.35579468377637"predict_rouge-l":92.24518854262145
BLEU-4表示使用 4-gram(四元组)进行比较,衡量模型生成的文本与参考文本之间的重合程度。
ROUGE-1计算的是 1-gram(即单个词)的召回率,反映了生成文本在多大程度上覆盖了参考文本中的词汇。
ROUGE-2计算的是 2-gram(即两个连续的词)的召回率,衡量的是生成文本与参考文本在短语层面的匹配情况。
ROUGE-L通过最长公共子序列(Longest Common Subsequence,LCS)来衡量生成文本和参考文本之间的匹配度。它反映的是生成文本在保留参考文本语序和整体内容结构方面的能力。
BLEU和ROUGE的区别:
BLEU 强调精确度(Precision),更适合机器翻译
ROUGE 强调召回率(Recall),更适合摘要和生成任务

举个例子:

假设参考答案是:

“小明今天去了图书馆看书。”

模型输出1(较短):

“小明去图书馆。”

模型输出2(冗长):

“小明今天去了图书馆看书,还去超市买了东西。”


✅ 总结建议:

你的任务场景
推荐指标
机器翻译、对话生成(短文本)
?BLEU为主
文本摘要、长文本生成
?ROUGE为主
生成质量综合评估
两者一起看

6. 主观评估
客观评测虽然能够从指标上评断模型的各项知识、长文本等能力,但是无法贴近真实的场景。很多模型都号称在指标上逼近或超过gpt4,但是实际用下来很差。所以微调模型后一般都需要进行人工主观评估。
在评估时,会选择一个checkpoint点进行chat测试
7. 合并模型
人工验证效果OK后,接下就可以将checkpoint权重和基础模型进行合并了,合并配置如下:
这样合并好的模型理论上就可以在vLLM框架下进行部署了,不过实践中发现这里有坑(对话模板不一致问题),这会在另一篇文章中单独介绍。
8. 采用Qloar微调训练
Qlora是在训练过程中降低参数的精度,可以加快训练速度,这种量化训练不会影响训练后模型的精度。
Qlora加速需要安装bitsandbytes,安装命令:
pipinstallbitsandbytes
Qloar微调主要配置如下:
后续训练操作流程和Loar完全一样,在这就不重复介绍了。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5