huggingface - PEFT.参数效率微调

news2024/7/4 15:49:19

GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.

最先进的参数高效微调 (PEFT) 方法

Parameter-Efficient Fine-Tuning (PEFT) 方法可以使预训练语言模型 (PLM) 高效适应各种下游应用程序,而无需微调模型的所有参数。微调大型 PLM 的成本通常高得令人望而却步。在这方面,PEFT 方法仅微调少量(额外)模型参数,从而大大降低了计算和存储成本。最近最先进的 PEFT 技术实现了与完全微调相当的性能。

无缝集成Seamlessly integrated with

利用 DeepSpeed 和大模型推理加速大规模模型。

支持的方法:

  1. LoRA:LORA:大语言模型的低阶自适应
  2. 前缀调优:前缀调优:优化生成的连续提示,P-Tuning v2:提示调优可与跨尺度和任务的通用微调相媲美
  3. P-Tuning:GPT 也能理解
  4. 快速调整:参数有效快速调整的规模的力量
  5. AdaLoRA:用于参数高效微调的自适应预算分配

Supported methods:

  1. LoRA: LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  2. Prefix Tuning: Prefix-Tuning: Optimizing Continuous Prompts for Generation, P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
  3. P-Tuning: GPT Understands, Too
  4. Prompt Tuning: The Power of Scale for Parameter-Efficient Prompt Tuning
  5. AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning

入门

from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType
model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"

peft_config = LoraConfig(
    task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)

model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
# output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282

用例

通过使用消费类硬件使 LLM 适应下游任务,获得与完全微调相当的性能

在少样本数据集上调整 LLM 所需的 GPU 内存ought/raft/twitter_complaints。在这里,考虑的设置是完全微调、使用普通 PyTorch 的 PEFT-LoRA 和使用具有 CPU 卸载的 DeepSpeed 的 PEFT-LoRA。

硬件:单个 A100 80GB GPU,CPU RAM 64GB 以上

模型全面微调PEFT-LoRA PyTorch具有 CPU 卸载功能的 PEFT-LoRA DeepSpeed
bigscience/T0_3B(3B 参数)47.14GB GPU / 2.96GB CPU14.4GB GPU / 2.96GB CPU9.8GB GPU / 17.8GB CPU
bigscience/mt0-xxl(12B 参数)内存管理器56GB 图形处理器 / 3GB 中央处理器22GB 图形处理器 / 52GB 中央处理器
bigscience/bloomz-7b1(7B 参数)内存管理器32GB 图形处理器 / 3.8GB 中央处理器18.1GB GPU / 35GB CPU

PEFT-LoRA 的性能在排行榜bigscience/T0_3B上进行了调整ought/raft/twitter_complaints。需要注意的一点是,我们并没有尝试通过使用输入指令模板、LoRA 超参数和其他与训练相关的超参数来压缩性能。此外,我们没有使用更大的 13B mt0-xxl型号。因此,我们已经看到通过参数有效调整获得与 SoTA 相当的性能。此外,最终的检查点大小只是与主干模型的大小19MB进行比较。11GBbigscience/T0_3B

Submission NameAccuracy
Human baseline (crowdsourced)0.897
Flan-T50.892
lora-t0-3b0.863

 

因此,我们可以看到,使用 16GB 和 24GB GPU 等消费类硬件,通过 PEFT 方法可以实现与 SoTA 相当的性能。

一篇富有洞察力的博文解释了使用 PEFT 微调 ​​FlanT5-XXL 的优势:https://www.philschmid.de/fine-tune-flan-t5-peft

扩散模型的参数有效调整

下面给出了训练期间不同设置所需的 GPU 内存。最终检查点大小为8.8 MB.

硬件:单个 A100 80GB GPU,CPU RAM 64GB 以上

模型全面微调PEFT-LoRA具有梯度检查点的 PEFT-LoRA
CompVis/stable-diffusion-v1-427.5GB 图形处理器 / 3.97GB 中央处理器15.5GB 图形处理器 / 3.84GB 中央处理器8.12GB 图形处理器 / 3.77GB 中央处理器

训练使用 LoRA 进行参数有效的 Dreambooth 训练的示例在examples/lora_dreambooth/train_dreambooth.py

export MODEL_NAME= "CompVis/stable-diffusion-v1-4" #"stabilityai/stable-diffusion-2-1"
export INSTANCE_DIR="path-to-instance-images"
export CLASS_DIR="path-to-class-images"
export OUTPUT_DIR="path-to-save-model"

accelerate launch train_dreambooth.py \
  --pretrained_model_name_or_path=$MODEL_NAME  \
  --instance_data_dir=$INSTANCE_DIR \
  --class_data_dir=$CLASS_DIR \
  --output_dir=$OUTPUT_DIR \
  --train_text_encoder \
  --with_prior_preservation --prior_loss_weight=1.0 \
  --instance_prompt="a photo of sks dog" \
  --class_prompt="a photo of dog" \
  --resolution=512 \
  --train_batch_size=1 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --num_class_images=200 \
  --use_lora \
  --lora_r 16 \
  --lora_alpha 27 \
  --lora_text_encoder_r 16 \
  --lora_text_encoder_alpha 17 \
  --learning_rate=1e-4 \
  --gradient_accumulation_steps=1 \
  --gradient_checkpointing \
  --max_train_steps=800

尝试一下

应在 T4 实例上无缝运行的 Gradio Space:smangrul/peft-lora-sd-dreambooth。

新的 

多适配器支持并将多个 LoRA 适配器组合成加权组合

Ranker 和 Policy 等 RLHF 组件的 LLM 参数高效调整

  • 以下是trl库中使用 PEFT+INT8 调整策略模型的示例: gpt2-sentiment_peft.py和相应的博客
  • 使用 PEFT 进行指令微调、奖励模型和策略的示例:stack_llama和相应的博客

使用 PEFT LoRA 和 bits_and_bytes 在 Colab 中对大型模型进行 INT8 训练

  • 下面是关于如何在 Google Colab 中微调OPT-6.7b (fp16 中的 14GB)的演示:

  • 下面是一个关于如何在 Google Colab 中微调whisper-large (1.5B 参数)(14GB in fp16)的演示:和

即使对于中小型模型也能节省计算和存储

通过避免在每个下游任务/数据集上对模型进行完全微调来节省存储,使用 PEFT 方法,用户只需要按顺序存储微小的检查点,同时MBs保持与完全微调相当的性能。

中给出了使用 LoRA 来完成数据集LayoutLMForTokenClassification自适应任务的示例。我们可以观察到,只有参数可训练,我们实现的性能 (F1 0.777) 可与完全微调 (F1 0.786) 相媲美(没有任何 hyerparam 调整运行以提取更多性能),并且此检查点仅为. 现在,如果有这样的数据集,只需为每个数据集一个这些 PEFT 模型,并节省大量存储空间,而不必担心骨干/基础模型的灾难性遗忘或过度拟合问题。FUNSD~examples/token_classification/PEFT_LoRA_LayoutLMForTokenClassification_on_FUNSD.py0.62 %2.8MBN

roberta-large另一个例子是使用不同的 PEFT 方法对MRPCGLUE数据集进行微调。笔记本在~examples/sequence_classification.

聚四氟乙烯+

加速

PEFT 模型与

开箱即用加速。使用在训练期间加速在各种硬件(例如 GPU、Apple Silicon 设备等)上的分布式训练。使用加速在资源较少的消费类硬件上进行推理。

使用 PEFT 模型训练的示例

Accelerate 的 DeepSpeed 集成

需要 DeepSpeed 版本v0.8.0。中提供了一个示例~examples/conditional_generation/peft_lora_seq2seq_accelerate_ds_zero3_offload.py。A。首先,运行accelerate config --config_file ds_zero3_cpu.yaml并回答问卷。下面是配置文件的内容。

compute_environment: LOCAL_MACHINE
deepspeed_config:
  gradient_accumulation_steps: 1
  gradient_clipping: 1.0
  offload_optimizer_device: cpu
  offload_param_device: cpu
  zero3_init_flag: true
  zero3_save_16bit_model: true
  zero_stage: 3
distributed_type: DEEPSPEED
downcast_bf16: 'no'
dynamo_backend: 'NO'
fsdp_config: {}
machine_rank: 0
main_training_function: main
megatron_lm_config: {}
mixed_precision: 'no'
num_machines: 1
num_processes: 1
rdzv_backend: static
same_network: true
use_cpu: false

b. 运行以下命令以启动示例脚本

accelerate launch --config_file ds_zero3_cpu.yaml examples/peft_lora_seq2seq_accelerate_ds_zero3_offload.py

C。输出日志:

GPU Memory before entering the train : 1916
GPU Memory consumed at the end of the train (end-begin): 66
GPU Peak Memory consumed during the train (max-begin): 7488
GPU Total Peak Memory consumed during the train (max): 9404
CPU Memory before entering the train : 19411
CPU Memory consumed at the end of the train (end-begin): 0
CPU Peak Memory consumed during the train (max-begin): 0
CPU Total Peak Memory consumed during the train (max): 19411
epoch=4: train_ppl=tensor(1.0705, device='cuda:0') train_epoch_loss=tensor(0.0681, device='cuda:0')
100%|████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:27<00:00,  3.92s/it]
GPU Memory before entering the eval : 1982
GPU Memory consumed at the end of the eval (end-begin): -66
GPU Peak Memory consumed during the eval (max-begin): 672
GPU Total Peak Memory consumed during the eval (max): 2654
CPU Memory before entering the eval : 19411
CPU Memory consumed at the end of the eval (end-begin): 0
CPU Peak Memory consumed during the eval (max-begin): 0
CPU Total Peak Memory consumed during the eval (max): 19411
accuracy=100.0
eval_preds[:10]=['no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint', 'no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint']
dataset['train'][label_column][:10]=['no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint', 'no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint']

使用 PEFT 模型推理的示例

Accelerate 的大模型推理功能

中提供了一个示例~examples/causal_language_modeling/peft_lora_clm_accelerate_big_model_inference.ipynb

模型支持矩阵

因果语言建模

模型罗拉前缀调整P-调整提示调整
GPT-2

盛开

选择

GPT-Neo

GPT-J

GPT-NeoX-20B

骆驼

聊天GLM

条件生成

模型罗拉前缀调整P-调整提示调整
T5

捷运

序列分类

模型罗拉前缀调整P-调整提示调整
伯特

罗伯特

GPT-2

盛开

选择

GPT-Neo

GPT-J

德贝塔

德伯塔-v2

代币分类

模型罗拉前缀调整P-调整提示调整
伯特

罗伯特

GPT-2

盛开

选择

GPT-Neo

GPT-J

德贝塔

德伯塔-v2

文本到图像的生成

模型罗拉前缀调整P-调整提示调整
稳定扩散

图片分类

模型罗拉前缀调整P-调整提示调整
维特

斯温

图像到文本(多模态模型)

模型罗拉前缀调整P-调整提示调整
Blip-2

请注意,我们已经测试了用于ViT的 LoRA和用于微调图像分类的Swin 。但是,应该可以将 LoRA用于 由

变形金刚。查看相应的示例以了解更多信息。如果遇到问题,请打开一个问题。

同样的原则也适用于我们的细分模型。

语义分割

模型罗拉前缀调整P-调整提示调整
分段器

注意事项:

  1. 下面是使用 PyTorch FSDP 进行训练的示例。但是,它不会节省任何 GPU 内存。请参阅问题[FSDP] 在训练大多数参数冻结的模型时,具有 CPU 卸载功能的 FSDP 会消耗 1.65 倍以上的 GPU 内存。
from peft.utils.other import fsdp_auto_wrap_policy

...

if os.environ.get("ACCELERATE_USE_FSDP", None) is not None:
    accelerator.state.fsdp_plugin.auto_wrap_policy = fsdp_auto_wrap_policy(model)

model = accelerator.prepare(model)

mt0-xxl使用基本模型进行参数有效调整的示例

中提供了加速~examples/conditional_generation/peft_lora_seq2seq_accelerate_fsdp.py。A。首先,运行accelerate config --config_file fsdp_config.yaml并回答问卷。下面是配置文件的内容。

command_file: null
commands: null
compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: FSDP
downcast_bf16: 'no'
dynamo_backend: 'NO'
fsdp_config:
  fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
  fsdp_backward_prefetch_policy: BACKWARD_PRE
  fsdp_offload_params: true
  fsdp_sharding_strategy: 1
  fsdp_state_dict_type: FULL_STATE_DICT
  fsdp_transformer_layer_cls_to_wrap: T5Block
gpu_ids: null
machine_rank: 0
main_process_ip: null
main_process_port: null
main_training_function: main
megatron_lm_config: {}
mixed_precision: 'no'
num_machines: 1
num_processes: 2
rdzv_backend: static
same_network: true
tpu_name: null
tpu_zone: null
use_cpu: false

b. 运行以下命令以启动示例脚本

accelerate launch --config_file fsdp_config.yaml examples/peft_lora_seq2seq_accelerate_fsdp.py
  1. 在使用P_TUNINGPROMPT_TUNING与任务一起使用时,请记住在评估期间从模型输出的左侧SEQ_2_SEQ删除虚拟提示预测。num_virtual_token

  2. 对于编码器-解码器模型,P_TUNINGPROMPT_TUNING不支持generate转换器的功能,因为generate严格要求decoder_input_idsP_TUNING/PROMPT_TUNING附加软提示嵌入input_embeds以创建新的input_embeds给模型。因此,generate目前还不支持这个。

  3. 当使用 zero3_init_flag=True 的 ZeRO3 时,如果您发现 gpu 内存随着训练步骤而增加。我们可能需要在deepspeed commit 42858a9891422abc之后更新 deepspeed 。相关问题是[BUG] Peft Training with Zero.Init() and Zero3 will increase GPU memory every forward step

积压:

  • 添加测试
  • 多适配器训练和推理支持
  • 添加更多用例和示例
  • 探索并可能整合Bottleneck Adapters(IA)^3AdaptionPrompt...

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

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

相关文章

记录--Vue3 封装 ECharts 通用组件

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 按需导入的配置文件 配置文件这里就不再赘述&#xff0c;内容都是一样的&#xff0c;主打一个随用随取&#xff0c;按需导入。 import * as echarts from "echarts/core"; // 引入用到的图表…

ctfshow web入门 php特性 web93-97

1.web93 intval($num,0),0代表根据变量类型进行使用哪一种进制进行取整 可以使用8进制&#xff0c;正负数&#xff0c;小数点 payload: 010574 4476.0 4476.0 2.web94 过滤了0&#xff0c;不能使用8进制了&#xff0c;还可以使用小数点&#xff0c;正负数等 payload&#xff1…

【Java算法题】剑指offer_算法之02动态规划

对于动态规划问题&#xff0c;我将拆解为如下五步曲&#xff0c;这五步都搞清楚了&#xff0c;才能说把动态规划真的掌握了&#xff01; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 JZ42 连续子数组的…

CTFshow-pwn入门-栈溢出pwn35-pwn36

pwn35 首先还是先下载pwn文件拖进虚拟机加上可执行权限&#xff0c;使用checksec命令查看文件的信息。 chmod x pwn checksec pwn32位的我们直接拖进ida中反编译&#xff1a; // main int __cdecl main(int argc, const char **argv, const char **envp) {FILE *stream; // […

阿里云 OSS介绍

1、什么是阿里云 OSS&#xff1f; OSS 为 Object Storage Service&#xff0c;即对象存储服务。是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 OSS 具有与平台无关的 RESTful API 接口&#xff0c;可以在任意应用、任意时间、任意地点 存储与访问 任何类型的数据。…

软考:软件工程:软件可行性分析,需求分析,ER实体图,数据流图,状态转换图,数据字典

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

微信小程序——分页组件的创建与使用

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

使用Aspose.Words将word转PDF并且去水印。

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;Java、工具类、转换、word转pdf、Aspose.Words、后端☀️每日 一言&#xff1a;只要思想不滑坡&#xff0c;办法总比困难多。 前言 在我们日常开发中经常会有将word文档转为PDF的场景&#xff0…

深入理解循环队列----循环数组实现ArrayDeque

我们知道队列这种数据结构的物理实现方式主要还是两种&#xff0c;一种是链队列&#xff08;自定义节点类&#xff09;&#xff0c;另一种则是使用数组实现&#xff0c;两者各有优势。此处我们将要介绍的循环队列其实是队列的一种具体实现&#xff0c;由于一般的数组实现的队列…

IP地址分类

IP地址是TCP/IP协议中非常关键的要素之一&#xff0c;它用于标识网络中的设备和主机。根据使用版本的不同&#xff0c;IP地址分为IPv4和IPv6两种类型。 IPv4&#xff08;Internet Protocol version 4&#xff09;是IP地址的第四个版本&#xff0c;采用32位二进制数来表示IP地址…

JavaWeb之EL表达式和JSTL标签库

文章目录 EL表达式基本介绍EL表达式搜索域数据的顺序EL表达式输出Bean的普通属性&#xff0c;数组属性&#xff0c;List集合属性&#xff0c;Map集合属性EL表达式 - 运算关系运算逻辑运算算数运算empty运算三元运算. 点运算 和 [] 中括号运算符 EL表达式的11个隐含对象EL获取四…

Java中Thread 类的五种基本用法(简介)

目录 一.线程创建 Lambda创建一个线程 基础格式 举例 运行结果 二.线程中断 第一种:设置变量方法 举例 运行结果 第二种:interrupted&#xff08;&#xff09;方法 举例 运行结果 三.线程等待 举例 运行结果 四.线程休眠 举例 五.获取线程实例 举例 运行结果 …

如何用梯度下降法求解数学建模的拟合问题——以logistics增长问题为例

引言 众所周知的是&#xff0c;在大学课程中一般只会教授一种拟合方法(也即参数估计方法)——最小二乘法。这是一种直接求解的方法&#xff0c;非常的有效&#xff0c;不仅是损失最小解&#xff0c;而且是最大似然解。只不过&#xff0c;有一个缺点&#xff0c;它只能解决线性…

Jenkins配置仅合并代码后触发流水线

使用GitLabJenkins集成&#xff0c; 使用Jenkins的Generic WebHook插件&#xff1b;此插件可以作为各个工具间集成使用的通用方式&#xff0c;但是遇到些场景需要写些代码。关于 “合并代码后触发Pipeline”的配置方式&#xff0c; 其实思路简单&#xff0c;实现和让我描述起来…

电脑怎样连接打印机?分享4个简单操作!

为了更方便学习&#xff0c;我买了一个打印机来打印需要用的资料&#xff0c;但是操作了半天还是没连接上&#xff0c;想请问一下有经验的朋友是怎么将打印机与电脑进行连接的呢&#xff1f; 在现代人的工作和生活中&#xff0c;打印机是一个重要的设备。我们可以利用打印机进行…

一文搞懂String、StringBuffer、StringBuilder三者的对比以及扩容机制

String:不可变的字符序列&#xff1b;底层使用char[]存储StringBuffer:可变的字符序列&#xff1b;线程安全的&#xff0c;效率低&#xff1b;底层使用char[]存储StringBuilder:可变的字符序列&#xff1b;jdk5.0新增的&#xff0c;线程不安全的&#xff0c;效率高&#xff1b;…

行为型设计模式09-中介者模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 中介者模式 1、中介者模式介绍 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为设计模…

【MySQL数据库】MySQL 高级SQL 语句一

[TOC](MySQL 高级SQL 语句 一、MySQL 高级SQL 语句1.1select -显示表格中一个或数个字段的所有数据记录1.2distinct不显示重复的数据记录1.3where有条件查询1.4and、or且 或1.5in 显示已知的值的数据记录1.6between 显示两个值范围内的数据记录1.7通配符&#xff0c;通常通配符…

都2023年了,JavaScript ES6后的新(lao)特性,你用起来了吗?

前言 JavaScript ES6 指的是 ECMAScript 6&#xff0c;它是 JavaScript 语言第六版的规范。ES6 包含了很多新特性和语法糖&#xff0c;涵盖了从 ES6 开始至今所增加的所有特性。 因此&#xff0c;ES6 新特性是指从 ES6 开始新增到当前时刻所有的新特性&#xff0c;包括但不限…

FPGA XDMA 中断模式实现 PCIE X8 HDMI视频采集 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案视频采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串…