【Hugging Face】adapters 库:参数高效的微调(PEFT)方法库,专注于适配器(Adapters)技术

adapters 库是一个基于 Hugging Face 的 transformers 库的扩展工具,专注于参数高效的微调(Parameter-Efficient Fine-Tuning, PEFT)方法,特别适合适配器(Adapters)技术。它允许用户在冻结预训练模型参数的情况下,通过添加少量可训练层(适配器)来高效微调大型语言模型,适用于 NLP、跨语言迁移学习和多任务学习等场景。以下是关于 adapters 库的详细介绍和使用指南:


1. Adapters 库概述

  • 作用adapters 库通过在预训练 Transformer 模型的每一层中插入小型可训练模块(适配器),实现高效微调。这些适配器通常只占模型参数的很小一部分(例如 1MB/任务),性能却接近全模型微调。
  • 优势
    • 参数高效:相比全模型微调,适配器只需要更新少量参数,降低计算和存储需求。
    • 模块化:适配器是独立模块,支持任务间的组合、堆叠和迁移。
    • 兼容性:完全兼容 Hugging Face 的 transformers 库,支持多种模型架构(如 BERT、RoBERTa、T5、LLaMA 等)。
    • 易用性:只需少量代码即可集成和训练适配器。
  • 替代旧库adapters 库已取代旧的 adapter-transformers 库,但与旧版训练的适配器权重完全兼容。过渡指南见 AdapterHub 文档

2. 安装

安装 adapters 库需要先安装 PyTorch 和 transformers,然后通过 pip 安装:

pip install adapters
  • 要求:Python 3.9+,PyTorch 2.0+。
  • 验证安装:安装后可通过以下代码检查:
import adapters
print(adapters.__version__)

3. 核心功能与使用

以下是 adapters 库的主要功能和使用步骤:

3.1 加载预训练模型和适配器

使用 AutoAdapterModel 类加载预训练模型并添加适配器:

from adapters import AutoAdapterModel

# 加载预训练模型(例如 RoBERTa)
model = AutoAdapterModel.from_pretrained("FacebookAI/roberta-base")

# 加载预训练适配器(例如 IMDB 情感分析适配器)
adapter_name = model.load_adapter("AdapterHub/roberta-base-pf-imdb", source="hf")

# 激活适配器
model.active_adapters = adapter_name
  • 说明
    • source="hf" 表示从 Hugging Face Model Hub 加载适配器;source="ah" 表示从 AdapterHub 加载。
    • 可通过 list_adapters 查找可用适配器:
from adapters import list_adapters
adapter_infos = list_adapters(source="hf", model_name="FacebookAI/roberta-base")
for adapter in adapter_infos:
    print(adapter.adapter_id, adapter.model_name)
  • 查找适配器:在 Hugging Face Model Hub 上通过过滤器 library=adapters 或访问 AdapterHub 探索页面 查找适配器。
3.2 训练新适配器

训练适配器与使用 Hugging Face 的 Trainer 类似,只需少量修改:

from adapters import AutoAdapterModel

# 加载模型
model = AutoAdapterModel.from_pretrained("roberta-base")

# 添加新适配器(例如用于 SST-2 情感分析任务)
model.add_adapter("sst-2")

# 冻结预训练参数,仅训练 sst-2 适配器
model.train_adapter("sst-2")

# 添加分类头
model.add_classification_head("sst-2", num_labels=2)

# 设置活跃适配器
model.set_active_adapters("sst-2")

# 使用 Hugging Face Trainer 训练
from transformers import Trainer, TrainingArguments
trainer = Trainer(
    model=model,
    args=TrainingArguments(output_dir="./output", learning_rate=1e-4),
    train_dataset=your_dataset,
    eval_dataset=your_eval_dataset
)
trainer.train()

# 保存适配器
model.save_all_adapters("./output")
  • 训练技巧
    • 学习率:适配器权重随机初始化,建议使用较高学习率(如 1e-4)。
    • 训练时长:根据数据集大小,可能需要更多 epoch,建议每轮验证以避免过拟合。
    • 保存save_all_adapters 保存所有适配器权重,可上传至 AdapterHub。
3.3 分享适配器

训练好的适配器可上传至 Hugging Face Model Hub:

model.push_adapter_to_hub(
    "my-awesome-adapter",
    "sst-2",
    datasets_tag="sst-2"
)
  • 说明
    • datasets_tag 指定训练数据集,便于分类。
    • 上传后,适配器会自动在 AdapterHub.ml 上列出。
    • 需要设置 Hugging Face 访问令牌(通过 huggingface-cli login 配置)。
3.4 适配器组合与高级功能
  • 适配器堆叠(Stacking):支持多个适配器串联处理:
model.set_active_adapters(["adapter1", "adapter2"])
  • 适配器融合(AdapterFusion):组合多个预训练适配器的知识:
model.add_adapter_fusion(["adapter1", "adapter2"])
model.train_adapter_fusion(["adapter1", "adapter2"])
  • 量化训练:支持 Q-LoRA、Q-Bottleneck Adapters 等量化方法,降低内存占用。
  • 任务算术(Task Arithmetic):通过加权组合适配器实现任务迁移。

4. 支持的模型和方法

  • 支持的模型:包括 ALBERT、BART、BERT、DistilBERT、RoBERTa、T5、LLaMA、Mistral 等,详见 AdapterHub 模型概览
  • 适配器方法:支持多种 PEFT 方法,如:
    • Houlsby 适配器(2019)
    • Pfeiffer 适配器(2020)
    • LoRA(低秩适配)
    • Prefix Tuning
    • Q-LoRA(量化 LoRA)
    • 更多方法见 AdapterHub 文档

5. 与 PEFT 库的关系

Hugging Face 的 peft 库也支持适配器方法(如 LoRA、X-LoRA),但 adapters 库更专注于适配器模块的统一接口和模块化操作:

  • adapters:提供适配器堆叠、融合等高级功能,适合复杂任务组合和研究。
  • peft:更通用,覆盖 LoRA 等多种 PEFT 方法,适合快速部署。
    如果需要 LoRA,peft 可能是更轻量的选择;如果需要适配器组合或跨任务迁移,adapters 更合适。

6. 常见问题解答

  • 如何查找适配器?
    使用 list_adapters 或访问 Hugging Face Model HubAdapterHub
  • 适配器与全模型微调相比如何?
    适配器占用资源少(参数量仅为全模型的 1%~10%),性能接近,适合多任务场景。
  • 如何贡献适配器?
    参考 AdapterHub 贡献指南,可添加新适配器方法或模型支持。

7. 资源与进一步学习

### Peft LoRA 微调实现与使用 参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)是一种通过仅更新模型的一小部分参数来减少计算资源消耗的技术。LoRA(Low-Rank Adaptation)是其中一种具体的方法,它通过引入低秩分解矩阵的方式,在保持原始模型权重不变的情况下完成特定任务的学习。 #### LoRA 的基本原理 LoRA 方法的核心思想是在预训练模型的基础上增加两个可学习的小型矩阵 \(A\) 和 \(B\),使得它们的乘积近似于全连接层中的权重量化变化[^1]。这种设计可以显著降低需要优化的参数数量,从而提高效率并节省内存开销。 对于每一层的线性变换操作 \(W \in R^{d_{out} \times d_{in}}\), 使用如下公式表示调整后的权重: \[ W' = W + BA^\top \] 这里, - \( B \in R^{r \times d_{out}}, A \in R^{r \times d_{in}} \),\( r << min(d_{in}, d_{out}) \) 这种方法允许我们专注于少量新增加的自由度上进行梯度下降迭代过程而不是整个网络结构本身所有的参数集合。 #### 实现细节 为了便于开发者快速应用该技术到自己的项目当中去,Hugging Face 提供了一个名为 `peft` 专门用于支持多种类型的PEFT策略其中包括但不限于Adapters,Lora等等[^2]. 以下是基于HuggingFace Transformers以及其扩展包`transformers-peft`,利用Python脚本展示如何加载一个基础的大规模语言模型并通过LoRA对其进行自定义监督式精炼的一个简单例子: ```python from transformers import AutoModelForCausalLM, AutoTokenizer import torch from peft import get_peft_config, LoraConfig, TaskType, get_peft_model, prepare_model_for_int8_training model_name_or_path = "bigscience/bloomz-7b1" tokenizer_name_or_path = model_name_or_path device = "cuda" tokenizer = AutoTokenizer.from_pretrained(tokenizer_name_or_path) model = AutoModelForCausalLM.from_pretrained(model_name_or_path, load_in_8bit=True, device_map={"":0}) # Prepare the int8 model before we convert it to float16 or bfloat16 as recommended in https://huggingface.co/docs/transformers/main/en/performance#memory-efficient-training-with-bitsandbytes. model = prepare_model_for_int8_training(model) lora_r = 8 lora_alpha = 16 lora_dropout = 0.05 target_modules = ["q_proj", "v_proj"] peft_config = LoraConfig( task_type=TaskType.CAUSAL_LM, inference_mode=False, r=lora_r, lora_alpha=lora_alpha, lora_dropout=lora_dropout, target_modules=target_modules ) model = get_peft_model(model, peft_config) print(model.print_trainable_parameters()) ``` 上述代码片段展示了怎样配置LORA超参并将这些设置应用于选定的目标模块列表内;最后打印出哪些部分是可以被训练出来的状态信息以便确认我们的改动生效与否。 #### 训练流程概览 当准备好数据集之后就可以按照常规方式构建Dataset对象传入DataLoader实例中配合PyTorch Trainer API或者其他框架来进行端到端训练了。值得注意的是由于采用了混合精度模式所以还需要额外指定合适的Scaler等相关组件确保数值稳定性的同时加速收敛速度。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值