PEFT介绍及其源码解析

PEFT库介绍

PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)是由 Hugging Face 开源的一个高效微调库,旨在通过少量可训练参数实现对大型预训练模型的快速适应,从而显著降低计算和存储成本。

核心功能与优势
  1. 多种高效微调方法

    • LoRA(Low-Rank Adaptation):通过引入低秩矩阵来微调模型权重,仅需训练少量参数即可达到与全参数微调相当的性能。
    • Prefix Tuning:通过优化输入提示(prompt)来调整模型,不改变模型权重,适应性强。
    • Prompt Tuning:通过优化连续提示来微调模型,适用于零样本和少样本学习。
    • BitFit:仅对模型的偏置项进行微调,极大地减少了需要优化的参数数量。
  2. 显著降低资源消耗

    • PEFT 方法仅需训练模型中极小部分参数(如 0.1%),显著降低了计算和存储成本。
    • 例如,使用 LoRA 微调一个 3B 参数的模型,仅需 14.4GB GPU 内存,而全参数微调则需要 47.14GB。
  3. 与 Hugging Face 生态系统无缝集成

    • PEFT 与 TransformersAccelerate 库深度集成,支持多种模型(如 BERT、GPT、T5)和任务(如序列分类、因果语言建模、图像生成等)。
  4. 应用场景

    • 大语言模型微调:在消费级硬件上高效微调大型语言模型。
    • 图像生成:与 Diffusers 集成,用于微调 Stable Diffusion 等模型。
    • 强化学习:与 TRL 库结合,用于基于人类反馈的强化学习(RLHF)。
    • 多任务学习:支持多任务提示调优,使模型能够适应多个下游任务。
安装与使用
  1. 安装

    • 使用 PyPI 安装:
      pip install peft
      
    • 使用源码安装(获取最新功能):
      pip install git+https://github.com/huggingface/peft
      
    • 本地克隆并安装可编辑版本:
      git clone https://github.com/huggingface/peft
      cd peft
      pip install -e .
      
  2. 快速入门

    • 以下是一个使用 LoRA 微调的示例代码:
from transformers import AutoModelForSequenceClassification, AutoTokenizer,DataCollatorWithPadding
 from peft import get_peft_model, LoraConfig, TaskType
 from transformers import Trainer, TrainingArguments

 model_name = "bert-base-uncased"
 tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenized_dataset = ...#根据自己的数据类型进行加载,使用datasets.load_dataset()函数

 model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

 lora_config = LoraConfig(
     task_type=TaskType.SEQ_CLS,
     inference_mode=False,
     r=4,
     lora_alpha=16,
     lora_dropout=0.1
 )
 model = get_peft_model(model, lora_config)
 model.print_trainable_parameters()

args = TrainingArguments(
    output_dir=config.save_model,
    per_device_train_batch_size=config.train_batch_size,
    gradient_accumulation_steps=config.accumulation_batch_size,#梯度累计更新,降低显存使用的方法
    logging_steps=50,
    remove_unused_columns=True,#可以保留多余的参数,Tranier默认tokenized_dataset处理后的字典只支持input_ids,attention_mask,labels三个参数,如果想要传递其他参数的话需要设置为False
    num_train_epochs=config.max_epoch,
    learning_rate=config.learning_rate,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    gradient_checkpointing=True  # 确保不使用缓存
)

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_dataset['train'],
    eval_dataset=tokenized_dataset['test'],
    compute_metrics=compute_metrics,
    data_collator=DataCollatorWithPadding(tokenizer=tokenizer, padding=True,return_tensors="pt")
)

trainer.train()

源码解析

  1. 点击get_peft_model()函数,就可以看见源码了:
    在这里插入图片描述
  • 上面执行一个条件判断,判断该模型是不是提示学习方法类型的模型,该该方法包括P_Tuning,PromptTuning,Prefix_Tuning等。然后根据任务类型执行相应的PEFTModel装配步骤,比如我当前正在执行序列分类任务。则进入PeftModelForSequenceClassification模型,但是最终都会先进入PeftModel进行初始化。
  1. 查看PeftModel装配对应模块的方法:
    在这里插入图片描述
  • 可以在PeftModel里面看到这两段核心逻辑,其中先判断是否为prompt_learning方法,在进行各种的可学习参数注入。我们首先查看lora类型的该如何注入,由于lora是非prompt_learning方法,所以走下面的else分支。
  • PEFT_TYPE_TO_MODEL_MAPPING里面装载了许多模型参数高效微调的方法模型,可以在你的IDE工具的外部库 /site-packages/peft/tuners中看见。我们使用lora现在加载了LoraModel进来,进入一个重要的分支:self.base_model = cls(model, {adapter_name: peft_config}, adapter_name),这里会进行lora模型和我们原来模型的装配。
  1. LoraModel装配模型:
    在这里插入图片描述
  • 我们刚刚点击进入到cls(model, {adapter_name: peft_config}, adapter_name)里面,这里面就是对应类型微调方法的实现模型,我们这里是LoraModel。这里进去LoraModel的init方法,我们点击init方法,就可以看到LoraModel的初始化过程了,如上图。接下来我们进入最核心的 self.inject_adapter(self.model, adapter_name, low_cpu_mem_usage=low_cpu_mem_usage)
  1. 查看模型的装配过程。
    在这里插入图片描述
  • 首先,会执行检查过程,查看当前key是否为我们在LoraConfig中设置的target_module中的匹配,如果符合则会进入到self._create_and_replace(peft_config, adapter_name, target, target_name, parent, current_key=key)
    在这里插入图片描述
  • 在_create_and_replace方法中,首先会创建一个Lora对象:
    在这里插入图片描述
  • 我们可以看到,返回的对象是原来线性层(base_layer,即符合规则的q_proj)和对应的lora模块组合,这个模块将会在self._replace_module(parent, target_name, new_module, target)中调用setattr(parent, child_name, new_module)方法替换掉原来的线性层(q_proj对应的线性层)。
  • 其余模块的替换也是一样的逻辑,然后全部替换完毕后会返回一个新的由Lora替换的模型回去,至此Peft替换Lora部分的源码解读完毕。另外的关于Prompt_learning分支的代码如果有需要的我也会在后续更新,如果对你有帮助的话请记得点击一个收藏。

总结

PEFT 为大型模型的高效微调提供了强大的工具集,不仅降低了微调成本,还保持了优异的性能。它适用于多种任务和模型,是研究人员和工程师在资源受限环境中微调大型模型的理想选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

osgEarth安装总结

第一步:安装OSG 直接通过git下载源码,使用cmake进行编译, git clone --depth 1 https://github.com/openscenegraph/OpenSceneGraph.git mkdir build cd build cmake .. make sudo make isntall编译过程中缺什么库,就安装什么库 …

实体机器人在gazebo中的映射

这一部分目的是将真实的机器人映射到gazebo中,使得gazebo中的其他虚拟机器人能识别到真实世界的wheeltec机器人。 真实机器人的型号的wheeltec旗下的mini_mec。 一、在wheeltec官方百度云文档中找到URDF原始导出功能包.zip 找到对应的包 拷贝到工作空间下 在原有…

8、HTTP/1.0和HTTP/1.1的区别【高频】

第一个是 长连接: HTTP/1.0 默认 短连接,(它也可以指定 Connection 首部字段的值为 Keep-Alive实现 长连接)而HTTP/1.1 默认支持 长连接,HTTP/1.1是基于 TCP/IP协议的,创建一个TCP连接是需要经过三次握手的…

kafka-leader -1问题解决

一. 问题: 在 Kafka 中,leader -1 通常表示分区的领导者副本尚未被选举出来,或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析: 1. 副本同步问题: 在 Kafka 集群中&…

stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)

简介: 这个小车的芯片是STM32F103C8T6,其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…

使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器

随着deepseek,chatgpt等大模型的能力越来越强大,本文将介绍借助deepseek,chatgpt等大模型工具,通过编写提示词,辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多,流量分析的需求多种多样,…

飞鱼科技游戏策划岗内推

协助策划完成相关工作,包括但不仅限于策划配置,资料搜集,游戏体验; 游戏策划相关作品;游戏大赛经历;游戏demo制作经历;游戏公司策划岗位实习经历优先 内推码 DSZP7YFU

解决中文乱码:字符编码全攻略 - ASCII、Unicode、UTF-8、GB2312详解

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

Mesh自组网技术及应用

前言: Mesh自组网随着无线技术发展,在消费领域最近比较有热度。当然应用的场景不限于普通消费领域,在工业、军事领域被也是越来越重要。 一、什么是无线Mesh技术 1.1 无线自组网概念 无线Mesh是一种智能、自组织、多跳、移动、对等、去中心…

滑动验证组件-微信小程序

微信小程序-滑动验证组件&#xff0c;直接引用就可以了&#xff0c;效果如下&#xff1a; 组件参数&#xff1a; 1.enable-close&#xff1a;是否允许关闭&#xff0c;默认true 2.bind:onsuccess&#xff1a;验证后回调方法 引用方式&#xff1a; <verification wx:if&qu…

11.Docker 之分布式仓库 Harbor

Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 VMware 开源&#xff0c;其通过添加一些企业必需的功能特性&#xff0c;例…

(一)趣学设计模式 之 单例模式!

目录 一、啥是单例模式&#xff1f;二、为什么要用单例模式&#xff1f;三、单例模式怎么实现&#xff1f;1. 饿汉式&#xff1a;先下手为强&#xff01; &#x1f608;2. 懒汉式&#xff1a;用的时候再创建&#xff01; &#x1f634;3. 枚举&#xff1a;最简单最安全的单例&a…

Chrome 浏览器(版本号49之后)‌解决跨域问题

谷歌浏览器解决跨域问题 如何查看 Chrome 浏览器版本号 打开 Chrome 浏览器点击右上角的三个点&#xff0c;打开“设置”页面 点击“关于Chrome” 查看版本号 解决跨域操作&#xff1a;windows系统为例 方法一&#xff1a;命令行启动方式&#xff08;最简单&#xff09; …

python中的JSON数据格式

文章目录 什么是json主要功能Python数据和Json数据的相互转化 什么是json JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据。JSON本质上是一个带有特定格式的字符串。 主要功能 json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编…

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分&#xff1a; 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑&#xff1a; 2022年6月6日&#xff1a;项目启动会2022年12月1日&#xff1a;系统上线 二、总体目标 通过SAP实施&#xff0c;构建研产供销协同、业财一…

JavaWeb-在idea中配置Servlet项目

文章目录 在idea中进行Servlet项目的配置(较新的idea版本)创建一个空的JavaSE项目(Project)创建一个普通的JavaSE板块(module)添加Web项目的配置定义一个对象模拟实现接口在web.xml中配置路径映射配置项目到Tomcat服务器启动Tomcat服务器进行测试 在idea中进行Servlet项目的配置…

【深度学习神经网络学习笔记(二)】神经网络基础

神经网络基础 神经网络基础前言1、Logistic 回归2、逻辑回归损失函数3、梯度下降算法4、导数5、导数计算图6、链式法则7、逻辑回归的梯度下降 神经网络基础 前言 Logistic 回归是一种广泛应用于统计学和机器学习领域的广义线性回归模型&#xff0c;主要用于解决二分类问题。尽…

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉&#xff0c;这里提出一种简单易懂的解法&#xff08;有点暴力&#xff09; 解题思路&#xff1a; 每个数字对应有自己的字母串&#xff1b; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母&#xff0c;让每个字母与…

React 源码揭秘 | 更新队列

前面几篇遇到updateQueue的时候&#xff0c;我们把它先简单的当成了一个队列处理&#xff0c;这篇我们来详细讨论一下这个更新队列。 有关updateQueue中的部分&#xff0c;可以见源码 UpdateQueue实现 Update对象 我们先来看一下UpdateQueue中的内容&#xff0c;Update对象&…

解锁养生密码,拥抱健康生活

在快节奏的现代生活中&#xff0c;养生不再是一种选择&#xff0c;而是我们保持活力、提升生活质量的关键。它不是什么高深莫测的学问&#xff0c;而是一系列融入日常的简单习惯&#xff0c;每一个习惯都在为我们的健康加分。 早晨&#xff0c;当第一缕阳光洒进窗户&#xff0c…