当前位置:   article > 正文

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

python 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中提供
  1. export MODEL_NAME= "CompVis/stable-diffusion-v1-4" #"stabilityai/stable-diffusion-2-1"
  2. export INSTANCE_DIR="path-to-instance-images"
  3. export CLASS_DIR="path-to-class-images"
  4. export OUTPUT_DIR="path-to-save-model"
  5. accelerate launch train_dreambooth.py \
  6. --pretrained_model_name_or_path=$MODEL_NAME \
  7. --instance_data_dir=$INSTANCE_DIR \
  8. --class_data_dir=$CLASS_DIR \
  9. --output_dir=$OUTPUT_DIR \
  10. --train_text_encoder \
  11. --with_prior_preservation --prior_loss_weight=1.0 \
  12. --instance_prompt="a photo of sks dog" \
  13. --class_prompt="a photo of dog" \
  14. --resolution=512 \
  15. --train_batch_size=1 \
  16. --lr_scheduler="constant" \
  17. --lr_warmup_steps=0 \
  18. --num_class_images=200 \
  19. --use_lora \
  20. --lora_r 16 \
  21. --lora_alpha 27 \
  22. --lora_text_encoder_r 16 \
  23. --lora_text_encoder_alpha 17 \
  24. --learning_rate=1e-4 \
  25. --gradient_accumulation_steps=1 \
  26. --gradient_checkpointing \
  27. --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中打开

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

地址02https://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
  1. compute_environment: LOCAL_MACHINE
  2. deepspeed_config:
  3. gradient_accumulation_steps: 1
  4. gradient_clipping: 1.0
  5. offload_optimizer_device: cpu
  6. offload_param_device: cpu
  7. zero3_init_flag: true
  8. zero3_save_16bit_model: true
  9. zero_stage: 3
  10. distributed_type: DEEPSPEED
  11. downcast_bf16: 'no'
  12. dynamo_backend: 'NO'
  13. fsdp_config: {}
  14. machine_rank: 0
  15. main_training_function: main
  16. megatron_lm_config: {}
  17. mixed_precision: 'no'
  18. num_machines: 1
  19. num_processes: 1
  20. rdzv_backend: static
  21. same_network: true
  22. use_cpu: false

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

第3步,输出日志如下:
  1. GPU Memory before entering the train : 1916
  2. GPU Memory consumed at the end of the train (end-begin): 66
  3. GPU Peak Memory consumed during the train (max-begin): 7488
  4. GPU Total Peak Memory consumed during the train (max): 9404
  5. CPU Memory before entering the train : 19411
  6. CPU Memory consumed at the end of the train (end-begin): 0
  7. CPU Peak Memory consumed during the train (max-begin): 0
  8. CPU Total Peak Memory consumed during the train (max): 19411
  9. epoch=4: train_ppl=tensor(1.0705, device='cuda:0') train_epoch_loss=tensor(0.0681, device='cuda:0')
  10. 100%|████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:27<00:00, 3.92s/it]
  11. GPU Memory before entering the eval : 1982
  12. GPU Memory consumed at the end of the eval (end-begin): -66
  13. GPU Peak Memory consumed during the eval (max-begin): 672
  14. GPU Total Peak Memory consumed during the eval (max): 2654
  15. CPU Memory before entering the eval : 19411
  16. CPU Memory consumed at the end of the eval (end-begin): 0
  17. CPU Peak Memory consumed during the eval (max-begin): 0
  18. CPU Total Peak Memory consumed during the eval (max): 19411
  19. accuracy=100.0
  20. eval_preds[:10]=['no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint', 'no complaint', 'no complaint', 'complaint', 'complaint', 'no complaint']
  21. 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内存。

  1. from peft.utils.other import fsdp_auto_wrap_policy
  2. ...
  3. if os.environ.get("ACCELERATE_USE_FSDP", None) is not None:
  4. accelerator.state.fsdp_plugin.auto_wrap_policy = fsdp_auto_wrap_policy(model)
  5. model = accelerator.prepare(model)


使用mt0-xxl基础模型和��� Accelerate进行参数高效调整的示例在~examples/conditional_generation/peft_lora_seq2seq_accelerate_fsdp.py中提供。

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

  1. command_file: null
  2. commands: null
  3. compute_environment: LOCAL_MACHINE
  4. deepspeed_config: {}
  5. distributed_type: FSDP
  6. downcast_bf16: 'no'
  7. dynamo_backend: 'NO'
  8. fsdp_config:
  9. fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
  10. fsdp_backward_prefetch_policy: BACKWARD_PRE
  11. fsdp_offload_params: true
  12. fsdp_sharding_strategy: 1
  13. fsdp_state_dict_type: FULL_STATE_DICT
  14. fsdp_transformer_layer_cls_to_wrap: T5Block
  15. gpu_ids: null
  16. machine_rank: 0
  17. main_process_ip: null
  18. main_process_port: null
  19. main_training_function: main
  20. megatron_lm_config: {}
  21. mixed_precision: 'no'
  22. num_machines: 1
  23. num_processes: 2
  24. rdzv_backend: static
  25. same_network: true
  26. tpu_name: null
  27. tpu_zone: null
  28. 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)语言模型,并输出一些有关该模型的信息

  1. from transformers import AutoModelForSeq2SeqLM
  2. from peft import get_peft_config, get_peft_model, LoraConfig, TaskType
  3. model_name_or_path = "bigscience/mt0-large"
  4. tokenizer_name_or_path = "bigscience/mt0-large"
  5. peft_config = LoraConfig(
  6. task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
  7. )
  8. model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
  9. model = get_peft_model(model, peft_config)
  10. model.print_trainable_parameters()
  11. # output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282

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

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

  1. import torch
  2. from peft import inject_adapter_in_model, LoraConfig
  3. class DummyModel(torch.nn.Module):
  4. def __init__(self):
  5. super().__init__()
  6. self.embedding = torch.nn.Embedding(10, 10)
  7. self.linear = torch.nn.Linear(10, 10)
  8. self.lm_head = torch.nn.Linear(10, 10)
  9. def forward(self, input_ids):
  10. x = self.embedding(input_ids)
  11. x = self.linear(x)
  12. x = self.lm_head(x)
  13. return x
  14. lora_config = LoraConfig(
  15. lora_alpha=16,
  16. lora_dropout=0.1,
  17. r=64,
  18. bias="none",
  19. target_modules=["linear"],
  20. )
  21. model = DummyModel()
  22. model = inject_adapter_in_model(lora_config, model)
  23. dummy_inputs = torch.LongTensor([[0, 1, 2, 3, 4, 5, 6, 7]])
  24. dummy_outputs = model(dummy_inputs)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/102683
推荐阅读
相关标签
  

闽ICP备14008679号