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.rhkb.cn/news/369439.html

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

相关文章

论文导读 | 综述:大模型与推荐系统

最近,预训练语言模型(PLM)在自然语言处理领域取得了巨大成功,并逐渐引入推荐系统领域。本篇推文介绍了最近的两篇预训练语言模型和推荐系统结合的综述: [1] Pre-train, Prompt, and Recommendation: A Comprehensive …

鼠标自动点击器怎么用?鼠标连点器入门教程!

鼠标自动点击器是适用于Windows电脑的自动执行鼠标点击操作的工具,主要用于模拟鼠标点击操作,实现鼠标高速点击的操作。通过模拟鼠标点击,可以在用户设定的位置、频率和次数下自动执行点击动作。 鼠标自动点击器主要的应用场景: …

2024年7月5日 (周五) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《乐高地平线大冒险》为何不登陆…

专题三:Spring源码中新建module

前面我们构建好了Spring源码,接下来肯定迫不及待来调试啦,来一起看看大名鼎鼎ApplicationContext 新建模块 1、基础步骤 1.1 自定义模块名称如:spring-self 1.2 选择构建工具因为spring使用的是gradle,所以这边需要我们切换默认…

【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…

【Spring Boot】统一数据返回

目录 统一数据返回一. 概念二.实现统一数据返回2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维,简单…

【原创图解 算法leetcode 146】实现一个LRU缓存淘汰策略策略的数据结构

1 概念 LRU是Least Recently Used的缩写,即最近最少使用,是一种常见的缓存淘汰算法。 其核心思想为:当内存达到上限时,淘汰最久未被访问的缓存。 2 LeetCode LeetCode: 146. LRU缓存 3 实现 通过上面LRU的淘汰策略可知&#…

【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树

目录 1 -> 底层结构 2 -> AVL树 2.1 -> AVL树的概念 2.2 -> AVL树节点的定义 2.3 -> AVL树的插入 2.4 -> AVL树的旋转 2.5 -> AVL树的验证 2.6 -> AVL树的性能 1 -> 底层结构 在上文中对对map/multimap/set/multiset进行了简单的介绍&…

【遇坑笔记】Node.js 开发环境与配置 Visual Studio Code

【遇坑笔记】Node.js 开发环境与配置 Visual Studio Code 前言node.js开发环境配置解决pnpm 不是内部或外部命令的问题(pnpm安装教程)解决 pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。 vscode 插件开…

爆!Java高级特性之Stream API详解

爆!Java高级特性之Stream API详解 Java 8引入的Stream API可以说是一个革命性的特性,让我们告别了又臭又长的for循环,迎来了函数式编程的春天。今天就让我们来一起深入了解这个让人又爱又恨的Stream API吧! 什么是Stream? Stream就像一个高级的迭代器,允许我们以…

Git代码提交流程

1. 核心流程 2. 完成流程

JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程

1. 对象的创建 遇到new指令时 当Java虚拟机遇到一个字节码new指令时。 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。 如果没有,那么必须执行类的加载过程(加载、检查…

c++之旅第十一弹——顺序表

大家好啊,这里是c之旅第十一弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一,数据结构…

【力扣】赎金信

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 给你两个字符串…

免杀笔记 ----> ShellCode Loader !!!

学了那么久的前置知识,终于到了能上线的地方了!!! 不过这里还没到免杀的部分,距离bypass一众的杀毒软件还有很长的路要走!! 目录 1.ShellCode 2.ShellCode Loader的概念 3.可读可写可…

使用AES加密数据传输的iOS客户端实现方案

在现代应用开发中,确保数据传输的安全性是至关重要的。本文将介绍如何在iOS客户端中使用AES加密数据传输,并与服务器端保持加密解密的一致性。本文不会包含服务器端代码,但会解释其实现原理。 加密与解密的基本原理 AES(Advance…

AIGI赋能未来:人工智能如何重塑电子电路学习体验

文章目录 一、掌握基础知识与技能1. 扎实理论基础2. 熟练使用工具 二、融合AI技术提升学习效率1. 利用AI辅助学习平台2. 应用AI工具进行电路设计与仿真 三、探索创新应用方向1. 关注AI与电子电路的交叉领域2. 参与开源项目和竞赛 四、培养跨学科思维1. 加强数学与计算机科学知识…

比Proxmox VE更易用的免费虚拟化平台

之前虚拟化一直玩Proxmox VE,最近发现一个更易用的虚拟化软件CSYun,他与Proxmox VE类似,都是一个服务器虚拟化平台。它不像VMware ESXi那么复杂,对于个人使用者和中小企业是一个比较好的选择。 这个软件所在的网址为:…

(一)Docker基本介绍

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

[SAP ABAP] 子例程

子例程 示例1 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 示例2 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 补充扩展练习 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 提示…