hugging face笔记:PEFT

news2025/1/15 20:50:53

1 介绍

  • PEFT (Parameter-Efficient Fine Tuning) 方法在微调时冻结预训练模型参数,并在其上添加少量可训练的参数(称为适配器)
  • 这些适配器被训练用来学习特定任务的信息。
  • 这种方法已被证明在内存效率和计算使用上非常高效,同时能产生与完全微调模型相当的结果
  • 使用PEFT训练的适配器通常比完整模型小一个数量级,这使得分享、存储和加载它们变得非常方便。
    • 例如,一个OPTForCausalLM模型的适配器权重在Hub上的存储只有约6MB
    • 相比之下,完整的模型权重可以达到约700MB。

2 加载 PEFT适配器

2.1 直接from_pretrained加载

  • 若要从 Transformers 加载和使用 PEFT 适配器模型,请确保 Hub 存储库或本地目录包含 adapter_config.json 文件和适配器权重
  • 然后,可以使用 AutoModel类加载 PEFT 适配器模型
from transformers import AutoModelForCausalLM, AutoTokenizer

peft_model_id = "ybelkada/opt-350m-lora"
model = AutoModelForCausalLM.from_pretrained(peft_model_id)

2.2 load_adapter加载

from transformers import AutoModelForCausalLM

model_id = "facebook/opt-350m"
peft_model_id = "ybelkada/opt-350m-lora"

model = AutoModelForCausalLM.from_pretrained(model_id)
model.load_adapter(peft_model_id)

 2.3 以8位/4位加载

  • bitsandbytes 集成支持 8 位和 4 位精度数据类型,这对于加载大型模型非常有用,因为它节省了内存
  • 在 from_pretrained() 中添加 load_in_8bit 或 load_in_4bit 参数,并设置 device_map="auto" 以有效地将模型分配到你的硬件
from transformers import AutoModelForCausalLM, AutoTokenizer

peft_model_id = "ybelkada/opt-350m-lora"
model = AutoModelForCausalLM.from_pretrained(peft_model_id, 
                                             device_map="auto", 
                                             load_in_8bit=True)

3 添加适配器 

from transformers import AutoModelForCausalLM
from peft import LoraConfig

model_id = "facebook/opt-350m"
model = AutoModelForCausalLM.from_pretrained(model_id)
#加载这个模型

lora_config = LoraConfig(
    target_modules=["q_proj", "k_proj"],
    init_lora_weights=False
)
'''
target_modules 参数指定了将 LoRA 适配器应用于模型的哪些部分

这里是 "q_proj"(查询投影)和 "k_proj"(键投影)

init_lora_weights 设置为 False,意味着在初始化时不加载 LoRA 权重
'''

model.add_adapter(lora_config, adapter_name="adapter_1")
#使用 add_adapter 方法将之前配置的 LoRA 适配器添加到模型中,适配器命名为 "adapter_1"


model.add_adapter(lora_config, adapter_name="adapter_2")
# 附加具有相同配置的新适配器"adapter_2"

4 设置使用哪个适配器

# 使用 adapter_1
model.set_adapter("adapter_1")
output = model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))

# 使用 adapter_2
model.set_adapter("adapter_2")
output_enabled = model.generate(**inputs)
print(tokenizer.decode(output_enabled[0], skip_special_tokens=True))

5 启用和禁用适配器

一旦向模型添加了适配器,可以启用或禁用适配器模块

from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
from peft import PeftConfig

model_id = "facebook/opt-350m"
adapter_model_id = "ybelkada/opt-350m-lora"


tokenizer = AutoTokenizer.from_pretrained(model_id)
text = "Hello"
inputs = tokenizer(text, return_tensors="pt")
#加载分词器和初始化输入



model = AutoModelForCausalLM.from_pretrained(model_id)
peft_config = PeftConfig.from_pretrained(adapter_model_id)
'''
加载了预训练的基础模型 facebook/opt-350m 和适配器的配置。

PeftConfig.from_pretrained 方法用于加载预定义的适配器配置。
'''


peft_config.init_lora_weights = False
model.add_adapter(peft_config)
'''
在添加适配器前,设置 init_lora_weights = False 指明在初始化时不使用预训练的 LoRA 权重,
而是使用随机权重。

然后将适配器添加到模型中。
'''



model.enable_adapters()
output1 = model.generate(**inputs)
#启用适配器,然后使用启用了适配器的模型生成文本




model.disable_adapters()
output2 = model.generate(**inputs)
#禁用适配器后,再次生成文本以查看不使用适配器时模型的输出表现


tokenizer.decode(output1[0])
'''
'</s>Hello------------------'
'''

tokenizer.decode(output2[0])
'''
"</s>Hello, I'm a newbie to this sub. I'm looking for a good place to"
'''

6 训练PEFT适配器

6.1 举例:添加lora适配器

6.1.1 定义你的适配器配置

from peft import LoraConfig

peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
)

  • lora_alpha=16:指定 LoRA 层的缩放因子。
  • lora_dropout=0.1:设置在 LoRA 层中使用的 dropout 比率,以避免过拟合。
  • r=64:设置每个 LoRA 层的秩,即低秩矩阵的维度。
  • bias="none":指定不在 LoRA 层中使用偏置项。
  • task_type="CAUSAL_LM":设定这个 LoRA 配置是为了因果语言模型任务。

6.1.2 将适配器添加到模型

model.add_adapter(peft_config)

6.1.3将模型传递给 Trainer以进行训练

from transformers import Trainer
trainer = Trainer(model=model, ...)
trainer.train()

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

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

相关文章

靠着单干实现财富自由,可太爽了

这里所说的“单干”&#xff0c;并不是单打独斗的意思&#xff0c;而是一种商业认知&#xff0c;以及由这种认知衍生出来的商业模式、商业方法和商业实践。 之前提到单干&#xff0c;会本能地以为它是指脱离公司等组织形式&#xff0c;自己一个人做生意。现在单干有了更丰富的…

第十二章 网络编程

第十二章 网络编程 网络协议概述 通信协议&#xff1a; 协议即规则&#xff0c;就好比汽车上路要遵守交通规则一样&#xff0c;为了使全世界不同类型的计算机都可以连接起来&#xff0c;所以制定了一套全球通用的通信协议——Internet协议。有了Internet协议&#xff0c;任何…

【网络技术】【Kali Linux】Wireshark嗅探(十二)NBNS协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

Swift 类和结构体

类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构&#xff0c;成为了人们构建代码的基础。你可以使用定义常…

汇舟问卷:海外问卷调查如何闭坑?

大家好&#xff0c;我是汇舟问卷。有很多人问我这行有什么骗局吗&#xff1f;怎么说呢&#xff1f;其实每个行业都是真实存在的&#xff0c;也都有赚到钱的和赚不到钱的&#xff0c;那区别在哪里呢&#xff1f; 在你的源头&#xff0c;也就是教你或者说是代理加盟的上家&#…

LabVIEW舱段测控系统开发

LabVIEW舱段测控系统开发 在航空技术飞速发展的当下&#xff0c;对于航空器的测控系统的需求日益增加&#xff0c;特别是对舱段测控系统的设计与实现。开发了一款基于LabVIEW开发的舱段测控系统&#xff0c;包括系统设计需求、系统组成、工作原理以及系统实现等方面。 开发了…

电赛经验分享——赛前准备

⏩ 大家好哇&#xff01;我是小光&#xff0c;想要成为系统架构师的嵌入式爱好者。 ⏩在之前的电赛中取得了省一的成绩&#xff0c;本文对电赛比赛前需要准备什么做一个经验分享。 ⏩感谢你的阅读&#xff0c;不对的地方欢迎指正。 加入小光嵌入式交流群&#xff08;qq群号&…

【问题解决】Android Studio Jellyfish新建Kotlin项目后Gradle Sync及Maven下载很慢

创建新项目之后&#xff0c;Gradle Sync和Build都很慢&#xff0c;因为下载Gradle和Maven等工具。 代码默认配置 settings.gradle.kts pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.g…

框架学习之SpringMVC学习笔记(一)

一、SpringMVC简介 1-介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08; spring-webmvc &#xff09;&#xff0c;但它通常被称为“Spring MVC”。 在控制层…

C语言中的 ?: :三元运算符详解

C语言中的 ?: &#xff1a;三元运算符详解 在C语言的浩瀚代码海洋中&#xff0c;三元运算符&#xff08;?:&#xff09;如同一位优雅的舞者&#xff0c;以简洁的姿态完成条件判断与赋值的双重任务。它以问号&#xff08;?&#xff09;和冒号&#xff08;:&#xff09;这两个…

魔众文库系统v6.6.0分销功能,后台日志重构,文档转换优化

分销功能&#xff0c;后台日志重构&#xff0c;文档转换优化 [新功能] 升级支持支付宝授权登录最新方式 [新功能] 后台左上角标题支持自定义&#xff0c;修改 modstart.php 中 admin.title 配置 [新功能] 日志界面重构&#xff0c;全新日志查看体验 [新功能] 链接选择弹窗增…

C语言 | Leetcode C语言题解之第110题平衡二叉树

题目&#xff1a; 题解&#xff1a; int height(struct TreeNode* root) {if (root NULL) {return 0;}int leftHeight height(root->left);int rightHeight height(root->right);if (leftHeight -1 || rightHeight -1 || fabs(leftHeight - rightHeight) > 1) {…

SpringBoot3整合阿里云短信服务-1(配置阿里云短信服务)

SpringBoot3整合阿里云短信服务-1(配置阿里云短信服务) 一、开通阿里云短信服务 阿里云官网:阿里云官网 选择产品中企业服务与云通信中的短信服务 选择免费开通 选择快速学习和测试 根据这几个全部配置一下我这里是配置好了所以学习进度是100% 1.1 添加资质 首先选择新增资质 …

三台泵恒压供水站电控系统及PLC程序设计实例

本文由艺捷自动化编写&#xff0c;其旗下产品有艺捷自动化网站和易为二维码说明书小程序&#xff08;微信&#xff09; 本文以一个具体的项目案例&#xff0c;来讲述一个恒压供水站的电控柜设计过程。包括用户需求&#xff0c;材料选型&#xff0c;图纸设计&#xff0c;柜内布…

微软新功能Recall引发隐私担忧,英国数据监管机构展开调查

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

大语言模型的工程技巧(三)——分布式计算

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文将讨论如何利用多台机器进行神经网络的分布式训练。利用多台机器来加速大语言模型的训练&#xff0c;是其获得成功的重要原…

政安晨:【Keras机器学习示例演绎】(四十九)—— 利用 KerasNLP 实现语义相似性

目录 简介 数据集 设置 准备数据 配置特征空间 进一步自定义特征空间 根据训练数据调整特征空间 制作模型 训练模型 使用端到端模型对新数据进行推理 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实…

Redis服务启动以及连接redis客户端(可配置密码)

1.Redis解压后目录 启动服务器&#xff1a; 1. 输入&#xff1a;redis-server.exe redis.windows.conf回车 ctrlC退出 连接客户端&#xff1a; 同样先打开命令窗口&#xff1a; 输入redis-cli.exe或者redis-cli.exe -h localhost -p 6379 exit退出 注意&#xff1a;想添加密…

DSPy - prompt 优化

文章目录 一、关于 DSPy与神经网络的类比常见问题解答**DSPy 优化器可以调整什么&#xff1f;****我应该如何使用 DSPy 完成我的任务&#xff1f;****如果我对提示或合成数据生成有更好的想法怎么办&#xff1f;**DSPy 代表什么&#xff1f; 二、安装三、文档A) 教程B) 指南C) …

LuatOS-iRTU

DTU 英文全称为Data Transfer Unit&#xff0c;表示数据传输单元。 是专门用于将串口数据转为IP数据或将I[数据转换为串口数据&#xff0c;通过无线通信网络进行传送的无线终端设备。 业务逻辑包括数据采集上报&#xff1a; 传感器采集数据发送给单片机&#xff0c;单片机由串…