【自然语言处理】大模型高效微调:PEFT 使用案例

news2024/9/30 9:36:26

文章目录

  • 一、PEFT介绍
  • 二、PEFT 使用
    • 2.1 PeftConfig
    • 2.2 PeftModel
    • 2.3 保存和加载模型
  • 三、PEFT支持任务
    • 3.1 Models support matrix
      • 3.1.1 Causal Language Modeling
      • 3.1.2 Conditional Generation
      • 3.1.3 Sequence Classification
      • 3.1.4 Token Classification
      • 3.1.5 Text-to-Image Generation
      • 3.1.6 Image Classification
      • 3.1.7 Image to text (Multi-modal models)
  • 四、PEFT原理
    • 4.1 LoRA
    • 4.2 Prompt tuning
    • 4.3 IA3

一、PEFT介绍

PEFT(Parameter-Efficient Fine-Tuning,参数高效微调),是一个用于在不微调所有模型参数的情况下,高效地将预训练语言模型(PLM)适应到各种下游应用的库。

PEFT方法仅微调少量(额外的)模型参数,显著降低了计算和存储成本,因为对大规模PLM进行完整微调的代价过高。最近的最先进的PEFT技术实现了与完整微调相当的性能。

代码:

https://github.com/huggingface/peft

文档:

https://huggingface.co/docs/peft/index

二、PEFT 使用

接下来将展示 PEFT 的主要特点,并帮助在消费设备上通常无法访问的情况下训练大型预训练模型。您将了解如何使用LoRA来训练1.2B参数的bigscience/mt0-large模型,以生成分类标签并进行推理。

2.1 PeftConfig

每个 PEFT 方法由一个PeftConfig类来定义,该类存储了用于构建PeftModel的所有重要参数。

由于您将使用LoRA,您需要加载并创建一个LoraConfig类。在LoraConfig中,指定以下参数:

  • task_type,在本例中为序列到序列语言建模
  • inference_mode,是否将模型用于推理
  • r,低秩矩阵的维度
  • lora_alpha,低秩矩阵的缩放因子
  • lora_dropout,LoRA层的dropout概率
from peft import LoraConfig, TaskType

peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)

有关您可以调整的其他参数的更多详细信息,请参阅LoraConfig参考。

2.2 PeftModel

使用 get_peft_model() 函数可以创建PeftModel。它需要一个基础模型 - 您可以从 Transformers 库加载 - 以及包含配置特定 PEFT 方法的PeftConfig。

首先加载您要微调的基础模型。

from transformers import AutoModelForSeq2SeqLM

model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)

使用get_peft_model函数将基础模型和peft_config包装起来,以创建PeftModel。要了解您模型中可训练参数的数量,可以使用print_trainable_parameters方法。在这种情况下,您只训练了模型参数的0.19%!

from peft import get_peft_model

model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
# 输出示例: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282

至此,我们已经完成了!现在您可以使用Transformers的Trainer、 Accelerate,或任何自定义的PyTorch训练循环来训练模型。

2.3 保存和加载模型

在模型训练完成后,您可以使用save_pretrained函数将模型保存到目录中。您还可以使用push_to_hub函数将模型保存到Hub(请确保首先登录您的Hugging Face帐户)。

model.save_pretrained("output_dir")

# 如果要推送到Hub
from huggingface_hub import notebook_login

notebook_login()
model.push_to_hub("my_awesome_peft_model")

这只保存了已经训练的增量PEFT权重,这意味着存储、传输和加载都非常高效。例如,这个在RAFT数据集的twitter_complaints子集上使用LoRA训练的bigscience/T0_3B模型只包含两个文件:adapter_config.json和adapter_model.bin,后者仅有19MB!

使用from_pretrained函数轻松加载模型进行推理:

from transformers import AutoModelForSeq2SeqLM
from peft import PeftModel, PeftConfig

peft_model_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
config = PeftConfig.from_pretrained(peft_model_id)
model = AutoModelForSeq2SeqLM.from_pretrained(config.base_model_name_or_path)
model = PeftModel.from_pretrained(model, peft_model_id)

三、PEFT支持任务

3.1 Models support matrix

3.1.1 Causal Language Modeling

在这里插入图片描述

3.1.2 Conditional Generation

在这里插入图片描述

3.1.3 Sequence Classification

在这里插入图片描述

3.1.4 Token Classification

在这里插入图片描述

3.1.5 Text-to-Image Generation

在这里插入图片描述

3.1.6 Image Classification

在这里插入图片描述

3.1.7 Image to text (Multi-modal models)

在这里插入图片描述

四、PEFT原理

4.1 LoRA

LoRA(Low-Rank Adaptation)是一种技术,通过低秩分解将权重更新表示为两个较小的矩阵(称为更新矩阵),从而加速大型模型的微调,并减少内存消耗。

为了使微调更加高效,LoRA的方法是通过低秩分解,使用两个较小的矩阵(称为更新矩阵)来表示权重更新。这些新矩阵可以通过训练适应新数据,同时保持整体变化的数量较少。原始的权重矩阵保持冻结,不再接收任何进一步的调整。为了产生最终结果,同时使用原始和适应后的权重进行合并。

4.2 Prompt tuning

训练大型预训练语言模型是非常耗时且计算密集的。随着模型尺寸的增长,越来越多的人对更高效的训练方法产生了兴趣,例如提示(Prompting)。提示通过包括描述任务的文本提示或甚至演示任务示例的文本提示来为特定的下游任务准备一个冻结的预训练模型。通过使用提示,您可以避免为每个下游任务完全训练单独的模型,而是使用相同的冻结预训练模型。这更加方便,因为您可以将同一模型用于多个不同的任务,而训练和存储一小组提示参数要比训练所有模型参数要高效得多。

提示方法可以分为两类:

  • 硬提示(Hard Prompts):手工制作的具有离散输入标记的文本提示;缺点是需要花费很多精力来创建一个好的提示。
  • 软提示(Soft Prompts):可与输入嵌入连接并进行优化以适应数据集的可学习张量;缺点是它们不太易读,因为您不是将这些“虚拟标记”与实际单词的嵌入进行匹配。

4.3 IA3

为了使微调更加高效,IA3(通过抑制和放大内部激活来注入适配器)使用学习向量对内部激活进行重新缩放。这些学习向量被注入到典型的基于Transformer架构中的注意力和前馈模块中。这些学习向量是微调过程中唯一可训练的参数,因此原始权重保持冻结。处理学习向量(而不是像LoRA一样对权重矩阵进行学习的低秩更新)可以大大减少可训练参数的数量。

与LoRA类似,IA3具有许多相同的优点:

  • IA3通过大大减少可训练参数的数量使微调更加高效(对于T0模型,IA3模型仅具有约0.01%的可训练参数,而即使是LoRA也有超过0.1%)。
  • 原始的预训练权重保持冻结,这意味着您可以在其之上构建多个轻量级和便携的IA3模型,用于各种下游任务。
  • 使用IA3进行微调的模型性能与完全微调的模型性能相当。
  • IA3不会增加任何推理延迟,因为适配器权重可以与基础模型合并。

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

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

相关文章

OpenLayers入门,OpenLayers涂鸦手绘线条、圆形和多边形,涂鸦线条自动收尾连接成多边形

专栏目录: OpenLayers入门教程汇总目录 前言 本章再次讲解OpenLayers绘制图形功能,上一章中《OpenLayers图形绘制,OpenLayers实现在地图上绘制线段、圆形和多边形》我们已经讲过多种图形的绘制,本章主要讲解自由涂鸦手绘绘制线条,圆形和任意形状。 二、依赖和使用 &q…

Spring BeanPostProcessor 接口的作用和使用

BeanPostProcessor 接口是 Spring 框架中的一个扩展接口,用于在 Spring 容器实例化、配置和初始化 bean 的过程中提供自定义的扩展点。通过实现这个接口,您可以在 bean 实例创建的不同生命周期阶段插入自己的逻辑,从而实现对 bean 行为的定制…

微仓助力制造业数字化转型,实现高效智能供应链!

随着制造业数字化转型的浪潮迅猛涌现,为了应对日益复杂和快速变化的市场需求,制造企业面临着提高生产效率、降低成本、实现供应链高效运作的挑战。在这个数字化时代,微仓作为智能仓储解决方案,正发挥着关键的作用,成为…

verity cannot ... ‘/dev/block/dm-4‘ is read-only/ 证书cacerts系统目录

网上的说的一种做法是 su mount -o rw,remount / mount -o rw,remount /system cp /data/misc/user/0/cacerts-added/269953fb.0 /system/etc/security/cacerts/ rm /data/misc/user/0/cacerts-added/269953fb.0 reboot 但是我机子是android 12.0 提示 /dev/block/dm-4…

NKD:容器云集群与 OS 一体化运维利器

NKD 是 NestOS-kubernetes-Deployer 的缩写,是为了基于 NestOS 部署的 Kubernetes 集群运维工作准备的解决方案。其目标是在集群外提供对集群基础设施(包括操作系统和 Kubernetes 基础组件)的部署、更新和配置管理等服务。 1. 引言 Kuberne…

双栏排版中,[!b]等等的一些命令都不行啊

\usepackage{stfloats} Latex:图片、表格占据双栏排版的两栏时 的位置控制_latex stfloats_weixin_39450145的博客-CSDN博客目录1.问题:怎么在双栏排版中,让占据两栏的表格出现在页面顶端?2.解决:1)图片&a…

378. 有序矩阵中第 K 小的元素

378. 有序矩阵中第 K 小的元素 原题链接:完成情况:解题思路:参考代码:__378有序矩阵中第K小的元素__直接排序__378有序矩阵中第K小的元素__归并排序__378有序矩阵中第K小的元素__二分查找 原题链接: 378. 有序矩阵中…

中学高级本习集c++

第一章 回溯法 1.1 马拦过河卒 源程序名 knight.???(pas, c, cpp) 可执行文件名 knight.exe 输入文件名 knight.in 输出文件名 knight.out 【问题描述】 棋盘上A点有一个过河卒,需要走到目标B点…

山西电力市场日前价格预测【2023-08-10】

日前价格预测 预测明日(2023-08-10)山西电力市场全天平均日前电价为328.01元/MWh。其中,最高日前电价为366.62元/MWh,预计出现在20: 00。最低日前电价为283.28元/MWh,预计出现在13: 15。 价差方向预测 1: 实…

本质安全设备标准(IEC60079-11)的理解(六)温度

本质安全设备标准(IEC60079-11)的理解(六)温度 本质安全设备的温度要求也是非常复杂的,首先在标准中涉及有3个温度的概念: 环境温度ambient temperature, 工作温度service temperature和最高表…

聊聊机器人学习中的“资产”与“负债”(节选)

前言: 程序里面的bug,人生过程的bug,都非常让人烦躁的。 前一篇: 聊聊机器人学习中的“投资”与“消费”(节选) 有很多学生和朋友,越学越累,越活越累?这到底是为何&a…

Java | 包和内部类

目录 一、Java类包 1.1 类名冲突 1.2 完整的类路径 1.3 创建包 1.4 导入包 1.4.1 使用import关键字导入包 1.4.2 使用import导入静态成员 二、内部类 2.1 成员内部类 2.1.1 成员内部类简介 2.1.2 使用this关键字获取内部类与外部类的引用 2.2 匿名内部类 类除了具有…

无涯教程-Perl - getnetbyname函数

描述 此函数返回由NAME指定的网络信息(在列表context中)($name,$aliases,$addrtype,$net) 语法 以下是此函数的简单语法- getnetbyname NAME返回值 此函数在错误时返回undef,否则在标量context中返回网络地址,在错误时返回空列表,否则在列表context中返回网络记录(名称,别…

在软件测试中,如何有效地跟踪和管理缺陷?

在软件测试中,跟踪和管理缺陷是非常重要的,因为这有助于确保所有问题得到妥善处理,避免在产品发布后出现问题。以下是跟踪和管理缺陷的一些有效方法: 1.创建缺陷报告:当发现一个缺陷时,应该立即创建一个缺…

前端进阶js02----null和undefined的区别

1.相同点 1)都是原始类型的值且保存在栈中。 2) 在布尔运算中都会被认为是false 2.不同点 1)null是js的关键字,表示空值;undefined不是关键字,是一个全局变量。 2)值相同,但类型不一样 值相同&#xff1a…

Day 25 C++ queue 容器(队列)

文章目录 queue 基本概念定义注意基本概念队头(Front)——指向队列中最早添加的元素的位置。队尾(Rear)——指向队列中最后添加的元素的位置。入队(Enqueue)——将元素添加到队尾。出队(Dequeue…

Docker 方式 部署 vue 项目 (docker + vue + nginx)

1.安装好 nginx 。 2. 把 vue 项目的源码克隆到确定目录下。用 git 管理,所以直接 git clone 到既定目录就行了。 如我的目录是:/root/jiangyu/projects/gentle_vue/gentle_vue_code 。 3. 项目打包: npm run build 复制 会自动生成 dist…

【Linux】-进程概念之进程优先级(如何去进行调度以及进程切换),还不进来看看??

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

小小推磨台(我在芜湖等你)

君问归期已有期,江城相逢话恩奇 我 渐渐明了 因为 有祂同行 有期待 有不知所措 离别故乡 去远方 是求学 更是认识祂 我 还不知 那里有没有家 或许有 或许有人找寻 忽然间 想到不认识的相逢 已然在祂预备之中 在那里 侧耳倾听 彼此谈论 那是和睦同居 好的无比 if (&q…

优雅地处理RabbitMQ中的消息丢失

目录 一、异常处理 二、消息重试机制 三、错误日志记录 四、死信队列 五、监控与告警 优雅地处理RabbitMQ中的消息丢失对于构建可靠的消息系统至关重要。下面将介绍一些优雅处理消息丢失的方案,包括异常处理、重试机制、错误日志记录、死信队列和监控告警等。…