加载预训练适配器
查找预训练适配器
AdapterHub.ml 提供了一个中央仓库,汇集了所有通过Hugging Face的Model Hub上传的预训练适配器。 您可以轻松找到适合您感兴趣任务的预训练适配器,以及所有相关信息和代码片段来快速上手。
注意
原始的Hub仓库(通过source="ah")已归档并迁移至HuggingFace模型中心。当尝试从原始Hub仓库加载适配器时,Adapters库支持自动重定向到HF模型中心。
或者,list_adapters() 提供了一种编程方式来访问所有可用的预训练适配器。
这将为每个检索到的适配器返回一个AdapterInfo对象。
例如,我们可以使用它来检索为特定模型训练的所有适配器的信息:
from adapters import list_adapters
adapter_infos = list_adapters(model_name="bert-base-uncased")
for adapter_info in adapter_infos:
print("Id:", adapter_info.adapter_id)
print("Model name:", adapter_info.model_name)
print("Uploaded by:", adapter_info.username)
如果已知适配器ID,也可以通过get_adapter_info()获取单个适配器的信息:
adapter_info = get_adapter_info("AdapterHub/roberta-base-pf-imdb")
print("Id:", adapter_info.adapter_id)
print("Model name:", adapter_info.model_name)
print("Uploaded by:", adapter_info.username)
在代码中使用预训练适配器
假设我们已经从Hugging Face加载了一个预训练的transformer模型,例如BERT,并已将其初始化以便添加适配器:
from transformers import BertModel
import adapters
model = BertModel.from_pretrained('bert-base-uncased')
adapters.init(model)
现在我们可以轻松地通过标识符从Adapter Hub加载预训练的适配器模块,使用load_adapter()方法:
adapter_name = model.load_adapter('sst-2')
在最简单的情况下,这就是我们需要指定的全部内容,用于加载一个预训练的情感分析任务适配器,该适配器使用BERT基础模型和适当的适配器配置在sst-2数据集上进行训练。
适配器的名称由load_adapter()返回,因此我们可以在下一步激活它:
model.set_active_adapters(adapter_name)
作为第二个示例,我们来看看如何基于上方的list_adapters()方法返回的AdapterInfo加载适配器:
from adapters import AutoAdapterModel, list_adapters
adapter_infos = list_adapters()
# Take the first adapter info as an example
adapter_info = adapter_infos[0]
model = AutoAdapterModel.from_pretrained(adapter_info.model_name)
model.load_adapter(adapter_info.adapter_id)
load_adapter()的高级用法
为了更详细地了解底层发生了什么,我们首先将所有相关参数明确列出,写出完整的方法调用:
model.load_adapter(
"AdapterHub/roberta-base-pf-imdb",
version="main",
load_as="sentiment_adapter",
set_active=True,
)
我们将逐一介绍不同的参数及其含义:
传递给该方法的第一个参数指定了加载适配器的名称或路径。这可以是HuggingFace模型中心上的仓库名称、本地路径或URL。要查看Hub上所有可用适配器的概览,请参考Adapter-Hub网站。
同一个适配器可能有多个版本作为修订版存在于模型库仓库中。要加载特定修订版,请使用
version参数。默认情况下,
load_adapter()方法会使用第一个参数给定的标识符字符串来添加加载的适配器。要使用自定义名称加载适配器,我们可以使用load_as参数。最后,
set_active会直接激活已加载的适配器,用于每个模型的前向传递。否则,您需要通过set_active_adapters()手动激活适配器。
保存和加载适配器组合
除了保存和加载单个适配器外,您还可以通过一行代码保存、加载和共享完整的适配器组合。 Adapters为此提供了三种方法,其使用方式与单个适配器的方法非常相似:
save_adapter_setup()将适配器组合及预测头保存至本地文件系统。load_adapter_setup()用于从本地文件系统或模型中心加载保存的适配器组合配置。push_adapter_setup_to_hub()用于将适配器设置及预测头文件上传至模型中心。详情请参阅我们的Hugging Face模型中心指南。
例如,以下是如何保存和加载包含三个适配器和预测头的AdapterFusion配置:
# Create an AdapterFusion
model = AutoAdapterModel.from_pretrained("bert-base-uncased")
model.load_adapter("sentiment/sst-2@ukp", config=SeqBnConfig(), with_head=False)
model.load_adapter("nli/multinli@ukp", config=SeqBnConfig(), with_head=False)
model.load_adapter("sts/qqp@ukp", config=SeqBnConfig(), with_head=False)
model.add_adapter_fusion(["sst-2", "mnli", "qqp"])
model.add_classification_head("clf_head")
adapter_setup = Fuse("sst-2", "mnli", "qqp")
head_setup = "clf_head"
model.set_active_adapters(adapter_setup)
model.active_head = head_setup
# Train AdapterFusion ...
# Save
model.save_adapter_setup("checkpoint", adapter_setup, head_setup=head_setup)
# Push to Hub
model.push_adapter_setup_to_hub("<user>/fusion_setup", adapter_setup, head_setup=head_setup)
# Re-load
# model.load_adapter_setup("checkpoint", set_active=True)