本文主要是介绍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)、因果语言建模
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
GPT-2 | ✅ | ✅ | ✅ | ✅ | ✅ |
Bloom | ✅ | ✅ | ✅ | ✅ | ✅ |
OPT | ✅ | ✅ | ✅ | ✅ | ✅ |
GPT-Neo | ✅ | ✅ | ✅ | ✅ | ✅ |
GPT-J | ✅ | ✅ | ✅ | ✅ | ✅ |
GPT-NeoX-20B | ✅ | ✅ | ✅ | ✅ | ✅ |
LLaMA | ✅ | ✅ | ✅ | ✅ | ✅ |
ChatGLM | ✅ | ✅ | ✅ | ✅ | ✅ |
(2)、条件生成
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
T5 | ✅ | ✅ | ✅ | ✅ | ✅ |
BART | ✅ | ✅ | ✅ | ✅ | ✅ |
(3)、序列分类
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
BERT | ✅ | ✅ | ✅ | ✅ | ✅ |
RoBERTa | ✅ | ✅ | ✅ | ✅ | ✅ |
GPT-2 | ✅ | ✅ | ✅ | ✅ | |
Bloom | ✅ | ✅ | ✅ | ✅ | |
OPT | ✅ | ✅ | ✅ | ✅ | |
GPT-Neo | ✅ | ✅ | ✅ | ✅ | |
GPT-J | ✅ | ✅ | ✅ | ✅ | |
Deberta | ✅ | ✅ | ✅ | ||
Deberta-v2 | ✅ | ✅ | ✅ |
(4)、标记分类
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
BERT | ✅ | ✅ | |||
RoBERTa | ✅ | ✅ | |||
GPT-2 | ✅ | ✅ | |||
Bloom | ✅ | ✅ | |||
OPT | ✅ | ✅ | |||
GPT-Neo | ✅ | ✅ | |||
GPT-J | ✅ | ✅ | |||
Deberta | ✅ | ||||
Deberta-v2 | ✅ |
(5)、文本到图像生成
Model | LoRA | LoHa | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|---|
Stable Diffusion | ✅ | ✅ |
(6)、图像分类
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
ViT | ✅ | ||||
Swin | ✅ |
(7)、图像到文本(多模型)
请注意,我们已经测试了ViT和Swin的LoRA用于图像分类的微调。但是,理论上可以在 Transformers提供的任何兼容模型上使用LoRA。请查看相应的示例以了解更多信息。如果遇到问题,请提交问题报告。
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
Blip-2 | ✅ |
(8)、语义分割
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
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(一款最先进的参数高效微调方法库)的简介、安装、使用方法之详细攻略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!