PEFT(参数高效微调)是一个库,用于高效地将大型预训练模型适配到各种下游应用,而无需微调模型的所有参数,因为这样做成本过高。PEFT 方法仅微调少量(额外)模型参数,同时产生与完全微调模型相当的性能。这使得在消费硬件上训练和存储大型语言模型 (LLM) 变得更加容易

PEFT 与 Transformers、Diffusers 和 Accelerate 库集成,提供更快、更简单的方法来加载、训练和使用大型模型进行推理

PEFT 库的使用方法可以概括为以下几个步骤:

安装 PEFT 库

PEFT 库可以通过 PyPI 安装,命令如下:

pip install peft

或者,如果需要从源码安装以获取最新功能,可以使用以下命令:

pip install git+https://github.com/huggingface/peft

对于想要贡献代码或查看实时结果的用户,可以从 GitHub 克隆仓库并安装可编辑版本:

git clone https://github.com/huggingface/peft
cd peft
pip install -e .

配置 PEFT 方法

每个 PEFT 方法由一个 PeftConfig 类定义,存储构建 PeftModel 的所有重要参数。以 LoRA 为例,需要指定任务类型、是否用于推理、低秩矩阵的维度等参数:

from peft import LoraConfig, TaskType
peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)

加载预训练模型并应用 PEFT

加载要微调的基础模型,并使用 get_peft_model() 函数包装基础模型和 peft_config 以创建 PeftModel

from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_model
model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/mt0-large")
model = get_peft_model(model, peft_config)

训练模型

现在可以用 Transformers 的 TrainerAccelerate,或任何自定义的 PyTorch 训练循环来训练模型。例如,使用 Trainer 类进行训练:

from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
    output_dir="your-name/bigscience/mt0-large-lora",
    learning_rate=1e-3,
    per_device_train_batch_size=32,
    num_train_epochs=2,
    weight_decay=0.01,
)
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
    tokenizer=tokenizer,
    data_collator=data_collator,
    compute_metrics=compute_metrics,
)
trainer.train()

保存和加载模型

模型训练完成后,可以使用 save_pretrained 函数将模型保存到目录中,或者使用 push_to_hub 函数将模型保存到 Hugging Face Hub:

model.save_pretrained("output_dir")
from huggingface_hub import notebook_login
notebook_login()
model.push_to_hub("your-name/bigscience/mt0-large-lora")

推理

使用 AutoPeftModel 类和 from_pretrained 方法轻松加载任何经过 PEFT 训练的推理模型:

from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
outputs = model.generate(input_ids=inputs["input_ids"], max_new_tokens=50)
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])