赞
踩
Py之peft:peft(一款最先进的参数高效微调方法库)的简介、安装、使用方法之详细攻略
目录
(1)、通过使用消费者硬件使LLM适应下游任务,获得与全参调优相当的性能;
(2.1)、使用LoRA进行参数高效的dreambooth训练的示例在examples/lora_dreambooth/train_dreambooth.py中提供
(2.2)、尝试使用Gradio Space,它应该可以在T4实例上无缝运行:smangrul/peft-lora-sd-dreambooth
(2.3)、新功能:多适配器支持以及将多个LoRA适配器组合成加权组合
(3)、参数高效调整LLM(大型语言模型)以用于RLHF(强化学习超参数自动优化)组件,例如Ranker和Policy
(4)、在Colab中使用PEFT LoRA和bits_and_bytes进行大型模型的INT8训练
(1)、使用Accelerate的DeepSpeed集成进行PEFT模型训练的示例
第1步,首先执行命令,以启动配置,发送邮件并回答问卷。下面是配置文件的内容。
(2)、PEFT模型推理示例,使用Accelerate的大型模型推理功能
(1)、以下是使用PyTorch FSDP进行训练的示例。但是,它不会导致GPU内存的任何节省。请参考问题报告[FSDP]
首先,运行accelerate config --config_file fsdp_config.yaml并回答问卷调查。以下是配置文件的内容。
(1)、使用Transformers库和PEFT库加载一个预训练的序列到序列(seq2seq)语言模型,并输出一些有关该模型的信息
参数有效微调(PEFT)方法使预训练语言模型(PLMs)能够有效地适应各种下游应用,而无需微调模型的所有参数。对大规模plm进行微调的成本往往高得令人望而却步。在这方面,PEFT方法只微调了少量(额外的)模型参数,从而大大降低了计算和存储成本。最近最先进的PEFT技术实现了与完全微调相当的性能。与Accelerate无缝集成,加速大规模模型利用DeepSpeed和大模型推理。
GitHub地址:https://github.com/huggingface/peft
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产品 |
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
GPT-2 | ✅ | ✅ | ✅ | ✅ | ✅ |
Bloom | ✅ | ✅ | ✅ | ✅ | ✅ |
OPT | ✅ | ✅ | ✅ | ✅ | ✅ |
GPT-Neo | ✅ | ✅ | ✅ | ✅ | ✅ |
GPT-J | ✅ | ✅ | ✅ | ✅ | ✅ |
GPT-NeoX-20B | ✅ | ✅ | ✅ | ✅ | ✅ |
LLaMA | ✅ | ✅ | ✅ | ✅ | ✅ |
ChatGLM | ✅ | ✅ | ✅ | ✅ | ✅ |
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
T5 | ✅ | ✅ | ✅ | ✅ | ✅ |
BART | ✅ | ✅ | ✅ | ✅ | ✅ |
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
BERT | ✅ | ✅ | ✅ | ✅ | ✅ |
RoBERTa | ✅ | ✅ | ✅ | ✅ | ✅ |
GPT-2 | ✅ | ✅ | ✅ | ✅ | |
Bloom | ✅ | ✅ | ✅ | ✅ | |
OPT | ✅ | ✅ | ✅ | ✅ | |
GPT-Neo | ✅ | ✅ | ✅ | ✅ | |
GPT-J | ✅ | ✅ | ✅ | ✅ | |
Deberta | ✅ | ✅ | ✅ | ||
Deberta-v2 | ✅ | ✅ | ✅ |
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
BERT | ✅ | ✅ | |||
RoBERTa | ✅ | ✅ | |||
GPT-2 | ✅ | ✅ | |||
Bloom | ✅ | ✅ | |||
OPT | ✅ | ✅ | |||
GPT-Neo | ✅ | ✅ | |||
GPT-J | ✅ | ✅ | |||
Deberta | ✅ | ||||
Deberta-v2 | ✅ |
Model | LoRA | LoHa | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|---|
Stable Diffusion | ✅ | ✅ |
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
ViT | ✅ | ||||
Swin | ✅ |
请注意,我们已经测试了ViT和Swin的LoRA用于图像分类的微调。但是,理论上可以在 Transformers提供的任何兼容模型上使用LoRA。请查看相应的示例以了解更多信息。如果遇到问题,请提交问题报告。
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
Blip-2 | ✅ |
Model | LoRA | Prefix Tuning | P-Tuning | Prompt Tuning | IA3 |
---|---|---|---|---|---|
SegFormer | ✅ |
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
训练过程中不同设置所需的GPU内存如下所示。最终检查点大小为8.8 MB
模型、全微调、PEFT-LoRA、带有梯度检查点的PEFT-LoRA
硬件:单个A100 80GB GPU,CPU内存大于64GB
- 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
>>以下是trl库中使用PEFT+INT8调整策略模型的示例:gpt2-sentiment_peft.py以及相应的博客
>>使用PEFT进行指令微调、奖励模型和策略的示例:stack_llama以及相应的博客
现在我们有一个演示,展示如何在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
通过避免在每个下游任务/数据集上进行完全微调来节省存储空间。使用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中。
PEFT模型可以直接与Accelerate一起使用。在训练期间,可以使用Accelerate在各种硬件上进行分布式训练,例如GPU、Apple Silicon设备等。在消费级硬件上进行推断时,也可以使用Accelerate。
需要DeepSpeed版本v0.8.0。示例代码位于~examples/conditional_generation/peft_lora_seq2seq_accelerate_ds_zero3_offload.py中。
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
accelerate launch --config_file ds_zero3_cpu.yaml examples/peft_lora_seq2seq_accelerate_ds_zero3_offload.py
- 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']
示例位于~examples/causal_language_modeling/peft_lora_clm_accelerate_big_model_inference.ipynb中。
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中提供。
- 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
accelerate launch --config_file fsdp_config.yaml examples/peft_lora_seq2seq_accelerate_fsdp.py
当使用ZeRO3并将zero3_init_flag设置为True时,如果您发现GPU内存随着训练步骤的增加而增加,可能需要在深度学习框架DeepSpeed提交版本42858a9891422abc之后进行更新。相关的问题链接是[BUG] 使用Zero.Init()和ZeRO3进行Peft训练,会在每次前向步骤时增加GPU内存。
pip install peft
- 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
使用inject_adapter_in_model方法在任何torch模型上注入可训练的适配器。请注意,该方法不会对模型进行更改。
-
- import torch
- from peft import inject_adapter_in_model, LoraConfig
-
- class 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 x
-
- lora_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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。