PEFT documentation

PEFT 配置和模型

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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 文件。

LoraConfig
PromptEncoderConfig
{
  "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_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 方法。
Update on GitHub