PEFT - 安装及简单使用

LLM、AIGC、RAG 开发交流裙:377891973


文章目录

    • 一、关于 PEFT
    • 二、安装
      • 1、使用 PyPI 安装
      • 2、使用源码安装
    • 三、快速开始
      • 1、训练
      • 2、保存模型
      • 3、推理
      • 4、后续步骤


本文翻译整理自:https://huggingface.co/docs/peft/index


一、关于 PEFT

🤗PEFT(Parameter-Efficient Fine-Tuning 参数高效微调)是一个库,用于有效地将大型预训练模型适应各种目标端应用,而无需微调模型的所有参数,因为它成本过高。
PEFT方法仅微调少量(额外)模型参数——显着降低计算和存储成本——同时产生与完全微调模型相当的性能。
这使得在消费硬件上训练和存储大型语言模型(LLM)更容易。

PEFT与Transformer、扩散器和加速库集成,提供了一种更快、更简单的方法来加载、训练和使用大型模型进行推理。


二、安装

PEFT 在 Python3.8+ 上经过测试。

🤗PEFT可从PyPI和GitHub上获得:


1、使用 PyPI 安装

要从PyPI安装🤗PEFT:

pip install peft

2、使用源码安装

每天都会添加尚未发布的新功能,这也意味着可能存在一些错误。
要试用它们,请从GitHub存储库安装:

pip install git+https://github.com/huggingface/peft

如果您正在努力为库做出贡献,或者希望使用源码并观看直播 结果当您运行代码时,可以从本地克隆的版本安装可编辑的版本 存储库:

git clone https://github.com/huggingface/peft
cd peft
pip install -e .

三、快速开始

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

PEFT提供了参数有效的方法 来微调大型预训练模型。
传统的范式是为每个下游任务微调模型的所有参数,但是由于当今模型中的参数数量巨大,这变得非常昂贵和不切实际。
相反,训练更少数量的提示参数 或 使用低秩自适应(LoRA)等重新参数化方法 来减少可训练参数的数量会更有效。

本快速导览将向您展示PEFT的主要功能,以及如何在消费设备上通常无法访问的大型模型上训练或运行推理。


1、训练

每个PEFT方法都由一个PeftConfig类定义,该类存储了构建PeftModel的所有重要参数。
例如,要使用LoRA进行训练,请加载并创建一个LoraConfig类并指定以下参数:

  • task_type:要训练的任务(在这种情况下sequence-to-sequence语言模型化)
  • inference_mode无论你是否使用模型进行推理
  • r:低秩矩阵的维度
  • lora_alpha:低秩矩阵的缩放因子
  • lora_dropout:LoRA层的暂退法概率

from peft import LoraConfig, TaskTypepeft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)

请参阅LoraConfig参考,了解有关您可以调整的其他参数的更多详细信息,例如要定位的模块或偏置类型。

设置LoraConfig后,使用get_peft_model()函数创建一个PeftModel。
它需要一个基本模型 —— 您可以从Transformer库中加载,LoraConfig 包含 如何配置模型 以使用LoRA进行训练的参数。


加载要微调的基本模型。

from transformers import AutoModelForSeq2SeqLMmodel = AutoModelForSeq2SeqLM.from_pretrained("bigscience/mt0-large")

使用get_peft_model() 函数包装基本模型和 peft_config 以创建PeftModel。
要了解模型中可训练参数的数量,请使用print_trainable_parameters方法。

from peft import get_peft_modelmodel = get_peft_model(model, peft_config)
model.print_trainable_parameters()
"output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"

在 bigscience/mt0-large’s 1.2B 参数中,您只训练了其中的 0.19%!

就是这样🎉!


现在你可以用 Transformer Trainer、Accelerate 或任何自定义PyTorch 训练循环来训练模型。

例如,要使用Trainer类进行训练,请使用一些训练超参数设置一个TrainingArguments类。

training_args = TrainingArguments(output_dir="your-name/bigscience/mt0-large-lora",learning_rate=1e-3,per_device_train_batch_size=32,per_device_eval_batch_size=32,num_train_epochs=2,weight_decay=0.01,evaluation_strategy="epoch",save_strategy="epoch",load_best_model_at_end=True,
)

将模型、训练参数、数据集、标记器和任何其他必要的组件 传递给Trainer,并调用 train 开始训练。

trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_datasets["train"],eval_dataset=tokenized_datasets["test"],tokenizer=tokenizer,data_collator=data_collator,compute_metrics=compute_metrics,
)trainer.train()

2、保存模型

模型完成训练后,可以使用save_pretrained函数将模型保存到目录中。

model.save_pretrained("output_dir")

您还可以使用push_to_hub函数将模型保存到 Hub (确保您已登录到您的拥抱脸帐户)。

from huggingface_hub import notebook_loginnotebook_login()
model.push_to_hub("your-name/bigscience/mt0-large-lora")

这两种方法都只保存经过训练的额外PEFT权重,这意味着存储、传输和加载效率极高。

例如,这个用LoRA训练的facebook/opt-350m模型只包含两个文件:adapter_config.jsonadapter_model.safetensors
adapter_model.safetensors 文件只有6.3MB!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

存储在 Hub 上的350m模型的适配器权重只有约6MB,而模型权重的完整大小可以约700MB。


3、推理

查看AutoPeftModelAPI参考以获取可用AutoPeftModel类的完整列表。

使用AutoPeftModel类和from_pretrained方法轻松加载任何经过PEFT训练的推理模型:

from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torchmodel = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")model = model.to("cuda")
model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."

对于AutoPeftModelFor类未明确支持的其他任务(例如自动语音识别),您仍然可以使用基础 AutoPeftModel类来加载任务的模型。

from peft import AutoPeftModelmodel = AutoPeftModel.from_pretrained("smangrul/openai-whisper-large-v2-LORA-colab")

4、后续步骤

现在您已经了解了如何使用其中一种PEFT方法训练模型,我们鼓励您尝试一些其他方法,例如 prompt tuning。
这些步骤与快速导览中显示的步骤非常相似:

  1. 准备一个PeftConfig用于PEFT方法
  2. 使用get_peft_model()方法从配置和基本模型创建PeftModel

然后你可以随心所欲地训练它!要加载PEFT模型进行推理,可以使用AutoPeftModel类。

如果您有兴趣为特定任务(如语义分割、多语言自动语音识别、DreamBooth、代币分类等)使用另一种PEFT方法训练模型,请随意查看任务指南。


伊织 2024-07-05

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

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

相关文章

BugKu-WEB-sodirty

目录 前言 正文 信息收集 代码审计 验证 结尾 前言 七月始,暑假副本也正式开启 正文 信息收集 看着貌似没啥意义 看样子是有备份文件 下载下来 快速审计一下 代码审计 来吧 app.js没啥东西,主要是功能是实现error 我们找一找有没有index.js 找到了 \www\routes\in…

使用 Git Hooks 防止敏感信息泄露

欢迎关注公众号:冬瓜白 在日常开发中,我们可能会不小心将敏感信息提交到 Git。为了防止这种情况,可以利用 Git Hooks 编写一个简单的脚本,当发现提交中包含敏感词时,给出提示。 以下是一个基于 pre-commit 钩子的示例…

踩坑:Unity导出WebGL发布到手机上竖屏时强制显示横屏

具体的适配问题 公司的项目需要将游戏导出WebGL 发布到Web平台 本以为是个很简单的事情 谁知道却被个横竖屏适配搞的头晕 毕竟只有大学浅浅的学了下HTML这门语言 出来工作后基本上都是在跟C# Lua打交道 言归正传 看看具体问题吧 游戏如果从横屏进入 基本上不会有什么适配问题…

Finding Global Homophily in Graph Neural Networks When Meeting Heterophily

本文发表于:ICML22 推荐指数: #paper/⭐⭐⭐ 问题背景: 异配图的邻接矩阵难以确定,以及异配图的计算复杂度开销大 可行的解决办法:高通滤波多跳邻居,GPRGNN(pagerank一类,各阶邻居的权重不同,ACM-GCN(高低通滤波,H2GCN(应该复杂度很大&…

碳课堂|搞清楚碳足迹,只看这篇文章就够了

碳足迹管理是碳达峰碳中和的重要政策工具,2023年12月,国家发展改革委、工信部、国家市场监管总局、住房城乡建设部、交通运输部等部门联合印发《关于加快建立产品碳足迹管理体系的意见》,对产品碳足迹管理各项重点任务作出系统部署。 推动碳…

[leetcode]文件组合

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> fileCombination(int target) {vector<vector<int>> vec;vector<int> res;int sum 0, limit (target - 1) / 2; // (target - 1) / 2 等效于 target /…

Windows 11内置一键系统备份与还原 轻松替代Ghost

面对系统崩溃、恶意软件侵袭或其他不可预见因素导致的启动失败&#xff0c;Windows 7~Windows 11内置的系统映像功能能够迅速将您的系统恢复至健康状态&#xff0c;确保工作的连续性和数据的完整性。 Windows内置3种备份策略 U盘备份&#xff1a;便携且安全 打开“创建一个恢…

Ubuntu20.04突然没网的一种解决办法

本来要学一下点云地图处理&#xff0c;用octomap库&#xff0c;但是提示少了octomap-server库&#xff0c;然后通过下面命令安装的时候&#xff1a; sudo apt install ros-noetic-octomap-server 提示&#xff1a;错误:7 https://mirrors.ustc.edu.cn/ubuntu focal-security …

MWC上海展 | 创新微MinewSemi携ME54系列新品亮相Nordic展台

6月28日&#xff0c; 2024MWC上海圆满落幕&#xff0c;此次盛会吸引了来自全球124个国家及地区的近40,000名与会者。本届大会以“未来先行&#xff08;Future First&#xff09;”为主题&#xff0c;聚焦“超越5G”“人工智能经济”“数智制造”三大子主题&#xff0c;探索讨论…

溶解氧(DO)理论指南(1)

转载自梅特勒官网资料&#xff0c;仅用于学习交流&#xff0c;侵权则删&#xff01; 溶解氧理论指南 1 溶解氧(DO)原理1.1 溶解氧和分压1.2 氧气在水中的溶解度1.3 溶解氧对生物的重要性1.4 溶解氧对工业的重要性 1 溶解氧(DO)原理 氧是宇宙中第三大常见元素&#xff0c;也是…

JavaScript(6)——数据类型转换

为什么需要类型转换&#xff1f; JavaScript是弱数据类型&#xff1a;JavaScript不知道变量到底属于哪种数据类型&#xff0c;只有赋值了才清除 使用表单&#xff0c;prompt获取的数据默认为字符串类型&#xff0c;此时不能直接进行算数运算 隐式转换 某些运算符被执行时&am…

两次叛国投敌,没有祸及子孙反而家族长盛不衰的传奇

这个人就是韩国国王韩王信&#xff0c;汉朝八大异姓王之一。 第一次叛国投敌&#xff0c;发生在楚汉争霸时期。有一次他的军队被项羽包围&#xff0c;于是选择了投降。不过&#xff0c;这是权宜之计&#xff0c;不久就借机回到刘邦阵营。 第二次叛国投敌&#xff0c;发生在西…

【Linux开发】基于ALSA库实现音量调节

基于ALSA库实现音量调节 ALSA库实现音量调节1、使用alsamixer工具查看音频接口2、完整代码2.1、snd_mixer_open2.2、snd_mixer_attach、2.3、snd_mixer_selem_register2.4、snd_mixer_load2.5、snd_mixer_first_elem/snd_mixer_elem_next2.6、snd_mixer_selem_get_playback_vol…

从零开始使用 Docsify 搭建文档站点

引言 在当今的技术环境中&#xff0c;拥有一份易于访问和美观的文档是至关重要的。Docsify 是一个非常适合快速搭建文档站点的工具&#xff0c;它简单易用&#xff0c;且不需要生成静态文件。本文将带你一步步从零开始使用 Docsify 搭建一个文档站点。 1. 安装 Node.js 和 np…

【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC Enable 1 of N Wakeup Function基本原理工作机制配置方式应用场景小结GIC Enable 1 of N Wakeup Function 在ARM GICv3(Generic Interrupt Controller第三代)规范中,引入了一个名为"Enable 1 of N Wakeup"的功能。…

(一)Docker基本介绍

部署项目的发展 传统部署适合需要最大性能和可靠性的场景&#xff0c;但在资源利用和管理方面有显著劣势。虚拟化部署提供了良好的资源利用率和隔离性&#xff0c;适用于需要灵活扩展和多租户环境的场景&#xff0c;但存在性能开销。容器部署在轻量级、可移植性和资源利用率方面…

适合金融行业的国产传输软件应该是怎样的?

对于金融行业来说&#xff0c;正常业务开展离不开文件传输场景&#xff0c;一般来说&#xff0c;金融行业常用的文件传输工具有IM通讯、邮件、自建文件传输系统、FTP应用、U盘等&#xff0c;这些传输工具可以基础实现金融机构的文件传输需求&#xff0c;但也存在如下问题&#…

google 邮件信息收集

主要介绍通过google和fofax对目标进行邮件信息收集 chrome插件 email-whatsapp-extractor link-klipper-extract-all bulk-url-opener-extension email-whatsapp-extractor 使用正则表达式&#xff0c;获取访问页面内所有的email邮箱和whatsapp号码&#xff0c;以表格的形式导…

el-table封装点击列筛选行数据功能,支持筛选,搜索,排序功能

数据少的话&#xff0c;可以前端实现&#xff0c;如果多的话&#xff0c;建议还是请求接口比较合理父组件&#xff1a; <template> <div class"home"> <!-- <img alt"Vue logo" src"../assets/logo.png"> <HelloWorld …

Hilbert编码 思路和scala 代码

需求&#xff1a; 使用Hilbert 曲线对遥感影像瓦片数据进行编码&#xff0c;获取某个区域的编码值即可 Hilbert 曲线编码方式 思路 大致可以对四个方向的数据进行归类 左下左上右上右下 这个也对应着编码的顺序 思考在不同Hilbert深度&#xff08;阶&#xff09;情况下的…