大模型LLM-微调经验分享&总结

大模型微调并不复杂,数据才是关键:3个实例详解数据准备 今天我们不打算深挖那些复杂的技术细节,而是要告诉你们一个简单的事实:微调其实一点都不复杂,真正的关键在于——数据!在这篇文章里,我们不仅会深入浅出地介绍什么是微调,还会通过三个具体的实例,教你们如何准备高质量的数据集,让你们的模型表现出色。准备好了吗?让我们一起开始吧! 阅读详情

导读

本文总结了作者在ChatGLM-6B模型微调的经验,并汇总了目前开源项目&数据。
写在前面

大型语言模型横行,之前非常焦虑,现在全面拥抱。目前也有很多开源项目进行大模型微调等,笔者也做了一阵子大模型了,特此来介绍一下ChatGLM-6B模型微调经验,并汇总了一下目前开源项目&数据。笔者与很多人微调结论不同,本人在采用单指令上进行模型微调,发现模型微调之后,「并没有出现灾难性遗忘现象」。

项目地址:https://github.com/liucongg/ChatGLM-Finetuning

ChatGLM-6B模型微调

模型越大对显卡的要求越高,目前主流对大模型进行微调方法有三种:Freeze方法、P-Tuning方法和Lora方法。笔者也通过这三种方法,在信息抽取任务上,对ChatGLM-6B大模型进行模型微调。为了防止大模型的数据泄露,采用一个领域比赛数据集-汽车工业故障模式关系抽取(https://www.datafountain.cn/competitions/584),随机抽取50条作为测试集。

详细代码见上面的GitHub链接,并且也被ChatGLM官方收录。

在这里插入图片描述

Freeze方法

Freeze方法,即参数冻结,对原始模型部分参数进行冻结操作,仅训练部分参数,以达到在单卡或不进行TP或PP操作,就可以对大模型进行训练。

微调代码,见finetuning_freeze.py,核心部分如下:

for name, param in model.named_parameters():  
    if not any(nd in name for nd in ["layers.27", "layers.26", "layers.25", "layers.24", "layers.23"]):  
        param.requires_grad = False  

针对模型不同层进行修改,可以自行修改。训练代码均采用DeepSpeed进行训练,可设置参数包含train_path、model_dir、num_train_epochs、train_batch_size、gradient_accumulation_steps、output_dir、prompt_text等,可根据自己的任务配置。

CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_freeze.py --num_train_epochs 5 --train_batch_size 2  

三元组抽取的推理代码,见predict_freeze.py,其他任务可以根据自己的评价标准进行推理预测。

PT方法

PT方法,即P-Tuning方法,参考ChatGLM官方代码(https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/README.md) ,是一种针对于大模型的soft-prompt方法。

在这里插入图片描述

  • P-Tuning(https://arxiv.org/abs/2103.10385),仅对大模型的Embedding加入新的参数。

  • P-Tuning-V2(https://arxiv.org/abs/2110.07602),将大模型的Embedding和每一层前都加上新的参数。

微调代码,见finetuning_pt.py,核心部分如下:

config = ChatGLMConfig.from_pretrained(args.model_dir)  
config.pre_seq_len = args.pre_seq_len  
config.prefix_projection = args.prefix_projection  
  
model = ChatGLMForConditionalGeneration.from_pretrained(args.model_dir, config=config)  
  
for name, param in model.named_parameters():  
    if not any(nd in name for nd in ["prefix_encoder"]):  
        param.requires_grad = False  

当prefix_projection为True时,为P-Tuning-V2方法,在大模型的Embedding和每一层前都加上新的参数;为False时,为P-Tuning方法,仅在大模型的Embedding上新的参数。

可设置参数包含train_path、model_dir、num_train_epochs、train_batch_size、gradient_accumulation_steps、output_dir、prompt_text、pre_seq_len、prompt_text等, 可根据自己的任务配置。

CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_pt.py --num_train_epochs 5 --train_batch_size 2 --pre_seq_len 16  

三元组抽取的推理代码,见predict_pt.py,其他任务可以根据自己的评价标准进行推理预测。

Lora方法

Lora方法,即在大型语言模型上对指定参数增加额外的低秩矩阵,并在模型训练过程中,仅训练而外增加的参数。当“秩值”远小于原始参数维度时,新增的低秩矩阵参数量很小,达到仅训练很小的参数,就能获取较好的结果。

在这里插入图片描述

  • Lora论文:https://arxiv.org/abs/2106.09685

  • 官方代码:https://github.com/microsoft/LoRA

  • HuggingFace封装的peft库:https://github.com/huggingface/peft

微调代码,见finetuning_lora.py,核心部分如下:

model = ChatGLMForConditionalGeneration.from_pretrained(args.model_dir)  
config = LoraConfig(r=args.lora_r,  
                    lora_alpha=32,  
                    target_modules=["query_key_value"],  
                    lora_dropout=0.1,  
                    bias="none",  
                    task_type="CAUSAL_LM",  
                    inference_mode=False,  
                    )  
  
model = get_peft_model(model, config)  

可设置参数包含train_path、model_dir、num_train_epochs、train_batch_size、gradient_accumulation_steps、output_dir、prompt_text、lora_r等,可根据自己的任务配置。

CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_lora.py --num_train_epochs 5 --train_batch_size 2 --lora_r 8  

三元组抽取的推理代码,见predict_lora.py,其他任务可以根据自己的评价标准进行推理预测。

注意:对于结果需要保持一致的任务(即关掉dropout,解码关掉do_sample),需要保存模型的adapter_config.json文件中,inference_mode参数修改成false,并将模型执行model.eval()操作。主要原因是chatglm模型代码中,没有采用Conv1D函数。

三元组抽取实验结果

  • 模型训练时,最大长度为768,Batch大小为2,训练轮数为5,fp16训练,采用DeepSpeed的Zero-1训练;

  • PT为官方的P-Tuning V2训练方法,PT-Only-Embedding表示仅对Embedding进行soft-prompt,Freeze仅训练模型后五层参数,Lora采用低秩矩阵方法训练,秩为8;

  • 由于之前训练PT在48G-A40显卡上会出现OOM,因此之前进行PT实验时对模型开启了gradient_checkpointing_enable,使得模型显存占用变小,但训练时长增加。

  • 训练示例:

prompt_text:你现在是一个信息抽取模型,请你帮我抽取出关系内容为\"性能故障\", \"部件故障\", \"组成\"和 \"检测工具\"的相关三元组,三元组内部用\"_\"连接,三元组之间用\\n分割。文本:  
输入:故障现象:发动机水温高,风扇始终是低速转动,高速档不工作,开空调尤其如此。  
输出:发动机_部件故障_水温高\n风扇_部件故障_低速转动  

时间换空间,可用很好的解决显卡的资源问题,简单玩玩还可以,如果想要模型达到最优效果或可用快速看到效果,还不如租张A100卡,快速实验,推理阶段再用自己的小破卡。

笔者找到一家新的算力平台-揽睿星舟,单张A100仅要6.4元/小时,我翻了一圈,算是便宜的了(反正比AutoDL便宜一点,便宜一点是一点吧)。

下面实验结果均是在租的80G-A100上进行的实验,与Github里用的A40的实验结果会有些差异,主要在训练时长(纯训练速度,剔除模型保存的时间)。说实话,真的要训练一个大模型,多个A100是必不可少的,可以减少很多模型并行的操作,效果上也更好把控一些。

微调方法PT-Only-EmbeddingPTFreezeLora
显卡占用37G56G24G39G
总参数6.259B7.211B6.255B6.259B
可训练参数占比0.0586%13.26%16.10%0.0586%
训练耗时20min52min46min25min
测试结果F10.00.62830.56750.5359

结果分析:

  • 效果为PT>Freeze>Lora>PT-Only-Embedding;

  • 速度为PT-Only-Embedding>Lora>Freeze>PT;

  • PT-Only-Embedding效果很不理想,发现在训练时,最后的loss仅能收敛到2.几,而其他机制可以收敛到0.几。分析原因为,输出内容形式与原有语言模型任务相差很大,仅增加额外Embedding参数,不足以改变复杂的下游任务;

  • PT方法占用显存更大,因为也增加了很多而外参数;

  • 测试耗时,采用float16进行模型推理,由于其他方法均增加了额外参数,因此其他方法的推理耗时会比Freeze方法要高。当然由于是生成模型,所以生成的长度也会影响耗时;

  • 模型在指定任务上微调之后,并没有丧失原有能力,例如生成“帮我写个快排算法”,依然可以生成-快排代码;

  • 由于大模型微调都采用大量instruction进行模型训练,仅采用单一的指令进行微调时,对原来其他的指令影响不大,因此并没导致原来模型的能力丧失;

  • 上面测试仅代表个人测试结果。

很多同学在微调后出现了灾难性遗忘现象,但我这边并没有出现,对“翻译任务”、“代码任务”、“问答任务”进行测试,采用freeze模型,可以用test_forgetting.py进行测试,具体测试效果如下:

  • 翻译任务

  • 代码任务

在这里插入图片描述

  • 问答任务

后面会把生成任务、分类任务做完,请持续关注Github,会定期更新。(太忙了,会抓紧时间更新,并且官方代码也在持续更新,如遇到代码代码调不通的情况,请及时联系我,我在github也给出了我的代码版本和模型版本)

中文开源大模型&项目

虽然出来很多大模型,但Open的&中文可直接使用的并不多,下面对中文开源大模型、数据集和项目进行一下汇总。

中文开源大模型

直接可微调,无需指令增量训练:

  • ChatGLM-6B:https://huggingface.co/THUDM/chatglm-6b

  • ChatYuan-large-v2:https://huggingface.co/ClueAI/ChatYuan-large-v2

原始模型多语言or英文,需要中文指令数据集增量训练:

  • BloomZ:https://huggingface.co/bigscience/bloomz

  • LLama:https://github.com/facebookresearch/llama

  • Flan-T5:https://huggingface.co/google/flan-t5-xxl

  • OPT:https://huggingface.co/facebook/opt-66b

中文开源指令数据

下面中文指令集,大多数从Alpaca翻译而来,请看下面项目中data目录。目前通过ChatGPT或者GPT4作为廉价标注工为自己的数据进行数据标注一个不错的思路。

  • [1]:https://github.com/LC1332/Chinese-alpaca-lora

  • [2]:https://github.com/hikariming/alpaca_chinese_dataset

  • [3]:https://github.com/carbonz0/alpaca-chinese-dataset

  • [4]:https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM

  • [5]:https://github.com/LianjiaTech/BELLE

  • [6]:https://huggingface.co/datasets/JosephusCheung/GuanacoDataset

开源项目

总结下面较火的开源项目:

  • BELLE:https://github.com/LianjiaTech/BELLE

  • ChatGLM:https://github.com/THUDM/ChatGLM-6B

  • Luotuo-Chinese-LLM:https://github.com/LC1332/Luotuo-Chinese-LLM

  • stanford_alpaca:https://github.com/tatsu-lab/stanford_alpaca

总结

目前各大厂的大模型陆陆续续放出,堪称百家争鸣!个人玩家也是全面拥抱,想尽一切办法来训练微调大模型。只愿大家以后可以实现“大模型”自由。愿再无“model-as-a-service”。

​

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

Llama 3 微调项目实践与教程(XTuner 版) 到此为止我们就让 Llama3 具备了“他是由SmartFlowAI 打造的人工智能助手”的个人认知,本文演示平台为 InternStudio,如其他平台只需适当调整相关路径也能比较顺畅的运行起来,XTuner 玩转 Llama3 图片理解更多玩法请参考:https://github.com/SmartFlowAI/Llama3-XTuner-CN/ (欢迎 Star),同时本周天晚 8 点我们邀请了书生·浦语众多社区大佬一起来分享,欢迎预约直播一起讨论。或者软链接 InternStudio 中的模型。 阅读详情

相关推荐

【LLM】金融场景的大模型Lora微调实战

金融行业需要垂直领域LLM,因为存在金融安全和数据大多数存储在本地,在风控、精度、实时性有要求 (1)500亿参数的BloombergGPT BloombergGPT金融大模型也是用transformer架构,用decoder路线, 构建目前规模最大的金融数据集FINPILE,对通用文本+金融知识的混合训练。 用了512块40GB的A100 GPU,训练中备份了4个模型,每个模型分了128块GPU。 (2)度小满5月的【源轩大模型】 使用hybrid-tuning方式,首个千亿参数金融大模型 在通用能力评测

发现问题,并解决问题,批判性思维 1万+

大模型(LLM)微调:3个实例详解数据准备

微调(Fine-tuning)是一种通过调整预训练模型,使其更好地适应特定任务的技术。它是迁移学习(Transfer Learning)的一种形式,在这一过程中,预训练模型的知识被重新利用并进一步调整,以满足新的数据需求。微调的核心在于利用现有的预训练模型,并通过新的数据调整权重,使其更好地执行目标任务。案例分析: 一个成功的微调案例是,它基于排名19的微调,最终在排名第10,并在聊天、数学和编程任务中表现优异。

程序员鑫港的博客 2189

Deepseek接入QQ机器人:实现拟人化概率回复的完整指南

大语言模型API正在快速改变即时通讯工具的交互方式。通过标准化的OpenAI兼容接口,开发者可以将Deepseek等AI服务嵌入到QQ机器人等IM场景中,实现自然语言对话能力。其核心原理在于事件驱动架构:消息接收层通过OneBot协议获取群聊内容,业务层利用概率过滤与冷却机制控制回复节奏,再由大模型生成拟人化文本。这种设计不仅避免了机器人刷屏,还能通过系统提示词塑造性格,营造真实的社群陪伴体验。适用于粉丝群互动、内容订阅、小规模客服等场景,同时支持多群独立配置、关键词加权回复及上下文记忆扩展。在实际工程中,

weixin_29051245的博客 458

大模型LLM的三种微调方法的经验分享&总结

PT方法占用显存更大,因为也增加了很多而外参数;测试耗时,采用float16进行模型推理,由于其他方法均增加了额外参数,因此其他方法的推理耗时会比Freeze方法要高。当然由于是生成模型,所以生成的长度也会影响耗时;模型在指定任务上微调之后,并没有丧失原有能力,例如生成“帮我写个快排算法”,依然可以生成-快排代码;

2301_76161259的博客 1299

Python学习(一)

快速入门 1.Linux系统中是可以直接使用Python进行编程,具体如下: 进入Python:在linux的Terminal中输入 Python ,进入Python的命令行; 退出Python:在linux的Terminal中输入quit() 或 exit() 或 ctrl +d ,再回车,退出Python的命令行。 2.python的源程序就是一个特殊格式的文本文件,可以使用任意文本编辑软件做Python的开发。 3.Python程序的文件扩展名通常都是 .py。 4.执行Python程序的方式:在

SummerXRT的博客 1280

发那科机器人弧焊指令实战:从Search指令到组掩码设置的完整避坑指南

本文详细解析了发那科机器人弧焊指令系统的实战应用,从Search指令的正确使用到组掩码设置的避坑技巧。通过实际案例和参数优化建议,帮助工程师提升焊接质量和生产效率,避免常见错误操作。特别针对T2模式示教难题和外部轴协调运动提供了专业解决方案。

weixin_29040367的博客 185

干货 | 大模型LLM-微调经验分享&总结

大型语言模型横行,之前非常焦虑,现在全面拥抱。目前也有很多开源项目进行大模型微调等,笔者也做了一阵子大模型了,特此来介绍一下ChatGLM-6B模型微调经验,并汇总了一下目前开源项目&数据。笔者与很多人微调结论不同,本人在采用单指令上进行模型微调,发现模型微调之后,

kaka0722ww的博客 916

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

里面包含了支持者的名字,职业和雇主,地址,赞助金额。我们可以已经能想到如何切割、整理数据,来提取赞助者的统计数据,或提取宣传活动的模式,这里我们展示一些不同的分析方法。可以看到有些职业是同一种工作类型,指代的是同一个东西。这两个连续操作是分别独立执行的,一个结束后,另一个才开始。上,这里我是把数据集压缩成了ZIP格式,解压后能正常导入)。我觉得也有必要好好了解一下,这个网站做了很好的讲解,),所以我们最好添加这样的信息。这样的情况,即把两个索引操作连在一起。,发现映射关系被正常执行了,所以这里的。

Cachel Wood的博客 349
上一篇: 我代码0基础,5分钟能做一个大模型应用
下一篇: 产品经理新机会,薪资普遍30~60k,大厂打响人才战
AI大模型_学习君
博客等级 码龄3年 6137粉丝 551原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值