PEFT 文档

PEFT 配置和模型

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

PEFT 配置和模型

当今的大型预训练模型通常拥有数十亿个参数,其庞大的规模给训练带来了巨大的挑战,因为它们需要更多的存储空间和更强大的计算能力来处理所有这些计算。您需要使用昂贵的、并非人人都能获得的、不环保且不切实际的强大 GPU 或 TPU 来训练这些大型预训练模型。PEFT 方法解决了其中的许多挑战。PEFT 方法有多种类型(软提示、矩阵分解、适配器),但它们的重点都是相同的:减少可训练参数的数量。这使得在消费级硬件上训练和存储大型模型变得更加容易。

PEFT 库旨在帮助您在免费或低成本的 GPU 上快速训练大型模型。在本教程中,您将学习如何设置配置,以将 PEFT 方法应用于预训练的基础模型进行训练。一旦 PEFT 配置设置完成,您可以使用任何您喜欢的训练框架(Transformer 的 Trainer 类、Accelerate 或自定义的 PyTorch 训练循环)。

PEFT 配置

在它们各自的 API 参考页面中了解更多关于您可以为每种 PEFT 方法配置的参数。

配置存储了指定如何应用特定 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_trainable_parameters()
"trainable params: 1,572,864 || all params: 332,769,280 || trainable%: 0.472659014678278"

当调用 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 权重的本地加载 PEFT 模型变得更容易。

from peft import AutoPeftModelForCausalLM

lora_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")

查看 AutoPeftModel API 参考以了解更多关于 AutoPeftModel 类的信息。

后续步骤

有了合适的 PeftConfig,您可以将其应用于任何预训练模型来创建一个 PeftModel,并在免费的 GPU 上更快地训练大型强大的模型!要了解更多关于 PEFT 配置和模型的信息,以下指南可能会有所帮助:

< > 在 GitHub 上更新