Py之peft:peft(一款最先进的参数高效微调方法库)的简介、安装、使用方法之详细攻略

本文主要是介绍Py之peft:peft(一款最先进的参数高效微调方法库)的简介、安装、使用方法之详细攻略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Py之peft:peft(一款最先进的参数高效微调方法库)的简介、安装、使用方法之详细攻略

目录

peft的简介

1、支持多种微调方法

2、支持多种模型及其场景

(1)、因果语言建模

(2)、条件生成

(3)、序列分类

(4)、标记分类

(5)、文本到图像生成

(6)、图像分类

(7)、图像到文本(多模型)

(8)、语义分割

3、使用案例

(1)、通过使用消费者硬件使LLM适应下游任务,获得与全参调优相当的性能;

(2)、扩散模型的参数高效微调

(2.1)、使用LoRA进行参数高效的dreambooth训练的示例在examples/lora_dreambooth/train_dreambooth.py中提供

(2.2)、尝试使用Gradio Space,它应该可以在T4实例上无缝运行:smangrul/peft-lora-sd-dreambooth

(2.3)、新功能:多适配器支持以及将多个LoRA适配器组合成加权组合

(2.4)、新功能:使用LoHa适配器进行Stable Diffusion的Dreambooth训练,示例位于examples/stable_diffusion/train_dreambooth_loha.py中

(3)、参数高效调整LLM(大型语言模型)以用于RLHF(强化学习超参数自动优化)组件,例如Ranker和Policy

(4)、在Colab中使用PEFT LoRA和bits_and_bytes进行大型模型的INT8训练

(5)、为中小型模型节省计算和存储资源

4、PEFT+Accelerate(分布式训练)

(1)、使用Accelerate的DeepSpeed集成进行PEFT模型训练的示例

第1步,首先执行命令,以启动配置,发送邮件并回答问卷。下面是配置文件的内容。

第2步,运行以下命令来启动示例脚本:

第3步,输出日志如下:

(2)、PEFT模型推理示例,使用Accelerate的大型模型推理功能

5、注意事项

(1)、以下是使用PyTorch FSDP进行训练的示例。但是,它不会导致GPU内存的任何节省。请参考问题报告[FSDP]

首先,运行accelerate config --config_file fsdp_config.yaml并回答问卷调查。以下是配置文件的内容。

其次,运行以下命令启动示例脚本

(2)、Peft训练和GPU内存增加有关的问题

peft的安装

peft的使用方法

1、基础用法

(1)、使用Transformers库和PEFT库加载一个预训练的序列到序列(seq2seq)语言模型,并输出一些有关该模型的信息

(2)、PEFT作为实用程序库


peft的简介

参数有效微调(PEFT)方法使预训练语言模型(PLMs)能够有效地适应各种下游应用,而无需微调模型的所有参数。对大规模plm进行微调的成本往往高得令人望而却步。在这方面,PEFT方法只微调了少量(额外的)模型参数,从而大大降低了计算和存储成本。最近最先进的PEFT技术实现了与完全微调相当的性能。与Accelerate无缝集成,加速大规模模型利用DeepSpeed和大模型推理。

GitHub地址:https://github.com/huggingface/peft

1、支持多种微调方法

LoRA

LoRA: LORA: Low-Rank Adaptation Of Large Language Models

大型语言模型的低阶适应

Prefix Tuning

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提示调优可以与跨尺度和任务的普遍微调相媲美

P-Tuning

P-Tuning: GPT Understands, Too

Prompt Tuning

Prompt Tuning: The Power of Scale for Parameter-Efficient Prompt Tuning规模在参数高效提示调整中的作用

AdaLoRA

AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning参数有效微调的自适应预算分配

IA^3

IA^3: Few-Shot Parameter-Efficient Fine-Tuning is Better and Cheaper than In-Context Learning少量参数有效的微调比上下文学习更好,更便宜

MultiTask Prompt Tuning

MultiTask Prompt Tuning: Multitask Prompt Tuning Enables Parameter-Efficient Transfer Learning:多任务提示调谐使参数高效迁移学习

LoHa

LoHa: FedPara: Low-Rank Hadamard Product for Communication-Efficient Federated Learning用于通信高效联邦学习的低秩Hadamard产品

2、支持多种模型及其场景

(1)、因果语言建模

ModelLoRAPrefix TuningP-TuningPrompt TuningIA3
GPT-2
Bloom
OPT
GPT-Neo
GPT-J
GPT-NeoX-20B
LLaMA
ChatGLM

(2)、条件生成

ModelLoRAPrefix TuningP-TuningPrompt TuningIA3
T5
BART

(3)、序列分类

ModelLoRAPrefix TuningP-TuningPrompt TuningIA3
BERT
RoBERTa
GPT-2
Bloom
OPT
GPT-Neo
GPT-J
Deberta
Deberta-v2

(4)、标记分类

ModelLoRAPrefix TuningP-TuningPrompt TuningIA3
BERT
RoBERTa
GPT-2
Bloom
OPT
GPT-Neo
GPT-J
Deberta
Deberta-v2

(5)、文本到图像生成

ModelLoRALoHaPrefix TuningP-TuningPrompt TuningIA3
Stable Diffusion

(6)、图像分类

ModelLoRAPrefix TuningP-TuningPrompt TuningIA3
ViT
Swin

(7)、图像到文本(多模型)

请注意,我们已经测试了ViT和Swin的LoRA用于图像分类的微调。但是,理论上可以在 Transformers提供的任何兼容模型上使用LoRA。请查看相应的示例以了解更多信息。如果遇到问题,请提交问题报告。

ModelLoRAPrefix TuningP-TuningPrompt TuningIA3
Blip-2

(8)、语义分割

ModelLoRAPrefix TuningP-TuningPrompt TuningIA3
SegFormer

3、使用案例

(1)、通过使用消费者硬件使LLM适应下游任务,获得与全参调优相当的性能;

GPU内存在适应LLM(大型语言模型)在少样本数据集ought/raft/twitter_complaints上的情况下所需的情况。在这里,考虑的设置包括完全微调、使用纯PyTorch的PEFT-LoRA以及使用DeepSpeed进行CPU卸载的PEFT-LoRA。

硬件:单个A100 80GB GPU,CPU内存大于64GB;

PEFT-LoRA调整后的bigscience/T0_3B在ought/raft/twitter_complaints排行榜上的性能。值得注意的是,我们没有尝试通过调整输入指令模板、LoRA超参数和其他与训练相关的超参数来挤出性能。此外,我们没有使用更大的13B mt0-xxl模型。因此,我们已经看到了与参数高效调整相媲美的性能。此外,最终的额外检查点大小仅为19MB,而原始骨干模型bigscience/T0_3B的大小为11GB,但仍需要加载原始的全尺寸模型。

因此,我们可以看到,使用16GB和24GB GPU等消费级硬件,PEFT方法可以实现与SoTA(最新技术)相媲美的性能。一篇富有见地的博客文章解释了使用PEFT来微调FlanT5-XXL的优势:Efficient Large Language Model training with LoRA and Hugging Face

(2)、扩散模型的参数高效微调

训练过程中不同设置所需的GPU内存如下所示。最终检查点大小为8.8 MB

模型、全微调、PEFT-LoRA、带有梯度检查点的PEFT-LoRA

硬件:单个A100 80GB GPU,CPU内存大于64GB

(2.1)、使用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

(2.2)、尝试使用Gradio Space,它应该可以在T4实例上无缝运行:smangrul/peft-lora-sd-dreambooth

(2.3)、新功能:多适配器支持以及将多个LoRA适配器组合成加权组合

(2.4)、新功能:使用LoHa适配器进行Stable Diffusion的Dreambooth训练,示例位于examples/stable_diffusion/train_dreambooth_loha.py中

(3)、参数高效调整LLM(大型语言模型)以用于RLHF(强化学习超参数自动优化)组件,例如Ranker和Policy

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

(4)、在Colab中使用PEFT LoRA和bits_and_bytes进行大型模型的INT8训练

现在我们有一个演示,展示如何在Google Colab中对OPT-6.7b(fp16中的14GB)进行微调:在Colab中打开

地址:https://colab.research.google.com/drive/1jCkpikz0J2o20FBQmYmAGdiKmJGOMo-o?usp=sharing

现在我们有一个演示,展示如何在Google Colab中对whisper-large(1.5B参数)(fp16中的14GB)进行微调:在Colab中打开和在Colab中打开

地址01:https://colab.research.google.com/drive/1DOkD_5OUjFa0r5Ik3SgywJLJtEo2qLxO?usp=sharing

地址02:https://colab.research.google.com/drive/1vhF8yueFqha3Y3CpTHN6q9EVcII9EYzs?usp=sharing

(5)、为中小型模型节省计算和存储资源

通过避免在每个下游任务/数据集上进行完全微调来节省存储空间。使用PEFT方法,用户只需要存储大小在MB数量级的微小检查点,同时保持与完全微调相媲美的性能。

一个使用LoRA来适应FUNSD数据集上的LayoutLMForTokenClassification任务的示例在~examples/token_classification/PEFT_LoRA_LayoutLMForTokenClassification_on_FUNSD.py中提供。我们可以观察到,只有0.62%的参数是可训练的,我们实现了与完全微调(F1=0.786)相媲美的性能(F1=0.777)(无需运行更多性能提取的超参数调整),而此检查点仅为2.8MB。如果有N个这样的数据集,只需为每个数据集准备一个PEFT模型,就可以节省大量存储空间,而无需担心骨干/基础模型的灾难性遗忘或过拟合问题

另一个示例是使用不同PEFT方法微调MRPC GLUE数据集上的roberta-large。示例笔记本位于~examples/sequence_classification中。

4、PEFT+Accelerate(分布式训练)

PEFT模型可以直接与Accelerate一起使用。在训练期间,可以使用Accelerate在各种硬件上进行分布式训练,例如GPU、Apple Silicon设备等。在消费级硬件上进行推断时,也可以使用Accelerate。

(1)、使用Accelerate的DeepSpeed集成进行PEFT模型训练的示例

需要DeepSpeed版本v0.8.0。示例代码位于~examples/conditional_generation/peft_lora_seq2seq_accelerate_ds_zero3_offload.py中。

第1步,首先执行命令,以启动配置,发送邮件并回答问卷。下面是配置文件的内容。
accelerate config --config_file ds_zero3_cpu.yaml
compute_environment: LOCAL_MACHINE
deepspeed_config:gradient_accumulation_steps: 1gradient_clipping: 1.0offload_optimizer_device: cpuoffload_param_device: cpuzero3_init_flag: truezero3_save_16bit_model: truezero_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

第2步,运行以下命令来启动示例脚本:
accelerate launch --config_file ds_zero3_cpu.yaml examples/peft_lora_seq2seq_accelerate_ds_zero3_offload.py

第3步,输出日志如下:
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']

(2)、PEFT模型推理示例,使用Accelerate的大型模型推理功能

示例位于~examples/causal_language_modeling/peft_lora_clm_accelerate_big_model_inference.ipynb中。

5、注意事项

(1)、以下是使用PyTorch FSDP进行训练的示例。但是,它不会导致GPU内存的任何节省。请参考问题报告[FSDP]

FSDP与CPU卸载一起在训练大多数冻结参数的模型时消耗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基础模型和��� Accelerate进行参数高效调整的示例在~examples/conditional_generation/peft_lora_seq2seq_accelerate_fsdp.py中提供。

首先,运行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_WRAPfsdp_backward_prefetch_policy: BACKWARD_PREfsdp_offload_params: truefsdp_sharding_strategy: 1fsdp_state_dict_type: FULL_STATE_DICTfsdp_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

其次,运行以下命令启动示例脚本
accelerate launch --config_file fsdp_config.yaml examples/peft_lora_seq2seq_accelerate_fsdp.py

(2)、Peft训练和GPU内存增加有关的问题

当使用ZeRO3并将zero3_init_flag设置为True时,如果您发现GPU内存随着训练步骤的增加而增加,可能需要在深度学习框架DeepSpeed提交版本42858a9891422abc之后进行更新。相关的问题链接是[BUG] 使用Zero.Init()和ZeRO3进行Peft训练,会在每次前向步骤时增加GPU内存。

peft的安装

pip install peft

peft的使用方法

1、基础用法

(1)、使用Transformers库和PEFT库加载一个预训练的序列到序列(seq2seq)语言模型,并输出一些有关该模型的信息

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

(2)、PEFT作为实用程序库

使用inject_adapter_in_model方法在任何torch模型上注入可训练的适配器。请注意,该方法不会对模型进行更改。


import torch 
from peft import inject_adapter_in_model, LoraConfigclass DummyModel(torch.nn.Module):def __init__(self):super().__init__()self.embedding = torch.nn.Embedding(10, 10)self.linear = torch.nn.Linear(10, 10)self.lm_head = torch.nn.Linear(10, 10)def forward(self, input_ids):x = self.embedding(input_ids)x = self.linear(x)x = self.lm_head(x)return xlora_config = LoraConfig(lora_alpha=16,lora_dropout=0.1,r=64,bias="none",target_modules=["linear"],
)model = DummyModel()
model = inject_adapter_in_model(lora_config, model)dummy_inputs = torch.LongTensor([[0, 1, 2, 3, 4, 5, 6, 7]])
dummy_outputs = model(dummy_inputs)

这篇关于Py之peft:peft(一款最先进的参数高效微调方法库)的简介、安装、使用方法之详细攻略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/539398

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Centos7安装Mongodb4

1、下载源码包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz 2、解压 放到 /usr/local/ 目录下 tar -zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgzmv mongodb-linux-x86_64-rhel70-4.2.1/

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传