PEFT documentation
PEFT 配置和模型
PEFT 配置和模型
当今大型预训练模型的规模极其庞大——通常拥有数十亿个参数——这带来了严峻的训练挑战,因为训练这些模型需要更多的存储空间和更强的算力来处理海量计算。要训练这些大型预训练模型,你需要访问强大的 GPU 或 TPU,而这不仅成本高昂、并非人人可及,而且对环境不友好,实用性也有限。PEFT 方法解决了其中许多挑战。PEFT 方法有多种类型(如软提示、矩阵分解、适配器),但它们都聚焦于同一目标:减少可训练参数的数量。这使得在消费级硬件上训练和存储大型模型变得更加可行。
PEFT 库旨在帮助你在免费或低成本的 GPU 上快速训练大模型。在本教程中,你将学习如何配置一个设置,以便将 PEFT 方法应用于预训练的基础模型进行训练。一旦完成 PEFT 配置,你就可以使用任何你喜欢的训练框架(例如 Transformers 的 Trainer 类、Accelerate,或自定义的 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
){
"base_model_name_or_path": "roberta-large", #base model to apply p-tuning to
"encoder_dropout": 0.0,
"encoder_hidden_size": 128,
"encoder_num_layers": 2,
"encoder_reparameterization_type": "MLP",
"inference_mode": true,
"num_attention_heads": 16,
"num_layers": 24,
"num_transformer_submodules": 1,
"num_virtual_tokens": 20,
"peft_type": "P_TUNING", #PEFT method type
"task_type": "SEQ_CLS", #type of task to train model on
"token_dim": 1024
}您可以通过初始化 PromptEncoderConfig 来创建用于训练的自定义配置。
from peft import PromptEncoderConfig, TaskType
p_tuning_config = PromptEncoderConfig(
encoder_reparameterization_type="MLP",
encoder_hidden_size=128,
num_attention_heads=16,
num_layers=24,
num_transformer_submodules=1,
num_virtual_tokens=20,
token_dim=1024,
task_type=TaskType.SEQ_CLS
)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_healthcheck()调用 get_peft_model() 时,基础模型会被 就地 修改。这意味着,如果对一个之前已经以相同方式修改过的模型再次调用 get_peft_model(),该模型会被进一步变更。因此,如果您希望在之前调用过
get_peft_model()之后修改 PEFT 配置,需要先使用 unload() 卸载模型,然后再使用新配置调用get_peft_model()。或者,您可以重新初始化模型,以确保在应用新的 PEFT 配置之前模型处于全新的、未修改的状态。
现在,您可以使用首选的训练框架来训练 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)
PeftModel.from_pretrained() 方法是加载 PeftModel 最灵活的方式,因为它不关心所使用的模型框架(Transformers、timm 或通用的 PyTorch 模型)。其他类,例如 AutoPeftModel,只是对基础 PeftModel 的便捷封装,使得直接从 Hub 或本地加载存储有 PEFT 权重的模型变得更加简单。
from peft import AutoPeftModelForCausalLM
lora_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")请查看 AutoPeftModel API 参考,以了解有关 AutoPeftModel 类的更多信息。
后续步骤
使用合适的 PeftConfig,你可以将其应用于任何预训练模型以创建 PeftModel,从而在免费可用的 GPU 上更快地训练大型高性能模型!要了解有关 PEFT 配置和模型的更多信息,以下指南可能会有所帮助:
- 在使用自定义模型指南中,了解如何为并非来自 Transformers 的模型配置 PEFT 方法。