PEFT
训练与微调

PEFT

PEFT (Parameter-Efficient Fine-Tuning) 是 Hugging Face 提供的一个库,旨在通过多种参数高效的微调技术,帮助开发者以低成本的方式将预训练好的大型语言模型适配到各种下游任务中,显著降低计算和存储需求。

快点收藏起来

什么是 PEFT

PEFT,全称为 Parameter-Efficient Fine-Tuning(参数高效微调),是由 Hugging Face 开发的一个开源库。其核心目标是帮助开发者以更高效的方式将预训练好的大型语言模型(Large Language Models, LLMs)适配到各种下游任务中。传统的微调方法通常需要更新模型的所有参数,这对于拥有数十亿甚至数千亿参数的大型模型来说,计算成本和存储需求都非常高昂。PEFT 通过引入多种参数高效的微调技术,仅需训练少量额外的模型参数(通常被称为适配器),就能达到与全参数微调相媲美的性能,从而显著降低了计算资源和时间成本。

peft

PEFT 的功能

PEFT 库提供了一系列先进的参数高效微调技术,主要包括:

  • 低秩自适应 (LoRA): LoRA 是一种非常流行的 PEFT 方法,它通过将原始模型中的权重矩阵分解为两个较小的可训练矩阵(低秩矩阵)来实现参数的高效调整。在微调过程中,只有这两个小矩阵的参数会被更新,而原始模型的绝大部分参数保持不变。
  • 提示工程 (Prompt Engineering): PEFT 支持多种基于提示的学习方法,例如提示调优(Prompt Tuning)和前缀调优(Prefix Tuning)。这些方法通过在输入文本前添加可学习的“提示”或“前缀”来引导模型完成特定任务,而无需修改原始模型的参数。
  • 适配器融合 (Adapter Fusion): 这种技术允许将多个针对不同任务训练的 PEFT 适配器合并到同一个模型中,从而实现模型的多任务能力。
  • IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations): IA3 是一种通过缩放模型内部激活来实现高效微调的方法,它只引入了极少量的可训练参数。
  • AdaLoRA (Adaptive Low-Rank Adaptation): AdaLoRA 是 LoRA 的改进版本,它能够根据参数的重要性动态地分配秩,从而进一步提高微调效率和性能。
  • 多适配器支持: PEFT 允许在一个预训练模型上添加和管理多个不同类型的适配器,方便进行实验和多任务学习。
  • 与 Hugging Face 生态系统的无缝集成: PEFT 库与 Hugging Face 的 Transformers 库、Datasets 库和 Accelerate 库等其他工具高度集成,使得用户可以轻松地在 Hugging Face 的模型仓库中选择预训练模型,并使用 PEFT 进行高效微调。
  • 易于存储和分享: 由于 PEFT 方法只训练了少量的额外参数,因此微调后的适配器非常轻量级,易于存储、分享和加载。这为模型的协作和部署带来了便利。
  • 支持模型量化: PEFT 可以与 Transformers 库的 bitsandbytes 集成,支持加载 8 位或 4 位量化模型,以进一步减少内存使用。

如何使用/快速开始

要开始使用 PEFT 库,您可以按照以下步骤进行操作:

  1. 安装 PEFT 库: 如果您尚未安装 PEFT 库,可以使用 pip 进行安装:
    pip install peft

    您可能还需要安装 Hugging Face 的 Transformers 库:

    pip install transformers
  2. 加载预训练模型和分词器: 使用 Transformers 库加载您想要微调的预训练模型和对应的分词器。例如:
    from transformers import AutoModelForSequenceClassification, AutoTokenizer
     model_name_or_path = "bert-base-uncased"
     model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path)
     tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
  3. 配置 PEFT 方法: 选择您想要使用的 PEFT 技术(例如 LoRA)并进行相应的配置。这通常涉及到创建一个配置对象,指定适配器的参数。例如,配置 LoRA:
    from peft import LoraConfig, get_peft_model
     lora_config = LoraConfig(
         r=8,  # LoRA 秩
         lora_alpha=32,  # LoRA alpha 参数
         lora_dropout=0.1,  # Dropout 概率
         bias="none",
         task_type="SEQ_CLS"  # 任务类型,例如序列分类
     )
     model = get_peft_model(model, lora_config)
  4. 准备数据集: 使用 Hugging Face 的 Datasets 库加载或准备您的训练数据集。
  5. 定义训练参数: 使用 Transformers 库的 TrainingArguments 定义训练参数,例如学习率、训练轮数、批大小等。
  6. 创建训练器: 使用 Transformers 库的 Trainer 类,传入模型、数据集、训练参数和分词器等。
  7. 开始训练: 调用 trainer.train() 方法开始微调过程。
  8. 保存和加载适配器: 微调完成后,您可以保存适配器权重:
    trainer.save_model("path/to/save/adapter")

    之后可以使用 PeftModel.from_pretrained() 方法加载适配器到原始模型上。

通过以上步骤,您就可以使用 PEFT 库高效地微调大型语言模型,以适应您的特定任务需求。PEFT 的易用性和高效性使其成为在资源受限的情况下进行 LLM 定制化的理想选择。

相关导航