Transformers 文档

PEFT

Hugging Face's logo
加入 Hugging Face 社区

并获取增强的文档体验

开始使用

PEFT

PEFT 是一个参数高效微调方法库,可以在消费级 GPU 上训练和存储大型模型。这些方法仅在预训练模型之上微调少量额外的模型参数,也称为适配器。由于 GPU 不需要存储预训练基础模型的优化器状态和梯度,因此可以节省大量内存。适配器非常轻量级,便于共享、存储和加载。

本指南简要介绍了 PEFT 库以及如何将其与 Transformers 一起用于训练。有关更多详细信息,请参阅 PEFT 文档

使用以下命令安装 PEFT。

pip
source
pip install -U peft

PEFT 目前支持 Transformers 的 LoRA、IA3 和 AdaLoRA 方法。要使用其他 PEFT 方法(例如提示学习或提示调优),请直接使用 PEFT 库。

低秩适配 (LoRA) 是一种非常常见的 PEFT 方法,它将权重矩阵分解为两个较小的可训练矩阵。首先定义一个 LoraConfig 对象,参数如下所示。

from peft import LoraConfig, TaskType, get_peft_model
from transformers import AutoModelForCausalLM

# create LoRA configuration object
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM, # type of task to train on
    inference_mode=False, # set to False for training
    r=8, # dimension of the smaller matrices
    lora_alpha=32, # scaling factor
    lora_dropout=0.1 # dropout of LoRA layers
)

使用 add_adapter()LoraConfig 添加到模型中。现在模型已准备好传递给 Trainer 进行训练。

model.add_adapter(lora_config, adapter_name="lora_1")
trainer = Trainer(model=model, ...)
trainer.train()

要在附加了现有适配器的模型之上添加额外的可训练适配器,请在 modules_to_save() 中指定要训练的模块。

例如,要在附加了 LoRA 适配器的因果语言模型之上训练 lm_head 模块,请设置 modules_to_save=["lm_head"]。如下所示将适配器添加到模型中,然后将其传递给 Trainer

from transformers import AutoModelForCausalLM
from peft import LoraConfig

model = AutoModelForCausalLM.from_pretrained("google/gemma-2-2b")

lora_config = LoraConfig(
    target_modules=["q_proj", "k_proj"],
    modules_to_save=["lm_head"],
)

model.add_adapter(lora_config)
trainer = Trainer(model=model, ...)
trainer.train()

使用 save_pretrained() 保存您的适配器以重复使用。

加载适配器

要使用 Transformers 加载适配器,Hub 存储库或本地目录必须包含 adapter_config.json 文件和适配器权重。使用 from_pretrained()load_adapter() 加载适配器。

from_pretrained
load_adapter
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("klcsp/gemma7b-lora-alpaca-11-v1")

对于非常大的模型,加载模型的 8 位或 4 位精度量化版本有助于节省内存。Transformers 通过其 bitsandbytes 集成支持量化。在 BitsAndBytesConfig 中指定您要以 8 位还是 4 位精度加载模型。

对于多设备,添加 device_map="auto" 以自动在您的硬件上分配模型。

from transformers import AutoModelForCausalLM, BitsAndBytesConfig

model = AutoModelForCausalLM.from_pretrained(
    "klcsp/gemma7b-lora-alpaca-11-v1",
    quantization_config=BitsAndBytesConfig(load_in_8bit=True),
    device_map="auto",
)

设置适配器

add_adapter() 向模型添加新适配器。要添加第二个适配器,新适配器必须与第一个适配器类型相同。使用 adapter_name 参数为适配器分配名称。

model.add_adapter(lora_config, adapter_name="lora_2")

添加后,使用 set_adapter() 强制模型使用指定的适配器并禁用其他适配器。

model.set_adapter("lora_2")

启用和禁用适配器

enable_adapters() 是一个更广泛的函数,它启用附加到模型的所有适配器,而 disable_adapters() 禁用所有附加的适配器。

model.add_adapter(lora_1)
model.add_adapter(lora_2)
model.enable_adapters()

# disable all adapters
model.disable_adapters()
< > 在 GitHub 上更新