加载预训练适配器

查找预训练适配器

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为此提供了三种方法,其使用方式与单个适配器的方法非常相似:

例如,以下是如何保存和加载包含三个适配器和预测头的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)