PEFT 配置和模型
当今大型预训练模型(通常拥有数十亿个参数)的庞大规模带来了重大的训练挑战,因为它们需要更多的存储空间和更多的计算能力来处理所有这些计算。您需要访问功能强大的 GPU 或 TPU 来训练这些大型预训练模型,这很昂贵,并非每个人都能广泛访问,也不利于环境,而且也不太实用。PEFT 方法解决了其中许多挑战。有几种类型的 PEFT 方法(软提示、矩阵分解、适配器),但它们都专注于同一件事,即减少可训练参数的数量。这使得在消费级硬件上训练和存储大型模型变得更容易。
PEFT 库旨在帮助您在免费或低成本的 GPU 上快速训练大型模型,在本教程中,您将学习如何设置配置以将 PEFT 方法应用于预训练的基础模型进行训练。一旦 PEFT 配置设置完成,您可以使用任何您喜欢的训练框架(Transformer 的 Trainer 类,加速器,自定义 PyTorch 训练循环)。
PEFT 配置
了解有关您可以在每个 PEFT 方法的相应 API 参考页面中配置的参数的更多信息。
配置存储指定应如何应用特定 PEFT 方法的重要参数。
例如,查看以下应用 LoRA 的 LoraConfig
和应用 p-tuning 的 PromptEncoderConfig
(这些配置文件已进行 JSON 序列化)。每当您加载 PEFT 适配器时,最好检查它是否具有关联的 adapter_config.json 文件,该文件是必需的。
{
"base_model_name_or_path": "facebook/opt-350m", #base model to apply LoRA to
"bias": "none",
"fan_in_fan_out": false,
"inference_mode": true,
"init_lora_weights": true,
"layers_pattern": null,
"layers_to_transform": null,
"lora_alpha": 32,
"lora_dropout": 0.05,
"modules_to_save": null,
"peft_type": "LORA", #PEFT method type
"r": 16,
"revision": null,
"target_modules": [
"q_proj", #model modules to apply LoRA to (query and value projection layers)
"v_proj"
],
"task_type": "CAUSAL_LM" #type of task to train model on
}
您可以通过初始化 LoraConfig 来创建自己的训练配置。
from peft import LoraConfig, TaskType
lora_config = LoraConfig(
r=16,
target_modules=["q_proj", "v_proj"],
task_type=TaskType.CAUSAL_LM,
lora_alpha=32,
lora_dropout=0.05
)
PEFT 模型
有了 PEFT 配置,您现在可以将其应用于任何预训练模型以创建 PeftModel。从 Transformers 库中的任何最先进模型、自定义模型,甚至新的和不受支持的 Transformer 架构中进行选择。
在本教程中,加载一个基本的 facebook/opt-350m 模型进行微调。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
使用 get_peft_model() 函数从基本的 facebook/opt-350m 模型和您之前创建的 lora_config
创建 PeftModel。
from peft import get_peft_model
lora_model = get_peft_model(model, lora_config)
lora_model.print_trainable_parameters()
"trainable params: 1,572,864 || all params: 332,769,280 || trainable%: 0.472659014678278"
现在,您可以使用您首选的训练框架训练 PeftModel!训练后,您可以使用 save_pretrained() 在本地保存您的模型,或使用 push_to_hub 方法将其上传到 Hub。
# save locally
lora_model.save_pretrained("your-name/opt-350m-lora")
# push to Hub
lora_model.push_to_hub("your-name/opt-350m-lora")
要加载 PeftModel 以进行推理,您需要提供用于创建它的 PeftConfig 以及它从中训练的基模型。
from peft import PeftModel, PeftConfig
config = PeftConfig.from_pretrained("ybelkada/opt-350m-lora")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path)
lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora")
默认情况下,PeftModel 设置为推理,但如果您想进一步训练适配器,可以设置 is_trainable=True
。
lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora", is_trainable=True)
The PeftModel.from_pretrained() 方法是加载 PeftModel 的最灵活方式,因为它不依赖于所使用的模型框架(Transformers、timm、通用 PyTorch 模型)。其他类,如 AutoPeftModel,只是围绕基本 PeftModel 的便捷包装器,并且可以更轻松地从 Hub 或本地存储 PEFT 权重的本地加载 PEFT 模型。
from peft import AutoPeftModelForCausalLM
lora_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
查看 AutoPeftModel API 参考以了解有关 AutoPeftModel 类的更多信息。
后续步骤
使用合适的 PeftConfig,您可以将其应用于任何预训练模型以创建 PeftModel,并在免费提供的 GPU 上更快地训练大型强大的模型!要了解有关 PEFT 配置和模型的更多信息,以下指南可能会有所帮助
- 了解如何在 使用自定义模型 指南中为非 Transformers 模型配置 PEFT 方法。