LLM低成本微调方法

news2024/11/25 9:25:59

LLM日益流行,已经渗透到各个领域,比如生物医学,但是模型的规模导致微调LLM对普通用户不够友好,因此,我们需要借助一些低成本方法,通过更新少量参数也达到与LLM全参数更新一样的效果。这里介绍三种主流方法:冻结,P-tuning,QLoRA。

冻结
Freeze是冻结的意思,Freeze方法指的是参数冻结,对原始模型的大部分参数进行冻结,仅训练少部分的参数,这样就可以大大减少显存的占用,从而完成对大模型的微调。这是一种比较简单微调方法,由于冻结的参数是大部分,微调的参数是少部分,因此在代码中只需要设置需要微调的层的参数即可,比如:

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

P-tuning
P-tuning分为P-tuning v1和P-tuning v2。首先了解prefix-tuning(prefix-tuning:Optimizing Continuous Prompts for Generation),指的是在微调模型的过程中只优化加入的一小段可学习的向量(virtual tokens,即Prefix),而不需要优化整个模型的参数(训练的时候只更新Prefix部分的参数,而LLM中的其他部分参数固定)。prefix-tuning可以理解为在输入信息中添加额外的prompt,这个prompt是通过学习获得的。

可以了解soft prompt和hard prompt:

  • hard prompt等同于discrete prompt,离散prompt是一个实际的文本字符串(自然语言,人工可读),通常由中文或英文词汇组成;
  • soft prompt等同于continuous prompt,连续prompt通常是在向量空间优化出来的提示,通过梯度搜索之类的方式进行优化。

在离散的prompts中,提示语的变化对模型最终的性能特别敏感,加一个词、少一个词或者变动位置都会造成比较大的变化。成本比较高,并且效果不太好,连续的prompts将具有更好的鲁棒性,显然Prefix Tuning属于Soft prompt。
fig1

  • Model Tuning对每个任务都进行全参数微调。Prompt tuning给每个任务都定义了自己的Prompt(可学习的向量),拼接到数据上作为输入,上图只在输入层加入prompt tokens。混合任务的训练可以提高prompt的鲁棒性。

在P-tuning v1中,使用virtual tokens替换hard prompt中的离散tokens,使用BiLSTM+MLP对virtual tokens编码得到连续prompts。P-Tuning v2在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层,这带来两个方面的好处:1.更多可学习的参数可以提高表现,2.加入到更深层结构中的Prompt能给模型预测带来更直接的影响。

QLoRA
LoRA需要回顾 LLaMA-7B微调记录-Alpaca-LoRA,LoRA 的最大优势是速度更快,使用的内存更少:

  • 计算效率:由于LoRA只需要计算和优化低秩矩阵,因此它的计算效率比完全微调更高。
  • 通信效率:在多卡训练中,通信效率通常是一个瓶颈。由于LoRA只需要通信低秩矩阵的参数,因此它的通信效率比完全微调更高。通常,LoRA可以将硬件门槛降低3倍。

QLoRA的核心如下:

  • 4bit NormalFloat(NF4):对于正态分布权重而言,这是一种信息理论上最优的数据类型,该数据类型对正态分布数据产生比 4 bit整数和 4bit 浮点数更好的结果。
  • 双量化(Double Quantization):对第一次量化后的那些常量再进行一次量化,减少存储空间。
  • 分页优化器(Paged Optimizers):使用NVIDIA统一内存特性,该特性可以在GPU偶尔OOM的情况下,进行CPU和GPU之间自动分页到分页的传输,以实现无错误的 GPU 处理。该功能的工作方式类似于 CPU 内存和磁盘之间的常规内存分页。使用此功能为优化器状态(Optimizer)分配分页内存,然后在 GPU 内存不足时将其自动卸载到 CPU 内存,并在优化器更新步骤需要时将其加载回 GPU 内存。
  • 增加Adapter:4-bit的NormalFloat与Double Quantization,节省了很多空间,但带来了性能损失,因此通过插入更多adapter来弥补这种性能损失。在LoRA中,一般会选择在query和value的全连接层处插入adapter。而QLoRA则在所有全连接层处都插入了adapter,增加了训练参数,弥补精度带来的性能损失。

微调经验
对于模型大小的选择:

  • 一般情况下,参数越大效果越好,资源允许推荐选择30B以上模型;
  • 参数多量化低的模型要优于参数低量化高的模型,举例 :33B-fb4 模型要优于 13b-fb16 模型。

数据处理:

  • 在数据处理过程中,可能面临各种类型的数据,PDF,Word,HTML,code文件等等,对于这种不同类型的数据需要都处理成文本,同时还过滤掉一些干扰项或乱码的数据。
  • 对于空的文档或文档长度低于100进行过滤,进一步减少噪音。
  • LLaMA模型的词表大小是32K,其主要针对英语进行训练,对多语种支持不是特别理想,如果要考虑其他语种,还需要扩展词汇表,并进行预训练。

灾难性遗忘问题:

  • 如果采用LoRA训练出现遗忘时,可以将 lora_rank调大,如从8调到64 ( 原因是与原模型数据领域相差较大的话,需要更大的秩)。
  • 复习:跟人一样,在预训练或微调时,回看之前训练的数据。还可以专门把特征图存起来,量化以后放在一个类似于记忆库的地方,之后在新任务上训练的时候从这个记忆库里重构出记忆和新数据一起训练。
  • 尝试调小学习率,如chatglm学习率改到2e-4,但训练速度会慢很多。

来自:https://blog.csdn.net/dzysunshine/article/details/131590701

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

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

相关文章

JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

1.如何判断对象可以回收 1.1引用计数法 只要一个对象被其他对象所引用,就要让该对象的技术加1,某个对象不再引用其,则让它计数减1。当计数变为0时就可以作为垃圾被回收。 有一个弊端叫做循环引用,两个的引用计数都是1&#xff…

npm和node版本升级教程

cmd中查看本地安装的node版本 node -v //查询node的位置 where node2.官网下载所需要的node版本,安装在刚查出来的文件夹下,即覆盖掉原来的版本 3.查看node版本是否已经更新 4.查看npm版本是否和node版本相匹配 cnpm install -g npm

超实用的两款截图工具(FastStone Capture 和 Snipaste)

文章目录 一、概述1)FastStone Capture2)Snipaste 二、FastStone Capture 和 Snipaste 截图软件安装 一、概述 "FastStone Capture" 和 "Snipaste" 都是计算机上常用的截图工具,用于捕捉屏幕截图、编辑图像以及进行屏幕…

湘潭大学 湘大 XTU OJ 1217 A+B VII 题解(非常详细)

链接 1217 题目 题目描述 小明非常高兴你能帮他处理那些罗马数字,他想学着自己写罗马数字,但是他不知道自己到底写对了没有。 请你帮他写个程序,能正确地将10进制数字转换成罗马数字,以便他能进行核对。 罗马数字是使用字母组…

Docker运行Nacos容器,过一会就报错`UnsatisfiedDependencyException`

Docker运行Nacos容器,过一会就报错UnsatisfiedDependencyException 问题背景: 最近要上线一个项目,由于要使用Nacos作为服务注册中心,为了方便,我就打算直接使用Docker部署Nacos,没想到Nacos启动没一会就嗝…

三、Kafka生产者

目录 3.1 生产者消息发送流程3.1.1 发送原理 3.2 异步发送 API3.3 同步发送数据3.4 生产者分区3.4.1 kafka分区的好处3.4.2 生产者发送消息的分区策略3.4.3 自定义分区器 3.5 生产者如何提高吞吐量3.6 数据可靠性 3.1 生产者消息发送流程 3.1.1 发送原理 3.2 异步发送 API 3…

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)2- 品目Code振替转记 和 在库转送

SAP 中在库移动 不仅有入库(GR),出库(GI),也可以是单纯内部的转记或转送。 1,振替转记(转移过账) 2,在库转送(库存转储) 1&#xff…

代码部署到服务器

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

阿里云无影云电脑/云桌面收费价格表_使用申请方法

阿里云无影云电脑配置具体收费价格表,4核8G企业办公型云电脑可以免费使用3个月,无影云电脑地域不同价格不同,无影云电脑费用是由云桌面配置、云盘、互联网访问带宽、AD Connector 、桌面组共用桌面session 等费用组成,阿里云百科分…

Linux驱动开发(Day5)

思维导图: 不同设备号文件绑定:

springboot sl4j2 写入日志到mysql

问题描述 springboot初始化的时候,会先初始化日志然后再加载数据源如果用配置文件进行初始化,那么会出现数据源没有加载成功,导致空指针异常 报错排查如下: 搜索报错信息,OBjects.invoke is Null打断点发现。dataso…

简历本-专业在线简历制作下载网站 自带智能简历诊断

简历本是一个高效的在线简历制作与管理工具,为求职者提供专业简历模板,使用简历本5分钟就能制作一份优秀简历,可随时随地将简历下载为Word、PDF、图片格式文件,可在线发送或投递,不过使用需要注册登陆,提供…

【NLP】1、BERT | 双向 transformer 预训练语言模型

文章目录 一、背景二、方法 论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 出处:Google 一、背景 在 BERT 之前的语言模型如 GPT 都是单向的模型,但 BERT 认为虽然单向(从左到右预测…

【机器学习实战】朴素贝叶斯:过滤垃圾邮件

【机器学习实战】朴素贝叶斯:过滤垃圾邮件 0.收集数据 这里采用的数据集是《机器学习实战》提供的邮件文件,该文件有ham 和 spam 两个文件夹,每个文件夹中各有25条邮件,分别代表着 正常邮件 和 垃圾邮件。 这里需要注意的是需要…

Brain:背内侧前额叶/背侧前扣带皮层(dmPFC/dACC)的相关争议

摘要 背内侧前额叶皮层/背侧前扣带皮层(dmPFC/dACC)是一个功能存在诸多理论和争议的脑区。甚至其精确的解剖边界也饱受争议。在过去的几十年里,dmPFC/dACC与15种以上的认知过程相关联,这些过程有时看起来完全无关(例如,身体感知、认知冲突)。…

c++优先级队列的模拟实现代码

了解: 1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 2. 类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。 3. 优先队列被实现为…

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块

文章目录 前言 S-Fuction模块 电路方程模型 编写S函数 仿真验证 Tips 分析和应用 总结 前言 见《开箱报告,Simulink Toolbox库模块使用指南(一)——powergui模块》 见《开箱报告,Simulink Toolbox库模块使用指南&#xff…

三维重建 PyQt Python MRP 四视图(横断面,冠状面,矢状面,3D)

本文实现了 Python MPR 的 四视图,横断面,冠状面,矢状面,3D MPR(multi-planner reformation)也称多平面重建,多重面重建是将扫描范围内所有的轴位图像叠加起来再对某些标线标定的重组线所指定的组织进行冠状、矢状位、…

(win系统)MSVCP100/110/120/140.dll丢失 - 解决方案

首先我们来介绍一下什么是dll dll简称动态链接库它可以节省存储空间:由于DLL可以被多个程序共享,因此可以减少磁盘空间的使用。也能提高代码重用率:通过使用DLL,我们可以将一些常用的功能封装成独立的模块,从而提高代码的重用率。…

库克很高兴中国成全球最大的iPhone市场,人民日报的呼吁该重视了

日前苹果CEO库克在微博发文,庆祝苹果公司进入中国市场30周年,对员工、顾客和合作伙伴感谢,库克如此高兴的原因在于今年二季度iPhone在中国市场的销量超越美国市场,由此中国市场首次成为苹果的最大收入来源市场。 中国超越美国成为…