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")
- 训练技巧:
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"])
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 Hub 和 AdapterHub。 - 适配器与全模型微调相比如何?
适配器占用资源少(参数量仅为全模型的 1%~10%),性能接近,适合多任务场景。 - 如何贡献适配器?
参考 AdapterHub 贡献指南,可添加新适配器方法或模型支持。
7. 资源与进一步学习
- 官方文档:
- 论文引用:
- 社区:加入 Hugging Face 社区(hf.co/join)或 AdapterHub 论坛,获取支持。