当前位置: 首页 > news >正文

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

相关文章:

  • [算法]——堆排序(C语言实现)
  • MUNIK解读ISO26262--系统架构
  • 网络编程:UDP编程笔记
  • (一)Docker基本介绍
  • 【PYG】dataloader和densedataloader
  • 解决Linux环境Qt报“cannot find -lgl“问题
  • 2024.7.5
  • 【单链表】04 试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为0(1)。
  • VPN是什么?
  • 实验三 图像增强—灰度变换
  • Windows 11 安装 安卓子系统 (WSA)
  • Cesium与Three相机同步(3)
  • 安装局部的typeScript环境
  • 【C++】 解决 C++ 语言报错:Undefined Reference
  • window上部署sql server改动端口、和sqlserver的一些还原、批量插入存储过程的命令
  • co模块的前端实现
  • C语言笔记(第一章:C语言编程)
  •  D - 粉碎叛乱F - 其他起义
  • interface和setter,getter
  • Linux链接文件
  • Objective-C 中关联引用的概念
  • React+TypeScript入门
  • SpringBoot 实战 (三) | 配置文件详解
  • text-decoration与color属性
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于Java中分层中遇到的一些问题
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 爬虫模拟登陆 SegmentFault
  • 普通函数和构造函数的区别
  • 设计模式走一遍---观察者模式
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 阿里云ACE认证学习知识点梳理
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #mysql 8.0 踩坑日记
  • $.ajax()参数及用法
  • $GOPATH/go.mod exists but should not goland
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (翻译)terry crowley: 写给程序员
  • (附源码)php投票系统 毕业设计 121500
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (一)80c52学习之旅-起始篇
  • ***原理与防范
  • .NET CF命令行调试器MDbg入门(一)
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET Micro Framework 4.2 beta 源码探析
  • .net mvc 获取url中controller和action
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 调用php,php 调用.net com组件 --
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .net中我喜欢的两种验证码
  • .net专家(高海东的专栏)