LLM大模型微调心得:全面经验总结与技巧分享

news2024/11/14 20:00:10

导读

模型越大对显卡的要求越高,目前主流对大模型进行微调方法有三种:Freeze方法、P-Tuning方法和Lora方法。本文总结了作者在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

零基础如何学习大模型 AI

领取方式在文末

为什么要学习大模型?

学习大模型课程的重要性在于它能够极大地促进个人在人工智能领域的专业发展。大模型技术,如自然语言处理和图像识别,正在推动着人工智能的新发展阶段。通过学习大模型课程,可以掌握设计和实现基于大模型的应用系统所需的基本原理和技术,从而提升自己在数据处理、分析和决策制定方面的能力。此外,大模型技术在多个行业中的应用日益增加,掌握这一技术将有助于提高就业竞争力,并为未来的创新创业提供坚实的基础。

大模型典型应用场景

AI+教育:智能教学助手和自动评分系统使个性化教育成为可能。通过AI分析学生的学习数据,提供量身定制的学习方案,提高学习效果。
AI+医疗:智能诊断系统和个性化医疗方案让医疗服务更加精准高效。AI可以分析医学影像,辅助医生进行早期诊断,同时根据患者数据制定个性化治疗方案。
AI+金融:智能投顾和风险管理系统帮助投资者做出更明智的决策,并实时监控金融市场,识别潜在风险。
AI+制造:智能制造和自动化工厂提高了生产效率和质量。通过AI技术,工厂可以实现设备预测性维护,减少停机时间。

AI+零售:智能推荐系统和库存管理优化了用户体验和运营成本。AI可以分析用户行为,提供个性化商品推荐,同时优化库存,减少浪费。

AI+交通:自动驾驶和智能交通管理提升了交通安全和效率。AI技术可以实现车辆自动驾驶,并优化交通信号控制,减少拥堵。


这些案例表明,学习大模型课程不仅能够提升个人技能,还能为企业带来实际效益,推动行业创新发展。

学习资料领取

如果你对大模型感兴趣,可以看看我整合并且整理成了一份AI大模型资料包,需要的小伙伴文末免费领取哦,无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

在这里插入图片描述

部分资料展示

一、 AI大模型学习路线图

整个学习分为7个阶段
在这里插入图片描述

二、AI大模型实战案例

涵盖AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,皆可用。
在这里插入图片描述

三、视频和书籍PDF合集

从入门到进阶这里都有,跟着老师学习事半功倍。
在这里插入图片描述

在这里插入图片描述

四、LLM面试题

在这里插入图片描述

如果二维码失效,可以点击下方链接,一样的哦
【CSDN大礼包】最新AI大模型资源包,这里全都有!无偿分享!!!

😝朋友们如果有需要的话,可以V扫描下方二维码联系领取~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 Kotlin 中的 delay 函数和 Java 中的 Thread.sleep 都用于暂停代码执行,但是它们用于不同的场景,并且有不同的实现和影响…

饭馆扫码点餐小程序什么方法进行开发

扫码点餐模式出现的时间已经比较久,其主要作用便是节约客商时间,客户自己点餐,商家响应餐品跟进,降低服务员长时间沟通成本,当然客户饭馆消费也不能只依靠工具,还是需要与服务结合,打造有温度的…

企业网络安全“九九八十一难”,且看XDR的黑!神!话!

近期,游戏《黑神话悟空》的热度攀升,不仅汇聚了全球玩家的目光,也悄然成为黑客及网络不法分子的目标。 游戏预热阶段,其剧情视频意外泄露,迅速在网络上引发热烈讨论与业内关注。随后,有黑客组织公开宣称将…

Tongweb8074+7049m4 安装TongFlowControl(by lqw)

文章目录 介绍安裝包和説明Tongweb8074 安装TongFlowControlTongweb7049m4 安装TongFlowControl 介绍 TongFlowControl是面向分布式服务架构的流量监控工具,是TongWeb基于QPS/并发数和调用关系的流量 控制功能,可在TongFlowControl控制台进行实时监控和…

pdf2md·技术调研

解析技术调研: 技术项源代码官方说明优/劣势补充1 VikParuchuri/marker (Star 14.9K) https://github.com/VikParuchuri/marker?tabreadme-ov-file 优点: 耗时少精度高(有ocr模型加持)缺点:…

【C++】类与对象篇四

【C】类与对象篇四 一 . 再谈构造函数1 . 构造函数体赋值2. 初始化列表3. explicit关键字 二 . static成员 【面试题】三 . 友元1. 友元函数2. 友元类 四 . 内部类 一 . 再谈构造函数 1 . 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中…

AI 大模型时代,对前端工程师有哪些机遇和挑战?

随着人工智能的发展,AI大模型为人工智能领域带来了巨大的机遇和挑战。前端工程师作为软件开发的重要一环,也需要关注 AI 大模型的发展趋势,并探索如何将其应用于前端开发和优化中。 AI 大模型应用广泛,已经深入到各个行业&#x…

数据结构——队的基本操作

一、顺序队 队的用法:先进先出 跟平时我们遇到的大多情况一样,队的主要思想就是先进先出,比如我去食堂打饭,我先排那么就是我先打到饭咯 顺序队:其实说白了就是一块空间用两个指针去指向,为了实现先进先…

如何获取页面的MP3文件

1、使用Google浏览器, 2、F12打开网页编程模式 3、找到network选项卡, 4、然后点击播放按钮,此时network中会加载各类资源; 5、在type中找到’media‘,点击media的名称; 6、找到request url&#xff1…

【AI绘画教程】StableDiffusion新手教程|5分钟搞定平面线稿转3D效果,100%成功(附教程工具)

大家好,我是画画的小强 曾经,我们对于将线稿转化为精美上色作品只能望而却步,然而如今,有了稳定扩散人工智能AI绘画工具(SD),我们可以以更加神奇的方式为线稿赋予绚丽的色彩,将创意…

Powershell@2 文件操作整理

最近又开始折腾pipeline了,对文件操作,这里实践并记录一下 https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/get-content?viewpowershell-7.4 列出文件及文件夹 Get-ChildItem Get-ChildItem -Path D:\1_data…

神经内科经颅磁刺激(TMS)疗法介绍

经颅磁刺激(TMS)作为一种先进的非侵入性、无痛的治疗手段,其核心基于电磁学原理。该技术通过储能电容向特制线圈瞬间释放强大电流,生成穿透颅骨的强磁场。这一磁场在大脑内部诱导产生微弱的感应电流,触发一系列复杂的生…

Pascal编程语言

目录 一、Pascal语言的诞生与特点 二、Pascal编程环境的选择与安装 三、Pascal语法基础与实战 pascal复制代码 pascal复制代码 在计算机编程的丰富世界中,Pascal语言以其严谨的结构和强大的功能而独树一帜。对于初学者来说,Pascal编程语言不仅可以帮…

AI学习记录 - 怎么理解 torch 的 nn.Conv2d

有用就点个赞 怎么理解 nn.Conv2d 参数 conv_layer nn.Conv2d(in_channels3, out_channels 64, kernel_size3, stride1, padding0, biasFalse) in_channels in_channels 可以设置成1,2,3,4等等都可以,一般来说做图像识别的时…

大模型就业行情揭秘:哪些岗位最吃香?

随着人工智能技术的发展,尤其是大模型技术的成熟与广泛应用,相关行业的人才需求量也呈现出爆发式增长。对于想要进入这个领域的求职者来说,了解当前大模型就业岗位的行情显得尤为重要。本文将深入剖析目前大模型就业岗位的市场情况&#xff0…

本地生活本地推软件有哪些?手把手教你从零开始提升转化率!

当前,多家互联网大厂在本地生活版块的布局不断深入,让本地生活市场不断焕发新活力的同时,也使得竞争态势日益激烈。在此背景下,对于本地生活服务商而言,无论是想要拓展品牌商家资源,还是想要改善交付效果&a…

广东超高清视频产业高质量发展成果展在粤开展

8月27日,广东超高清视频产业高质量发展成果展于中国(广州)超高清视频创新产业园区广州国际媒体港举行。本次展会聚焦广东超高清视频产业,展示以新技术赋能广电新质生产力,推动广播影视和网络视听高质量发展的最新成果&…

[Arxiv 2024] Self-Rewarding Language Models

Contents IntroductionMethodExperimentsReferences Introduction 作者提出 Self-Rewarding 训练框架,LLM 在训练过程中同时担任 actor 和 critic,actor 负责合成新数据,critic 负责判断合成数据质量用于组成高质量的偏好数据集用于模型的下…

网络排名变差算法在充电桩计量可信度评价中的应用AcrelCloud-9000安科瑞充电柱收费运营云平台

摘要:网络排名变差算法是指根据充电交易流水数据构造桩车网络,利用复杂网络的投票智慧而非传统的物理实验来获得对量值的信心。将排名变差算法用于桩车网络计算中,旨在检定合格的充电桩对其他充电桩排名变化的影响,这种影响以电动…

若依添加字段权限功能

页面长这样 /*Navicat Premium Data TransferSource Server : 本地Source Server Type : MySQLSource Server Version : 80038Source Host : 127.0.0.1:3306Source Schema : healthTarget Server Type : MySQLTarget Server Version : 80038Fi…