安装环境

首先,还是需要先安装,目前只支持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()

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐