LLM、AIGC、RAG 开发交流裙:377891973
文章目录
- 一、关于 PEFT
- 二、安装
- 1、使用 PyPI 安装
- 2、使用源码安装
- 三、快速开始
- 1、训练
- 2、保存模型
- 3、推理
- 4、后续步骤
本文翻译整理自:https://huggingface.co/docs/peft/index
一、关于 PEFT
🤗PEFT(Parameter-Efficient Fine-Tuning 参数高效微调)是一个库,用于有效地将大型预训练模型适应各种目标端应用,而无需微调模型的所有参数,因为它成本过高。
PEFT方法仅微调少量(额外)模型参数——显着降低计算和存储成本——同时产生与完全微调模型相当的性能。
这使得在消费硬件上训练和存储大型语言模型(LLM)更容易。
PEFT与Transformer、扩散器和加速库集成,提供了一种更快、更简单的方法来加载、训练和使用大型模型进行推理。
二、安装
PEFT 在 Python3.8+ 上经过测试。
🤗PEFT可从PyPI和GitHub上获得:
1、使用 PyPI 安装
要从PyPI安装🤗PEFT:
pip install peft
2、使用源码安装
每天都会添加尚未发布的新功能,这也意味着可能存在一些错误。
要试用它们,请从GitHub存储库安装:
pip install git+https://github.com/huggingface/peft
如果您正在努力为库做出贡献,或者希望使用源码并观看直播 结果当您运行代码时,可以从本地克隆的版本安装可编辑的版本 存储库:
git clone https://github.com/huggingface/peft
cd peft
pip install -e .
三、快速开始
https://huggingface.co/docs/peft/quicktour
PEFT提供了参数有效的方法 来微调大型预训练模型。
传统的范式是为每个下游任务微调模型的所有参数,但是由于当今模型中的参数数量巨大,这变得非常昂贵和不切实际。
相反,训练更少数量的提示参数 或 使用低秩自适应(LoRA)等重新参数化方法 来减少可训练参数的数量会更有效。
本快速导览将向您展示PEFT的主要功能,以及如何在消费设备上通常无法访问的大型模型上训练或运行推理。
1、训练
每个PEFT方法都由一个PeftConfig类定义,该类存储了构建PeftModel的所有重要参数。
例如,要使用LoRA进行训练,请加载并创建一个LoraConfig类并指定以下参数:
task_type
:要训练的任务(在这种情况下sequence-to-sequence语言模型化)inference_mode
无论你是否使用模型进行推理r
:低秩矩阵的维度lora_alpha
:低秩矩阵的缩放因子lora_dropout
:LoRA层的暂退法概率
from peft import LoraConfig, TaskType
peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
请参阅LoraConfig参考,了解有关您可以调整的其他参数的更多详细信息,例如要定位的模块或偏置类型。
设置LoraConfig后,使用get_peft_model()函数创建一个PeftModel。
它需要一个基本模型 —— 您可以从Transformer库中加载,LoraConfig 包含 如何配置模型 以使用LoRA进行训练的参数。
加载要微调的基本模型。
from transformers import AutoModelForSeq2SeqLM
model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/mt0-large")
使用get_peft_model() 函数包装基本模型和 peft_config
以创建PeftModel。
要了解模型中可训练参数的数量,请使用print_trainable_parameters
方法。
from peft import get_peft_model
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
"output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"
在 bigscience/mt0-large’s 1.2B 参数中,您只训练了其中的 0.19%!
就是这样🎉!
现在你可以用 Transformer Trainer、Accelerate 或任何自定义PyTorch 训练循环来训练模型。
例如,要使用Trainer类进行训练,请使用一些训练超参数设置一个TrainingArguments类。
training_args = TrainingArguments(
output_dir="your-name/bigscience/mt0-large-lora",
learning_rate=1e-3,
per_device_train_batch_size=32,
per_device_eval_batch_size=32,
num_train_epochs=2,
weight_decay=0.01,
evaluation_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
)
将模型、训练参数、数据集、标记器和任何其他必要的组件 传递给Trainer,并调用 train 开始训练。
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"],
tokenizer=tokenizer,
data_collator=data_collator,
compute_metrics=compute_metrics,
)
trainer.train()
2、保存模型
模型完成训练后,可以使用save_pretrained函数将模型保存到目录中。
model.save_pretrained("output_dir")
您还可以使用push_to_hub函数将模型保存到 Hub (确保您已登录到您的拥抱脸帐户)。
from huggingface_hub import notebook_login
notebook_login()
model.push_to_hub("your-name/bigscience/mt0-large-lora")
这两种方法都只保存经过训练的额外PEFT权重,这意味着存储、传输和加载效率极高。
例如,这个用LoRA训练的facebook/opt-350m模型只包含两个文件:adapter_config.json
和adapter_model.safetensors
。
adapter_model.safetensors
文件只有6.3MB!
存储在 Hub 上的350m模型的适配器权重只有约6MB,而模型权重的完整大小可以约700MB。
3、推理
查看AutoPeftModelAPI参考以获取可用AutoPeftModel
类的完整列表。
使用AutoPeftModel类和from_pretrained方法轻松加载任何经过PEFT训练的推理模型:
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
model = model.to("cuda")
model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])
"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."
对于AutoPeftModelFor
类未明确支持的其他任务(例如自动语音识别),您仍然可以使用基础 AutoPeftModel类来加载任务的模型。
from peft import AutoPeftModel
model = AutoPeftModel.from_pretrained("smangrul/openai-whisper-large-v2-LORA-colab")
4、后续步骤
现在您已经了解了如何使用其中一种PEFT方法训练模型,我们鼓励您尝试一些其他方法,例如 prompt tuning。
这些步骤与快速导览中显示的步骤非常相似:
- 准备一个PeftConfig用于PEFT方法
- 使用get_peft_model()方法从配置和基本模型创建PeftModel
然后你可以随心所欲地训练它!要加载PEFT模型进行推理,可以使用AutoPeftModel类。
如果您有兴趣为特定任务(如语义分割、多语言自动语音识别、DreamBooth、代币分类等)使用另一种PEFT方法训练模型,请随意查看任务指南。
伊织 2024-07-05