安装环境
首先,还是需要先安装,目前只支持python3.8及以上和pytorch1.12.1及以上的编译环境。
亲测,python3.7确实会导致环境不兼容用不了。还是按照官方文档来吧。以下是官方的安装方法:
pip install -U adapter-transformers
或者获取源码安装:
git clone https://github.com/adapter-hub/adapter-transformers.git
cd adapter-transformers
pip install .
使用教程
官方也有给怎么使用提供的adapter的教程,但是如果想要嵌入自己的代码中还是会有些迷糊。
下面给大家说一下自己要用的话怎么去加入自己的代码中,其实很简单,代码不需要做太多修改。
比如我原来的代码是这样的,其他的就省略了:
encoder = AutoModel.from_pretrained(args.bert_name)
classify = Classify(args.hidden_size, 1)
encoder_optimizer = AdamW(params=encoder.parameters(),
lr = args.learning_rate_bert, # args.learning_rate - default is 5e-5
eps = 1e-8, # args.adam_epsilon - default is 1e-8.
correct_bias = False
)
只需要加两行就搞定了,rotten_tomatoes是adapter的名字,也可以换成其他的。
encoder = AutoModel.from_pretrained(args.bert_name)
# Add a new adapter
encoder.add_adapter("rotten_tomatoes")
# Activate the adapter
encoder.train_adapter("rotten_tomatoes")
classify = Classify(args.hidden_size, 1)
encoder_optimizer = AdamW(params=encoder.parameters(),
lr = args.learning_rate_bert, # args.learning_rate - default is 5e-5
eps = 1e-8, # args.adam_epsilon - default is 1e-8.
correct_bias = False
)
有一些小伙伴可能会疑惑,那训练参数可以直接放进去整一个吗?
答案是可以的,因为用adapter的时候就已经将其他参数冻结了。
看源码,调用train_adapter()的时候会调用freeze_model(),这一步将所有的参数的requires_grad 都设置为False了。
然后后面又会把adapter部分的解冻,param.requires_grad = True。因此,使用的时候可以放心直接用就好了,不用考虑自己去冻结参数。
def freeze_model(self, freeze=True):
"""Freezes all weights of the model."""
# first freeze/ unfreeze all model weights
for param in self.base_model.parameters():
param.requires_grad = not freeze
self.model_frozen = freeze
def train_adapter(self, adapter_setup: Union[list, AdapterCompositionBlock], train_embeddings=False):
"""Sets the model into mode for training the given adapters."""
self.train()
self.freeze_model(True)
adapter_setup = parse_composition(adapter_setup)
self.apply_to_adapter_layers(lambda i, layer: layer.enable_adapters(adapter_setup, True, False))
for adapter_name in adapter_setup:
if adapter_name in self.base_model.shared_parameters:
for param in self.base_model.shared_parameters[adapter_name].values():
param.requires_grad = True
if isinstance(self, InvertibleAdaptersMixin) or isinstance(self, InvertibleAdaptersWrapperMixin):
self.enable_invertible_adapters(adapter_setup.flatten())
# use the adapters to be trained by default in every forward pass
self.set_active_adapters(adapter_setup)
if train_embeddings:
self.get_input_embeddings().train()